Skip to main content

Webhook Overview

Webhook memungkinkan IsiKuota mengirim notifikasi real-time ke server Anda setiap kali status transaksi atau deposit berubah — tanpa perlu polling.

Dua jenis event, satu URL webhook

Webhook mengirim dua jenis event ke URL yang sama: transaction.updated (order prabayar/game/pascabayar) dan deposit.updated (deposit saldo via API). Cek field event pada payload untuk membedakan keduanya — lihat daftar lengkap Events.

Cara Kerja​

Transaksi terjadi
│
▼
IsiKuota memproses
│
▼
Status berubah (Success/Failed)
│
▼
IsiKuota POST ke URL webhook Anda
│
▼
Server Anda membalas HTTP 200

Request Headers​

Setiap request webhook dari IsiKuota menyertakan headers berikut:

POST /webhook/isikuota HTTP/1.1
Host: yourdomain.com
Content-Type: application/json
Content-Length: 396
User-Agent: Isikuota-Webhook/1.0
X-Isikuota-Signature: sha256=<HMAC-SHA256 dari JSON body>
HeaderKeterangan
Content-TypeSelalu application/json
Content-LengthUkuran body dalam byte
User-AgentSelalu Isikuota-Webhook/1.0 — bisa dipakai untuk whitelist di firewall/WAF
X-Isikuota-Signaturesha256=<HMAC-SHA256 dari raw JSON body> — lihat Verifikasi Signature

Payload Webhook​

Contoh payload yang dikirim IsiKuota saat status transaksi berubah (transaction.updated) — struktur data untuk deposit.updated berbeda, lihat Events:

{
"event": "transaction.updated",
"event_id": "evt_01J3K8M2N4P5Q6R7S8T9U0V1W2",
"timestamp": "2025-01-15T14:30:00+07:00",
"data": {
"ref_id": "ORDER-2025-001",
"status": "success",
"product_code": "TSEL10",
"product_name": "Telkomsel 10.000",
"customer_no": "081234567890",
"price": 11500,
"sn": "1234567890123456",
"message": "Transaksi berhasil diproses",
"balance": 489000,
"created_at": "2025-01-15T14:29:55+07:00",
"updated_at": "2025-01-15T14:30:00+07:00"
}
}
FieldKeterangan
eventTipe event — transaction.updated atau deposit.updated
event_idID unik per pengiriman (ULID), gunakan untuk deduplikasi
timestampWaktu event dikirim (ISO 8601)
data.ref_idID referensi transaksi Anda
data.statussuccess / failed / pending
data.product_codeKode produk yang dibeli
data.product_nameNama produk yang dibeli
data.customer_noNomor tujuan transaksi
data.priceHarga produk (Rp)
data.snSerial number/token hasil transaksi (kosong jika belum ada)
data.messagePesan status transaksi
data.balanceSaldo akun Anda setelah transaksi
data.created_atWaktu transaksi dibuat
data.updated_atWaktu status transaksi terakhir diperbarui
tip

Ada dua event: transaction.updated dan deposit.updated. Cek event untuk routing, lalu tentukan tindakan berdasarkan data.status. Lihat detail lengkap tiap event di Events.

Verifikasi Signature​

Wajib verifikasi setiap request webhook menggunakan header X-Isikuota-Signature untuk memastikan request benar-benar dari IsiKuota.

Nilai header berformat sha256=<hex>. Hitung HMAC dari raw body lalu bandingkan dengan bagian setelah sha256=.

Formula:

X-Isikuota-Signature = "sha256=" + hash_hmac('sha256', raw_body, api_secret)
<?php
function verifyWebhook(string $rawBody, string $signature, string $secret): bool
{
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $secret);
return hash_equals($expected, $signature);
}

$rawBody = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_ISIKUOTA_SIGNATURE'] ?? '';

if (!verifyWebhook($rawBody, $signature, 'your_secret_key')) {
http_response_code(401);
exit('Invalid signature');
}

$payload = json_decode($rawBody, true);
// Proses webhook...
http_response_code(200);
echo json_encode(['status' => 'ok']);

Persyaratan Server Webhook​

PersyaratanDetail
ProtokolHTTPS (wajib di production)
MethodPOST
ResponseHTTP 2xx dalam 15 detik
Body responseBebas (diabaikan IsiKuota)
warning

Jika server tidak merespons dalam 15 detik atau mengembalikan status bukan 2xx, IsiKuota akan retry hingga 3 kali dengan jeda bertahap (10 detik, 30 detik, lalu 60 detik).

Best Practices​

  1. Selalu verifikasi X-Isikuota-Signature sebelum memproses payload
  2. Gunakan timing-safe comparison (hash_equals / timingSafeEqual) untuk mencegah timing attack
  3. Balas HTTP 200 segera, proses di background/queue
  4. Simpan log setiap callback untuk audit dan debugging
  5. Idempoten: gunakan event_id atau ref_id untuk mendeteksi pengiriman ganda sebelum update DB
  6. Test menggunakan fitur Webhook Tester di Dashboard

→ Setup Webhook → → Daftar Events →