Webhook: Saat Server yang Menghubungimu
Memahami pola webhook: kenapa lebih efisien dari polling, cara menerima, dan verifikasi signature.
Berlangganan koran vs mengecek loper tiap jam
Dua cara tahu berita terbaru: menelepon loper koran tiap jam (polling), atau berlangganan sehingga koran diantar saat terbit (webhook). Webhook adalah URL di server-mu yang dipanggil layanan lain SAAT ada kejadian: pembayaran sukses, pesan baru, deploy selesai. Kamu tidak bertanya berulang-ulang; kamu diberi tahu.
Kenapa webhook mengalahkan polling
Polling (setInterval + fetch tiap 5 detik) boros: 99% request menjawab "belum ada yang baru". Webhook membalik arah: satu request keluar hanya saat ada kejadian nyata. Untuk notifikasi pembayaran, status pengiriman, atau integrasi antar layanan, webhook adalah pola standar industri.
Contoh 1: menerima webhook di Express
app.post("/webhook/pembayaran", function(req, res) {
const event = req.body;
if (event.tipe === "pembayaran.sukses") {
tandaiPesananLunas(event.data.order_id);
}
res.status(200).send("OK");
});Kuncinya: respons CEPAT (200 segera), proses berat lakukan di background. Provider webhook akan retry kalau kamu lama merespons atau mengembalikan error.
Contoh 2: verifikasi signature (wajib!)
Tanpa verifikasi, siapa pun bisa memanggil URL webhook-mu dan berpura-pura jadi provider:
const crypto = require("crypto");
function validasiSignature(body, signature, secret) {
const hitung = crypto
.createHmac("sha256", secret)
.update(JSON.stringify(body))
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(hitung), Buffer.from(signature)
);
}Provider mengirim signature di header (misalnya X-Signature). Kamu hitung ulang dengan secret yang hanya kalian berdua tahu. Cocok berarti asli. Jangan pernah skip langkah ini untuk webhook pembayaran.
Kesalahan umum
Salah: tidak verifikasi signature. Webhook palsu bisa menandai pesanan "lunas" tanpa bayar. Yang benar: selalu verifikasi, tolak yang tidak valid dengan 401.
Salah: memproses lama sebelum respons. Provider menganggap gagal dan retry, pesanan diproses dua kali. Yang benar: respons 200 dulu, proses di queue/background.
Salah: tidak idempotent. Retry provider mengeksekusi aksi dua kali. Yang benar: cek event id sudah diproses atau belum sebelum eksekusi.
Salah: memakai GET untuk webhook. Data event terlihat di log dan URL. Yang benar: webhook selalu POST dengan body dan signature di header.
Studi kasus: notifikasi pembayaran QRIS
Alur nyata payment gateway (misalnya Midtrans/Xendit):
- User scan QRIS dan bayar. Kamu TIDAK tahu kapan tepatnya pembayaran terjadi.
- Tanpa webhook: frontend polling
GET /api/status-bayartiap 3 detik. Boros dan lambat. - Dengan webhook: gateway memanggil
POST /webhook/qrisdi server-mu begitu pembayaran sukses, lengkap dengan signature. - Server-mu verifikasi signature, tandai pesanan lunas, lalu dorong notifikasi ke frontend via WebSocket/SSE.
Polling butuh ratusan request untuk satu pembayaran; webhook butuh satu. Untuk integrasi pembayaran, webhook bukan pilihan, melainkan keharusan.
Catatan teknis: Untuk mencoba webhook lokal, pakai tools seperti ngrok atau webhook.site: dapat URL publik sementara, lihat payload mentahnya, lalu arahkan ke localhost-mu. Cara tercepat memahami format webhook provider apa pun.
Tantangan
Rancang endpoint webhook pembayaran
Rancang POST /webhook/pembayaran:
- Tulis kode Express yang memverifikasi signature dulu, menolak 401 kalau tidak valid.
- Cek event.id belum diproses (idempotency), lalu tandai pesanan lunas.
- Respons 200 SEGERA sebelum proses berat.
Tulis sebagai satu blok JavaScript dengan komentar.
Kuis Bab
Uji pemahamanmu: Bab 3: REST & Data
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Manakah JSON yang VALID?
2.Desain endpoint REST yang paling rapi untuk menghapus komentar id 9 adalah...
3.Kenapa pagination penting untuk API yang mengembalikan banyak data?
4.Apa keuntungan utama memakai Postman sebelum menulis kode frontend?
5.Lima bagian minimal dokumentasi tiap endpoint adalah...