Розробникам

Webhook

Коли рахунок змінює стан, CryBit надсилає підписаний запит POST із тілом JSON на webhook URL вашого мерчанта.

Налаштування

Вкажіть webhook URL і позначте події в налаштуваннях мерчанта, на вкладці інтеграції: paid, expired, refunded, cancelled. URL має бути публічною адресою HTTP або HTTPS на порту 80, 443, 8080 чи 8443; перенаправлення не відстежуються. Він задається на рівні мерчанта, а не в запиті на створення рахунку.

Заголовки

ЗаголовокЗначення
X-CryBit-EventНазва події, наприклад payment.paid.
X-CryBit-Signaturet=<unix time>,v1=<hex>: HMAC-SHA256 від "<t>.<raw body>" із вашим секретом підпису.

Перевірте підпис

Секрет підпису показано в налаштуваннях мерчанта поруч із 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 години.
  • Відповідь 4xx, окрім 429, зупиняє повторні спроби.
  • Одна й та сама подія може надійти більше ніж раз: обробляйте її ідемпотентно, за ключем order_id або uuid рахунку.
  • Якщо ви пропустили webhook, прочитайте статус через GET /api/v1/payments/{uuid}: це завжди джерело істини.

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

Чи можна побачити, що було доставлено?

Так. На сторінці журналу API в кабінеті мерчанта показано запити та доставки webhook зі статус-кодом і тілом.

Ще

Отримати API-ключ