LiaGeliştiriciler

Sunucu referansı

Lia bir ödeme ödenir veya iade edilir ve bir ödül ödenirken sunucunuza bildirir, webhook gizli anahtarınızla imzalanır. Ne gönderildi, imzayı nasıl kontrol edeceğinizi ve yeniden denemelerin nasıl çalıştığını öğrenin.

#Bir tane kurma

Lia ekibine sunucunuzda bir https adresi verin ve webhook imza sırrını koruyun (whsec_…) ile birlikte gelen anahtarlarla. Lia daha sonra bir POST uygulamanızda bir şey olduğunda orada olur.

Bir webhook bir itici, gerçek değil: bir ödeme için (örneğin, bir ödeme), API'a göre kontrol edin (bir ödeme için) GET /charges/:id). Ve donmaz'sadece webhooklara güvenmeyin; sayfanız aynı zamanda sunucunuza bildirimde bulunabilir (bkz. Bir eşya sat).

#Ne'gönderildi

POST /lia/webhook
Content-Type: application/json
Lia-Signature: t=1761998400,v1=5f2c8a…

{
  "type": "charge.paid",
  "app": "your-app",
  "at": 1761998400123,
  "data": {
    "id": "ch_9b1f4c2e7a0d5b8f3e6a1c4d",
    "playerId": "p_3f9c0a6d1b2e4f5a6b7c",
    "productId": "extra-lives",
    "amount": 5,
    "status": "paid",
    "mode": "live",
    "createdAt": 1761998400000,
    "deliveredAt": null,
    "refundedAt": null
  }
}
AlanTür
typedizeAşağıda ne oldu.
appdizeUygulamanızın kimliği.
atsayıNe zaman gönderildi, 1970.'dan itibaren milisaniye cinsinden.
datanesneO's hakkında.

#Türler

TürZamandata
charge.paidBir kişi Lia üzerinde ödedi'ödeme sayfası, test veya canlı ortamda.The yük, ile status: "paid"
charge.refundedBir ücret iadesi yaptınız.Yükleme, ile status: "refunded"
reward.paidTest veya canlıda, havuzunuzdan bir ödüllü ödediniz.{ key, playerId, amount, reason, mode }

Kontrol data.mode (veya ücret's mode) çünkü test olayları hiçbir şey vermez. Daha fazla tür eklenebilir: bilinmeyen türleri görmezden gelin'bilmek ve cevap vermek 200.

#İmza kontrolü

Her webkokenin bir Lia-Signature başlık, t=<seconds>,v1=<signature>. İmza, saniyeler, bir nokta ve ham vücut, anahtarınızın tüm webhook gizli anahtarıyla (dahil edilerek) hex olarak HMAC SHA-256, şeklindedir. whsec_):

v1 = hex(HMAC_SHA256(key = "whsec_…", message = t + "." + rawBody))

Gelişmiş ham gövdesini, ayrıştırılmadan önce tam olarak kontrol edin ve birkaç dakikadan fazla yaşlı webhokları reddedin.

Node.js
import { createHmac, timingSafeEqual } from "node:crypto";

export function liaWebhook(rawBody, header, secret, toleranceSeconds = 300) {
  const parts = Object.fromEntries((header ?? "").split(",").map((part) => part.split("=")));
  const t = Number(parts.t);
  if (!t || !parts.v1) return null;
  if (Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return null;
  const expected = Buffer.from(createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex"));
  const given = Buffer.from(parts.v1);
  if (expected.length !== given.length || !timingSafeEqual(expected, given)) return null;
  return JSON.parse(rawBody);
}
Cloudflare Workers, Deno, Bun
export async function liaWebhook(request, secret, toleranceSeconds = 300) {
  const rawBody = await request.text();
  const parts = Object.fromEntries((request.headers.get("Lia-Signature") ?? "").split(",").map((part) => part.split("=")));
  const t = Number(parts.t);
  if (!t || !parts.v1 || Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return null;
  const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["verify"]);
  const signature = new Uint8Array(parts.v1.match(/../g).map((byte) => parseInt(byte, 16)));
  const ok = await crypto.subtle.verify("HMAC", key, signature, new TextEncoder().encode(`${t}.${rawBody}`));
  return ok ? JSON.parse(rawBody) : null;
}

Webhookları işle tam bir işleyiciye sahiptir.

#Cevaplamak ve yeniden denemek

  • Herhangi bir 2xx durum, hızlıca. Cevapladıktan sonra yavaş işler yap.
  • İkinci arasında sunucunuz çökerse, ücret kalır't cevap 2xx (veya can't erişilebilir olursa, Lia hemen tekrar deneyecek. Bundan sonra webhook Lia olmayacak.'tekrar gönderildi.
  • Webhook'lar kaçırılabilir ve iki kez ulaşabilir. İşleyicinizi iki kez çalıştırılabilir şekilde yapın (şarj kimliği veya ödül anahtarına göre anahtarlayın), ve başka bir şekilde kalmak için bir yol bulun, örneğin Lia.charges() oyuncu uygulamanızı açtığında.

#Sizin sırrınız

Webhook sırrınız, anahtarlarınız yeniden oluşturulduğunda değişir. Onu sunucunuzda, anahtarınızın yanında tutun.

Otomatik çeviri. İngilizce, doğru kaynaktır. İngilizce olarak oku

Her sayfa, yöntem ve uç noktayı aramak için yazın.