LiaPengembang

Referensi server

Lia memberi tahu server Anda ketika pembayaran atau pengembalian dana dibayarkan dan hadiah dibayarkan, ditandatangani dengan rahasia webhook Anda. Apa yang dikirim, bagaimana memeriksa tanda tangan, dan bagaimana pengulangan bekerja.

#Membuat pengaturan

Berikan tim Lia alamat https di server Anda, dan pertahankan rahasia penandatanganan webhook (whsec_…) yang datang bersama kunci Anda. Lia kemudian mengirimkan POST ada saat sesuatu terjadi di aplikasi Anda.

Sebuah webhook adalah sebuah dorongan, bukan kebenaran: periksa API sebelum bertindak (untuk sebuah charge, GET /charges/:id). Dan tidak'tidak mengandalkan webhooks saja; halaman Anda juga dapat memberi tahu server Anda (lihat Jual item).

#Apa'telah dikirim

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
  }
}
BidangJenis
typestringApa yang terjadi (di bawah).
appstringID aplikasi Anda.
atnomorKetika dikirim, dalam milidetik sejak 1970.
dataobjekApa itu's tentang.

#Jenis

JenisKapandata
charge.paidSeseorang membayar di Lia'lembar gaji, dalam uji coba atau live.The biaya, dengan status: "paid"
charge.refundedAnda mengembalikan pembayaran.Biaya, dengan status: "refunded"
reward.paidAnda membayar hadiah dari kolam Anda, dalam mode uji atau live.{ key, playerId, amount, reason, mode }

Periksa data.mode (atau biaya's mode) sehingga peristiwa uji coba tidak pernah memberikan apa pun yang nyata. Tipe lain mungkin ditambahkan: abaikan tipe yang tidak Anda'tidak tahu dan menjawab 200.

#Memeriksa tanda tangan

Setiap webhook memiliki Lia-Signature header, t=<seconds>,v1=<signature>. Tanda tangan adalah HMAC SHA-256, dalam heksa, dari detik, titik, dan tubuh mentah, dienkripsi dengan seluruh rahasia webhook Anda (termasuk whsec_):

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

Periksa dengan tubuh mentah seperti yang diterima, sebelum mem-parsingnya, dan tolak webhook yang lebih tua beberapa menit.

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

Menangani webhooks memiliki handler lengkap.

#Jawaban dan ulang

  • Jawab dengan apa saja 2xx status, dengan cepat. Lakukan pekerjaan yang lambat setelah menjawab.
  • Jika server Anda tidak't menjawab 2xx (atau bisa't dapat dijangkau), Lia mencoba sekali lagi langsung. Setelah itu, webhook-nya tidak'tidak dikirim ulang.
  • Jadi webhook bisa terlewat, dan bisa datang dua kali. Buat handler Anda aman untuk dijalankan dua kali (kunci berdasarkan id pembayaran atau kunci hadiah), dan memiliki cara lain untuk mengejar, seperti Lia.charges() ketika pemain membuka aplikasi Anda.

#Rahasia Anda

Rahasia webhook Anda berubah setiap kali kunci Anda dibuat ulang. Simpan di server Anda, di samping kunci Anda.

Diterjemahkan otomatis. Bahasa Inggris adalah sumber kebenaran. Baca dalam Bahasa Inggris

Ketik untuk mencari setiap halaman, metode, dan titik akhir.