Разработчикам

Вебхуки

Когда счёт меняет состояние, CryBit отправляет подписанный POST-запрос с JSON-телом на URL вебхука вашего мерчанта.

Настройка

Задайте URL вебхука и отметьте события в настройках мерчанта, на вкладке «Интеграция»: paid, expired, refunded, cancelled. URL должен быть публичным HTTP/HTTPS-адресом на порту 80, 443, 8080 или 8443; редиректы не выполняются. Он задаётся у мерчанта, а не в запросе на создание счёта.

Заголовки

ЗаголовокЗначение
X-CryBit-EventНазвание события, например payment.paid.
X-CryBit-Signaturet=<unix-время>,v1=<hex>: HMAC-SHA256 от «<t>.<тело как есть>» вашим секретом подписи.

Проверка подписи

Секрет подписи показан в настройках мерчанта рядом с 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 счёта.
  • Если вы пропустили вебхук, прочитайте статус через GET /api/v1/payments/{uuid}: это всегда источник истины.

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

Можно ли увидеть, что было отправлено?

Да. На странице логов API в кабинете мерчанта видны запросы и доставки вебхуков с кодом ответа и телом.

Ещё

Получите API-ключ