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

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

Мінімальна інтеграція приймання платежів: створення рахунку через 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, а продавець може прив’язати платіж до рахунку вручну. Факт оплати підтверджує саме сповіщення.

Що далі​