Developer
Webhook
Saat status invoice berubah, CryBit mengirim permintaan POST bertanda tangan dengan body JSON ke URL webhook merchant Anda.
Pengaturan
Tentukan URL webhook dan centang event di pengaturan merchant, pada tab integrasi: paid, expired, refunded, cancelled. URL harus berupa alamat HTTP atau HTTPS publik di port 80, 443, 8080, atau 8443; redirect tidak diikuti. URL ini ditetapkan pada merchant, bukan dalam permintaan invoice.
Header
| Header | Nilai |
|---|---|
X-CryBit-Event | Nama event, misalnya payment.paid. |
X-CryBit-Signature | t=<unix time>,v1=<hex>: HMAC-SHA256 dari "<t>.<raw body>" dengan signing secret Anda. |
Verifikasi tanda tangan
Signing secret ditampilkan di pengaturan merchant di samping URL webhook. Hitung tanda tangan atas raw body, bandingkan dalam waktu konstan, dan tolak permintaan yang lebih lama dari lima menit.
PHP
$secret = getenv('CRYBIT_WEBHOOK_SECRET');
$body = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_CRYBIT_SIGNATURE'] ?? '';
parse_str(str_replace(',', '&', $header), $p); // t=…&v1=…
$t = (int) ($p['t'] ?? 0);
$expected = hash_hmac('sha256', $t . '.' . $body, $secret);
if (abs(time() - $t) > 300 || !hash_equals($expected, $p['v1'] ?? '')) {
http_response_code(400);
exit;
}
// the request is genuine: store the event, answer 200, do the rest later
http_response_code(200);Node.js
import crypto from 'node:crypto'
export function verify(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(',').map((kv) => kv.split('=')))
const t = Number(parts.t)
const expected = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex')
const ok = parts.v1 && parts.v1.length === expected.length
&& crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected))
return ok && Math.abs(Date.now() / 1000 - t) <= 300
}Pengiriman dan retry
- Balas dengan status 2xx dengan cepat: CryBit menunggu sekitar dua belas detik.
- Jika Anda tidak membalas, CryBit mengulang setelah 15 detik, 1 menit, 5, 15, dan 30 menit, lalu 2, 6, dan 24 jam.
- Balasan 4xx, kecuali 429, menghentikan retry.
- Event yang sama bisa tiba lebih dari sekali: tangani secara idempoten, dengan kunci order_id atau uuid invoice.
- Jika Anda melewatkan webhook, baca statusnya dengan GET /api/v1/payments/{uuid}: itu selalu menjadi sumber kebenaran.
FAQ
Bisakah saya melihat apa saja yang terkirim?
Ya. Halaman log API di akun merchant menampilkan daftar permintaan dan pengiriman webhook beserta kode status dan body-nya.
