Skip to main content
Verifikasi signature di setiap pesan webhook sebelum memprosesnya, supaya pesan palsu tidak bisa masuk ke sistem kamu.

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.
Pakai library kalau bisa. Verifikasi manual di bawah ini berguna kalau bahasa atau framework kamu belum didukung, atau kamu ingin paham cara kerjanya.

Verifikasi manual (tanpa library)

1

Susun signed content

Gabungkan svix-id, svix-timestamp, dan raw body dengan tanda titik:
Pakai raw body persis seperti yang diterima, jangan hasil parse JSON.
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).
Contoh dengan modul crypto bawaan Node.js:
verify-simplus-webhook.js
Kalau fungsi ini melempar error, balas dengan status 400 dan jangan proses pesannya.
Jangan bandingkan signature dengan === atau ==. Perbandingan biasa bisa membocorkan informasi lewat perbedaan waktu (timing attack). Pakai crypto.timingSafeEqual di Node.js, hash_equals di PHP, atau hmac.compare_digest di Python.

Langkah berikutnya

Menerima Webhook

Contoh endpoint lengkap, cara mencoba di lokal, dan checklist production.

Event sales.persisted

Lihat struktur payload transaksi penjualan.