Perilaku pengiriman
Diambil dari dokumentasi resmi vendor, terakhir diperiksa 2026-08-06. Jika vendor tidak menyebut angka, tabel ini juga tidak mencantumkannya.
| Batas waktu respons | 5 detik |
|---|---|
| Percobaan ulang | Live: 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 mencoba | tidak dipublikasikan vendor |
| Sumber | https://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.
| Algoritma | HMAC-SHA256 |
|---|---|
| Payload bertanda tangan | {timestamp}:{body} |
| Encoding | hex |
| Header | paddle-signature = ts=X;h1=hex |
| Toleransi | 5 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.