Makadirio
Kusikiliza webhooks
Kutuma mstereani
Mkakati wa kifungu kamilifu. Tathmini kichaguzi kwenye mizani ya kawaida, tathmini kwa API, uendeleze moja, na jibu kwa kasi.
Lia inatuma charge.paid, charge.refunded na reward.paid kwa anwani yako ya webhook, inayolingana na siri yako ya webhook. Tazama Webhooks kwa kila mada.
#Node.js na Express
Kusoma kwa kina ya kawaida: signature inaendelea kwenye bytes Lia zilizopita, hivyo tafuta kwa kawaida kabla ya kushughulikia JSON.
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 Wafanyikaji
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 });
},
};#Makosa ya kawaida
- Tafuta kichaguzi, kisha tafuta kwa API. Kumbukumbu inaonyeshwa kama alikuwa kimefanyika;
GET /charges/:idinasema kama'sio sasa. - Ufanyike kwa muda mmoja. Webhooks zinaweza kuzaliwa mara mbili, na mizani yako zinaweza kuzalisha kama kawaida. Kumbuka nini unafanyia kwenye charge id au reward key.
- Jibu
2xxkwa kasi. Lia inachukua webhook kwa muda mmoja, kisha inavyokata. Kufanya kazi ya kisasa baada ya kujibu. - Sio'kukutana na webhooks tu. Kufuata
Lia.charges()wakati mshirika akifungua app yako, kwa hiyo webhook ilikuwa si inaonekana kwa mshirika. - Tazama kwa njia. Matokeo ya ukumbusho yamepita kwenye mstari mmoja: angalia
data.mode. - Kumbuka mifumo ambayo si't kujua, na hujibu
200.
#Kuzigira mgonjwa wako
Fanya mali ya kujifunza kama mifunzo (tazama Kuzigira): inatuma kificho kikamilifu, kikamilifu charge.paid na mode: "test". Kusoma kwa kompyuta yako, ongeza server yako ya kifupi kwenye tunnel ya https na kuchangia jina la webhook yako kwa Lia team.
Kutafsiri kwa kawaida. Kiingereza kina maana ya kawaida. Kusoma kwa Kiingereza