Liaविकासकर्ता

मार्गदर्शन

एक पूर्ण वेबहुक हैंडलर। कच्चे शरीर पर हस्ताक्षर की जांच करें, API के साथ जांच करें, एक बार कार्य करें, और तेजी से जवाब दें।

Lia भेजता है charge.paid, charge.refunded और reward.paid आपके वेबहुक पते पर, आपके वेबहुक सीक्रेट के साथ हस्ताक्षरित। देखें वेबहुक हर फील्ड के लिए।

#Node.js के साथ एक्सप्रेस

शरीर को बिना किसी परिवर्तन के पढ़ें: हस्ताक्षर ठीक उन बाइट्स Lia भेजे गए हैं, इसलिए किसी भी JSON पार्सिंग से पहले इसकी जांच करें।

webhook.js
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 कार्यकर्ता

worker.js
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 });
  },
};

#सामान्य नियम

  • हस्ताक्षर की जांच करें, फिर API के साथ जांच करें। एक हुक बैक कहता है कि कुछ हुआ है; GET /charges/:id कहता है क्या'राज्य अब सच है।
  • एक ही बार में। यह वेबहुक दो बार आ सकते हैं, और आपके पेज ने पहले ही डिलीवर कर दिया हो सकता है। चार्ज आईडी या पुरस्कार कुंजी पर क्या करते हैं उसे ध्यान में रखें।
  • उत्तर 2xx जल्दी से। Lia एक वेबहूक के दो बार प्रयास करता है, तुरंत, और फिर छोड़ देता है। उत्तर देने के बाद धीरे-धीरे काम करें।
  • डॉन'केवल वेबहुक्स पर भरोसा न करें। पीछे रह जाएं Lia.charges() जब खिलाड़ी आपके एप्लिकेशन खोलता है, इसलिए कोई भी वेबहुक बिक्री नहीं खोता।
  • मोड का ध्यान रखें। परीक्षण घटनाएं एक ही पते पर आती हैं: जांचें data.mode.
  • जिन प्रकारों को आप नजरअंदाज करते हैं वे आपके लिए नहीं हैं'तब जानता है, और अभी भी जवाब दें 200.

#अपने हैंडलर का परीक्षण करें

एक परीक्षक के रूप में एक परीक्षण खरीद करें (देखें परीक्षण): यह एक वास्तविक, हस्ताक्षरित charge.paid साथ में mode: "test". अपने कंप्यूटर पर इसका परीक्षण करने के लिए, अपने स्थानीय सर्वर को एक एचटीटीपीएस टनल के पीछे रखें और Lia टीम से अपने वेबहुक एड्रेस को वहां दिशा देने के लिए कहें।

स्वचालित अनुवाद। अंग्रेजी सत्य का स्रोत है। अंग्रेजी में पढ़ें

किसी भी पृष्ठ, विधि और एंडपॉइंट के लिए खोजने के लिए प्रकार।