Перейти до основного вмісту

Швидкий старт

Мінімальна інтеграція приймання платежів: створення рахунку через API й обробка сповіщення про оплату. Наприкінці — рекомендації щодо видачі товару. Приклади самодостатні, SDK не використовується.

порада

Працюєте з ШІ-агентом? Передайте йому markdown-версію цієї сторінки. На ній достатньо даних, щоб написати інтеграцію для вашого сайту чи магазину.

Підготовка

ЗначенняДе взяти
API ключРозділ Інтеграції (Integrations)
ID проєктуРозділ Проєкти (Projects)
Секрет вебхукаНалаштування проєкту

Там само в налаштуваннях проєкту вкажіть Webhook URL — адресу обробника сповіщень на вашому сервері. Лише https, редиректи не виконуються.

У прикладах використано тестові значення — підставте свої.

Створення рахунку

POST https://api.bitsby.app/invoices/create, API ключ передається в заголовку Authorization.

ПараметрОбов’язковийЗначення
projectIdтакID проєкту, UUID
amountFiatтакСума рахунку
currencyFiatтакВалюта: USD, EUR, RUB
timeToPayтакСтрок оплати в годинах: 0.5, 1, 3, 6, 12
descriptionніОпис, покупець бачить його на платіжній сторінці
serviceDataніСлужбові дані, покупець їх не бачить. Радимо передавати номер замовлення: він повернеться у сповіщенні про оплату
curl -X POST https://api.bitsby.app/invoices/create \
-H "Authorization: Token MSvL2ltaDZdWVjmZURURMVWhqSJLT2NURjhL2Fla1Z1T1IxQTltKs1T3Ay" \
-F "projectId=9deea1e2-0c08-41a3-bdc2-a34eada3892d" \
-F "amountFiat=49.90" \
-F "currencyFiat=USD" \
-F "timeToPay=1" \
-F "description=Order 4172" \
-F "serviceData=order-4172"

Відповідь:

{
"result": "success",
"data": {
"id": "ade9550d-3dc7-4fd3-b94e-3b4c12aaaa0c",
"uid": "MXNj4m8HhcM4",
"createDatetime": "2026-09-14 10:12:03",
"timeToPayDatetime": "2026-09-14 11:12:03",
"commissionFiatUSD": 0.5,
"amountFiatUSD": 49.9,
"url": "https://dash.bitsby.app/invoices/pay/MXNj4m8HhcM4"
}
}

Збережіть data.id поруч із замовленням і відправте покупця на data.url — це платіжна сторінка. Посилання можна передати будь-яким способом: редиректом, листом, повідомленням у боті. Рахунок діє до timeToPayDatetime (UTC).

Обробка сповіщення

Коли рахунок переходить у статус «Оплачений» (Paid), сервіс надсилає POST на Webhook URL проєкту. Тіло — JSON, підпис — у заголовках:

ЗаголовокЗначення
X-TimestampЧас надсилання, unix-час у секундах
X-Signaturesha256= + HMAC-SHA256 у hex від рядка <timestamp>.<тіло запиту>

Ключ підпису — секрет вебхука. Підпис обчислюється від сирого тіла запиту, тому перевіряйте його до розбору JSON.

<?php
$secret = 'k7QwR2mZ9tXbN4vL8sJpH3dF6yA1cE0u';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Reject replayed requests: allow up to 5 minutes of clock drift
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$invoice = json_decode($body, true)['invoice'];

if ($invoice['status'] === 'paid') {
// $invoice['serviceData'] — the order id passed at creation: 'order-4172'
// $invoice['amountFiat'] — the original invoice amount: 49.9
// Issue the order here, see the next section
}

http_response_code(200);

Відповідь — код 2xx протягом 10 секунд. Будь-який інший код, редирект або таймаут — невдала доставка: сервіс повторить запит зі щораз більшими інтервалами від 5 хвилин до 24 годин, потім припинить спроби. Довгу обробку виносьте в чергу: спочатку відповідь 200, потім робота із замовленням.

Повний формат сповіщення й опис усіх полів — у розділі «Webhook URL».

Видача товару

Перевірене сповіщення зі статусом paid підтверджує оплату. Порядок видачі:

  1. Знайдіть замовлення за invoice.serviceData — це значення, передане під час створення рахунку (order-4172).
  2. Перевірте за invoice.id, чи не було вже видачі за цим рахунком. Сповіщення з тим самим invoice.id може надійти повторно — видавайте товар один раз і зберігайте ознаку обробки.
  3. Звірте суму й валюту за invoice.amountFiat і invoice.currencyFiat — це оригінальні значення рахунку, вони не змінюються. amountFiatUSD перезаписується фактично отриманою сумою. Порівнюйте суми як числа, а не рядки: незначущі нулі зникають, 49.90 надходить як 49.9. У разі розбіжності із замовленням відправляйте рахунок на ручну перевірку, а не у видачу — розбір таких випадків у розділі «Прив’язка платежів і розбіжність сум».
  4. Видайте товар і позначте замовлення обробленим.

Строк оплати під час видачі не перевіряється: платіж міг підтвердитися в блокчейні після timeToPayDatetime, а продавець може прив’язати платіж до рахунку вручну. Факт оплати підтверджує саме сповіщення.

Що далі