Header webhook
Setiap pesan webhook membawa tiga header:Cara termudah: pakai library Svix
Library resmi Svix (Node.js, PHP, Python, dan bahasa lain) sudah mengurus semua langkah di halaman ini, termasuk menolak pesan lama. Contoh endpoint lengkap untuk Express, Laravel, PHP native, FastAPI, dan Flask ada di Menerima Webhook.Verifikasi manual (tanpa library)
1
Susun signed content
Gabungkan Pakai raw body persis seperti yang diterima, jangan hasil parse JSON.
svix-id, svix-timestamp, dan raw body dengan tanda titik:2
Siapkan key dari Signing Secret
Signing Secret berbentuk
whsec_<base64>. Buang prefix whsec_, lalu decode sisanya dari base64. Hasilnya (bytes) adalah key HMAC.3
Hitung signature
Hitung HMAC-SHA256 dari signed content memakai key tadi, lalu encode hasilnya ke base64.
4
Bandingkan dengan header svix-signature
Header
svix-signature bisa berisi lebih dari satu signature, dipisahkan spasi, misalnya v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE= v1,bm9ldHUjKzFob2l2.... Buang prefix versi v1,, lalu bandingkan setiap signature dengan hasil hitunganmu memakai constant-time compare. Pesan valid kalau salah satunya cocok.5
Cek timestamp
Tolak pesan kalau
svix-timestamp berbeda lebih dari sekitar 5 menit dari jam server kamu. Ini mencegah pesan lama dikirim ulang oleh pihak lain (replay attack).crypto bawaan Node.js:
verify-simplus-webhook.js
400 dan jangan proses pesannya.
Langkah berikutnya
Menerima Webhook
Contoh endpoint lengkap, cara mencoba di lokal, dan checklist production.
Event sales.persisted
Lihat struktur payload transaksi penjualan.
