Liaالمطورون

مرجع الخادم

يُخبر 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 التي تزيد عن بضع دقائق.

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;
}

معالجة الـ webhooks يملك معالجًا كاملًا.

#الإجابات والمحاولات المُعادية

  • أجب بأي 2xx الحالة، بسرعة. قم بالعمل البطيء بعد الإجابة.
  • إذا كان خادمك لا'ت الإجابة 2xx أو يمكن'ت الوصول إليها)، يحاول Lia مرة أخرى فورًا. وبعد ذلك، لا يزال ويب هوك لا'لقد أُرسل مجددًا.
  • لذلك يمكن تفويت الـ webhooks، ويمكن أن تصل مرتين. اجعل معالجك آمنًا للتشغيل مرتين (استخدم معرّف الدفع أو مفتاح المكافأة)، واحصل على طريقة أخرى للتعويض، مثل Lia.charges() عندما يفتح اللاعب تطبيقك.

#سرك

يتغير سر عميلك كلما تم إنشاء المفاتيح مرة أخرى. احتفظ به على خادمك بجانب مفتاحك.

تم الترجمة تلقائيًا. الإنجليزية هي مصدر الحقيقة. اقرأ باللغة الإنجليزية

اكتب للبحث في كل صفحة، وطريقة ونقطة نهاية.