Geliştiriciler
Webhook'lar
Bir faturanın durumu değiştiğinde CryBit, üye işyerinizin webhook URL'sine JSON gövdeli, imzalı bir POST isteği gönderir.
Kurulum
Webhook URL'sini ayarlayın ve olayları üye işyeri ayarlarında, entegrasyon sekmesinde işaretleyin: paid, expired, refunded, cancelled. URL; 80, 443, 8080 veya 8443 portunda herkese açık bir HTTP ya da HTTPS adresi olmalıdır; yönlendirmeler takip edilmez. Fatura isteğinde değil, üye işyeri üzerinde ayarlanır.
Başlıklar
| Başlık | Değer |
|---|---|
X-CryBit-Event | Olay adı, örneğin payment.paid. |
X-CryBit-Signature | t=<unix time>,v1=<hex>: imzalama gizli anahtarınızla "<t>.<raw body>" üzerinden HMAC-SHA256. |
İmzayı doğrulayın
İmzalama gizli anahtarı, üye işyeri ayarlarında webhook URL'sinin yanında gösterilir. İmzayı ham gövde üzerinden hesaplayın, sabit zamanlı karşılaştırın ve beş dakikadan eski istekleri reddedin.
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
}Teslimat ve yeniden denemeler
- Hızlıca 2xx durum koduyla yanıt verin: CryBit yaklaşık on iki saniye bekler.
- Yanıt vermezseniz CryBit 15 saniye, 1 dakika, 5, 15 ve 30 dakika, ardından 2, 6 ve 24 saat sonra yeniden dener.
- 429 dışındaki bir 4xx yanıtı yeniden denemeleri durdurur.
- Aynı olay birden fazla kez gelebilir: order_id veya fatura uuid değerini anahtar alarak idempotent biçimde işleyin.
- Bir webhook'u kaçırdıysanız durumu GET /api/v1/payments/{uuid} ile okuyun: doğruluk kaynağı her zaman odur.
FAQ
Nelerin iletildiğini görebilir miyim?
Evet. Üye işyeri hesabındaki API günlükleri sayfasında, istekler ve webhook teslimatları durum kodu ve gövdesiyle listelenir.
