Cara Paddle mengirim webhook

Hingga 60 upaya pengiriman selama sekitar 2 hari dalam mode live, sekitar 10 di jam pertama. Format signature ts/h1 Paddle dan verifier Node.

Perilaku pengiriman

Diambil dari dokumentasi resmi vendor, terakhir diperiksa 2026-08-06. Jika vendor tidak menyebut angka, tabel ini juga tidak mencantumkannya.

Batas waktu respons5 detik

Periksa apakah handler Anda menjawab tepat waktu

Percobaan ulangLive: hingga 60 upaya selama sekitar 2 hari, sekitar 10 pada jam pertama dan sekitar 45 pada hari pertama. Sandbox: 3 upaya dalam sekitar 2 menit
Berhenti mencobatidak dipublikasikan vendor
Sumberhttps://developer.paddle.com/webhooks/about/respond-to-webhooks

Tanda tangan

Diverifikasi dengan verifier yang berfungsi dan dibuktikan oleh test suite, bukan dibaca dari dokumentasi. Terakhir diverifikasi 2026-08-20.

AlgoritmaHMAC-SHA256
Payload bertanda tangan{timestamp}:{body}
Encodinghex
Headerpaddle-signature = ts=X;h1=hex
Toleransi5 detik

Verifikasi

Raw body dari permintaan, byte demi byte, sebelum parsing JSON apa pun. Setiap skema di halaman ini rusak begitu framework melakukan serialisasi ulang pada payload.

const crypto = require("node:crypto");

// paddle-signature: "ts=1700000000;h1=abc..." — HMAC-SHA256 over "{ts}:{body}"
const pairs = Object.fromEntries(
  req.headers["paddle-signature"].split(";").map((p) => p.split("=")),
);
const expected = crypto
  .createHmac("sha256", secretKey) // per destination: pdl_ntfset_...
  .update(`${pairs.ts}:${rawBody}`)
  .digest("hex");
const received = Buffer.from(pairs.h1 ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
  received.length === wanted.length && crypto.timingSafeEqual(received, wanted);

SDK Paddle memberlakukan toleransi stempel waktu (timestamp) 5 detik, yang paling ketat di antara pengirim di sini. Di belakang relay atau antrean, cocokkan stempel waktu dengan saat event tiba di edge, bukan saat worker Anda memprosesnya.

Yang sering menjebak

Kurva percobaan ulangnya rapat di bagian yang pada Stripe renggang: sekitar 10 upaya di jam pertama, sekitar 45 di hari pertama, hingga 60 selama sekitar 2 hari. Handler yang sekadar lambat dijalankan lagi setiap beberapa menit pada awalnya, dan tanpa idempotensi setiap eksekusi mengulang efek sampingnya.

Sandbox sama sekali tidak berperilaku seperti live (3 upaya dalam sekitar 2 menit), jadi penanganan percobaan ulang yang terlihat baik saat pengujian baru merasakan 5% dari tekanannya.

Baca juga

AnyHook berada di depan endpoint yang menerima webhook dari Paddle: AnyHook menjawab dalam sekitar satu detik, mencoba ulang sesuai jadwalnya sendiri saat server Anda mati, dan menyimpan setiap event agar dapat diputar ulang (replay). Ganti satu URL, kode Anda tetap; agar percobaan ulang dan putar ulang diterima, periksa AnyHook-Signature, karena tanda tangan milik Paddle kedaluwarsa setelah 5 detik.

Cara kerjanya →