Sunucu referansı
Webhook'lar
Sayfayı kopyala
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
}
}| Alan | Tür | |
|---|---|---|
type | dize | Aşağıda ne oldu. |
app | dize | Uygulamanızın kimliği. |
at | sayı | Ne zaman gönderildi, 1970.'dan itibaren milisaniye cinsinden. |
data | nesne | O's hakkında. |
#Türler
| Tür | Zaman | data |
|---|---|---|
charge.paid | Bir kişi Lia üzerinde ödedi'ödeme sayfası, test veya canlı ortamda. | The yük, ile status: "paid" |
charge.refunded | Bir ücret iadesi yaptınız. | Yükleme, ile status: "refunded" |
reward.paid | Test 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.
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);
}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
2xxdurum, 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