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ıkDeğer
X-CryBit-EventOlay adı, örneğin payment.paid.
X-CryBit-Signaturet=<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.

Daha fazla

API anahtarı alın