Webhook adalah mekanisme push notification. Daripada server kamu harus polling (mengecek berkala), server kami yang akan mengirim data ke URL kamu saat event terjadi.
Cara kerja:
1
Daftarkan Webhook
Masukkan URL endpoint kamu di Dashboard → Webhook
2
Pilih Events
Tentukan event mana yang ingin didengarkan (payment.success, shop.created, dll)
3
Terima Notifikasi
Server kami mengirim POST request ke URL kamu saat event terjadi
4
Verifikasi Signature
Pastikan request benar dari server kami dengan verifikasi HMAC-SHA256
Events
Gunakan event ID di bawah ini saat konfigurasi webhook.
payment.createdPembayaran baru dibuat
payment.successPembayaran berhasil
payment.cancelledPembayaran dibatalkan
payment.expiredPembayaran kedaluwarsa
shop.createdPembelian role baru
shop.successRole berhasil diaktifkan
shop.expiredPembelian role kedaluwarsa
Payload Format
Setiap webhook dikirim sebagai POST request dengan body JSON:
Setiap request dilengkapi header X-Webhook-Signature berisi HMAC-SHA256 signature. Verifikasi untuk memastikan request benar dari server kami.
Header yang dikirim
Header
Deskripsi
Content-Type
application/json
X-Webhook-Signature
HMAC-SHA256 signature
X-Webhook-Event
Nama event
User-Agent
PaymetGateway-Webhook/1.0
Cara verifikasi
// Signature = HMAC-SHA256(secret_key, request_body)// Bandingkan signature dari header dengan yang kamu hitung sendiriconst crypto = require('crypto');
function verifySignature(secret, body, signature) {
const expected = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
Penting: Selalu gunakan crypto.timingSafeEqual() untuk perbandingan signature. Jangan gunakan === karena rentan timing attack.
Retry Logic
Jika server kamu return error (bukan status 2xx), kami akan retry otomatis:
Attempt
Delay
Keterangan
1
0 detik
Langsung kirim
2
30 detik
Retry pertama
3
2 menit
Retry kedua
Gagal
—
Log sebagai failed, stop
Tips: Return 200 OK atau 201 Created untuk menandakan webhook berhasil diterima.
Uji Coba Webhook
Tidak perlu langsung punya server penerima. Ada 3 cara menguji.
1. Receiver Bawaan (Tanpa Server Eksternal)
Halaman Webhook punya receiver bawaan di POST /api/webhook/receive-test.
1
Buka halaman Webhook
Kunjungi https://orkut.nickystore.my.id/webhook
2
Tekan "Kirim Test ke Receiver"
Sistem mengirim webhook ke receiver-nya sendiri
3
Lihat hasil di "Hasil Test Receiver"
Payload, header X-Webhook-Signature, dan badge validasi
Badge validasi:
SIGNATURE OK — signature cocok dengan secret config kamu
BELUM ADA CONFIG — belum ada secret (simpan config dulu untuk verifikasi penuh)
SIGNATURE TIDAK COCOK — signature bukan dari server kami
Bisa juga mengarahkan URL config ke receiver bawaan agar event asli (bukan cuma test) ikut tercatat: https://orkut.nickystore.my.id/api/webhook/receive-test
2. Script Test Lokal (Port 5543)
Script bawaan scripts/webhook-receiver.js menyediakan server penerima lokal:
npm run webhook:test
URL tujuan: http://localhost:5543/webhook
Menampilkan event, header, dan payload secara real-time
Verifikasi signature: set secret dulu agar tidak SKIPPED
export WEBHOOK_SECRET=<secret dari halaman webhook>
npm run webhook:test
Hasil signature: VALID ✓ (cocok), TIDAK COCOK ✗ (salah), SKIPPED (secret belum diset). Ganti port: node scripts/webhook-receiver.js 9999
Penting: Server live mengirim webhook dari internet. URL lokal hanya berguna kalau bisa diakses dari luar — gunakan ngrok, tunnel, atau URL publik (mis. forwarded port Codespaces / GitHub).
3. URL Publik (Tunnel)
Pakai URL publik seperti https://nama-tunnel.app.github.dev/webhook sebagai URL config di halaman webhook, lalu tekan Simpan dan Kirim Test. Pastikan script receiver (cara 2) berjalan di port yang terbuka.