Әзірлеушілерге

Webhook-тар

Инвойс күйі өзгергенде, CryBit мерчантыңыздың webhook URL мекенжайына JSON денесі бар қол қойылған POST сұранысын жібереді.

Баптау

Мерчант баптауларында, интеграция бөлімінде webhook URL мекенжайын енгізіп, оқиғаларды белгілеңіз: paid, expired, refunded, cancelled. URL 80, 443, 8080 немесе 8443 портындағы ашық HTTP немесе HTTPS мекенжайы болуы керек; қайта бағыттаулар орындалмайды. Ол инвойс сұранысында емес, мерчантта белгіленеді.

Тақырыптар

ТақырыпМән
X-CryBit-EventОқиға атауы, мысалы payment.paid.
X-CryBit-Signaturet=<unix time>,v1=<hex>: қол қою құпиясымен есептелген "<t>.<raw body>" мәнінің HMAC-SHA256 қолтаңбасы.

Қолтаңбаны тексеру

Қол қою құпиясы мерчант баптауларында webhook URL мекенжайының жанында көрсетіледі. Қолтаңбаны шикі дене бойынша есептеңіз, тұрақты уақытта салыстырыңыз және бес минуттан ескі сұраныстарды қабылдамаңыз.

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
}

Жеткізу және қайталап жіберу

  • 2xx статусымен тез жауап беріңіз: CryBit шамамен он екі секунд күтеді.
  • Жауап бермесеңіз, CryBit 15 секундтан, 1 минуттан, 5, 15 және 30 минуттан кейін, содан соң 2, 6 және 24 сағаттан кейін қайта жібереді.
  • 429-дан басқа 4xx жауабы қайталап жіберуді тоқтатады.
  • Бір оқиға бірнеше рет келуі мүмкін: оны order_id немесе инвойс uuid-і бойынша идемпотентті түрде өңдеңіз.
  • Webhook-ты өткізіп алсаңыз, статусты GET /api/v1/payments/{uuid} арқылы оқыңыз: ол әрдайым дұрыс дереккөз болып қала береді.

Вопросы и ответы

Не жеткізілгенін көре аламын ба?

Иә. Мерчант аккаунтындағы API журналдары беті сұраныстар мен webhook жеткізулерін статус коды және денесімен тізіп көрсетеді.

Толығырақ

API кілтін алу