Mga Gabay
Pamahalaan ang mga webhook
Kopya ang pahina
Isang kumpleto na webhook handler. Suriin ang signature sa raw body, suriin sa API, gumawa ng isang beses, at magbigay ng mabilis.
Lia ay nagpapadala charge.paid, charge.refunded at reward.paid sa iyong webhook address, na nakasiguro ng iyong webhook secret. Tingnan ang Webhooks para sa bawat field.
#Node.js kasama ang Express
Basahin ang katawan nang walang pagproseso: ang signature ay nasa eksaktong mga byte na Lia ang nagsugo, kaya suriin ito bago anumang JSON pagproseso.
import express from "express";
import { createHmac, timingSafeEqual } from "node:crypto";
import { lia } from "./lia.js";
const app = express();
function verified(rawBody, header, secret) {
const parts = Object.fromEntries((header ?? "").split(",").map((part) => part.split("=")));
const t = Number(parts.t);
if (!t || !parts.v1 || Math.abs(Date.now() / 1000 - t) > 300) 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);
}
app.post("/lia/webhook", express.raw({ type: "application/json" }), async (req, res) => {
const event = verified(req.body.toString("utf8"), req.get("Lia-Signature"), process.env.LIA_WEBHOOK_SECRET);
if (!event) return res.status(400).end();
// Answer first; do the work after.
res.status(200).end();
if (event.type === "charge.paid") {
// A nudge: check with Lia, then grant once per charge.
const { charge } = await lia("GET", `/charges/${event.data.id}`);
if (charge.status !== "paid") return;
await db.grantOnce(charge.id, charge.playerId, () => grant(charge.playerId, charge.productId));
await lia("POST", `/charges/${charge.id}/deliver`);
}
if (event.type === "charge.refunded") {
await db.takeBack(event.data.id); // if you'd already given it
}
if (event.type === "reward.paid") {
await db.noteReward(event.data.key, event.data.playerId, event.data.amount);
}
});#Cloudflare Workers
async function verified(request, secret) {
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) > 300) 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;
}
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
if (request.method === "POST" && url.pathname === "/lia/webhook") {
const event = await verified(request, env.LIA_WEBHOOK_SECRET);
if (!event) return new Response(null, { status: 400 });
ctx.waitUntil(handle(event, env)); // the work, after answering
return new Response(null, { status: 200 });
}
return new Response("Not found", { status: 404 });
},
};#Mga Patakaran ng Kaisipan
- Suriin ang signature, pagkatapos ay suriin sa API. Ang isang webhook ay nagsasabi na nangyari ang isang bagay;
GET /charges/:idsabi kung ano'totoo na ngayon. - Gawin ito nang isa. Maaaring dumating ang mga webhook dalawa, at ang iyong pahina ay maaaring naihatid na. I-identify kung ano ang gagawin mo sa charge id o sa reward key.
- Sagot
2xxmabilis. Lia ay nagtatry ng isang webhook dalawang beses, agad, at pagkatapos ay huminto. Gawin ang mabagal na trabaho pagkatapos sumagot. - Di'hindi maaabot batay lamang sa webhooks. Pumasa sa
Lia.charges()kapag ang manlalaro ay buksan ang iyong app, kaya ang isang missing webhook ay hindi mawala ang isang benta. - Tingnan ang mode. Ang mga pagsusulit na event ay dumating sa parehong address: tingnan
data.mode. - Ignore ang mga type na ikaw ay hindi'hindi alam, at patuloy na sumagot
200.
#Pagsusulit ng iyong handler
Gumawa ng isang pagsubok na pagbili bilang isang tester (tingnan) Pagsusulit): nagpapadala ito ng isang tunay, na nakasiguro charge.paid kasama mode: "test". Para subukan ito sa iyong kompyuter, ilagay ang iyong lokal na server sa isang https tunnel at humingi ang Lia team na i-point ang iyong webhook address doon.
Awtomatikong isinalin. Ang English ay ang source of truth. Basahin sa Ingles