مرجع الخادم
الويب هوكس
نسخ الصفحة
يُخبر Lia خادمك عندما يتم دفع أو استرداد الرسوم، وعندما يتم دفع المكافأة، مُوقَّعًا بسر مُعدَّل الويب الخاص بك. ما يتم إرساله، وكيفية التحقق من التوقيع، وكيف تعمل إعادة المحاولة.
#إعداد واحد
أعطِ فريق Lia عنوان https على خادمك، واحتفظ بسر التوقيع على الويب (whsec_…) التي جاءت مع مفاتيحك. ثم يرسل Lia POST هم
الويب هوك هو تحفيز, لا الحقيقة: تحقق من API قبل اتخاذ إجراء (لشحنة، GET /charges/:id). ولا'لا تعتمد فقط على الـ webhooks؛ يمكن لصفحتك أيضًا إخبار خادمك (انظر بيع عنصر).
#ماذا'تم الإرسال
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
}
}| حقل | النوع | |
|---|---|---|
type | سلسلة | ما حدث (أدنى). |
app | سلسلة | معرّف تطبيقك. |
at | عدد | عندما تم الإرسال، بالمللي ثانية منذ 1970. |
data | كائن | ماذا هو'س عن. |
#الأنواع
| النوع | متى | data |
|---|---|---|
charge.paid | شخص دفع على Lia'ورقة الدفع الخاصة به، في الاختبار أو في الحياة الواقعية. | ال الرسوم, مع status: "paid" |
charge.refunded | لقد قمت بإلغاء الدفع. | الرسوم، مع status: "refunded" |
reward.paid | لقد دفعت مكافأة من مجموعتك، في الاختبار أو في الحياة. | { key, playerId, amount, reason, mode } |
تحقق data.mode أو الرسومات's mode) حتى لا تمنح الأحداث في الاختبار أي شيء حقيقي. قد تُضاف أنواع أخرى: تجاهل الأنواع التي لم'لأنك تعرف فشلها مع 200.
#التحقق من التوقيع
كل ويب هوك له Lia-Signature الرأسية، t=<seconds>,v1=<signature>. التوقيع هو HMAC SHA-256, بالشكل السداسي، لثوانٍ، نقطة، والجسم الأصلي، مُعرَّف بسر الويب الكامل الخاص بك (بما في ذلك whsec_):
v1 = hex(HMAC_SHA256(key = "whsec_…", message = t + "." + rawBody))تحقق منه ضد الجسم الأصلي تمامًا كما وصل، قبل معالجته، ورفض الـ webhooks التي تزيد عن بضع دقائق.
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;
}معالجة الـ webhooks يملك معالجًا كاملًا.
#الإجابات والمحاولات المُعادية
- أجب بأي
2xxالحالة، بسرعة. قم بالعمل البطيء بعد الإجابة. - إذا كان خادمك لا'ت الإجابة
2xxأو يمكن'ت الوصول إليها)، يحاول Lia مرة أخرى فورًا. وبعد ذلك، لا يزال ويب هوك لا'لقد أُرسل مجددًا. - لذلك يمكن تفويت الـ webhooks، ويمكن أن تصل مرتين. اجعل معالجك آمنًا للتشغيل مرتين (استخدم معرّف الدفع أو مفتاح المكافأة)، واحصل على طريقة أخرى للتعويض، مثل
Lia.charges()عندما يفتح اللاعب تطبيقك.
#سرك
يتغير سر عميلك كلما تم إنشاء المفاتيح مرة أخرى. احتفظ به على خادمك بجانب مفتاحك.
تم الترجمة تلقائيًا. الإنجليزية هي مصدر الحقيقة. اقرأ باللغة الإنجليزية