Перейти к основному содержимому

Быстрый старт

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

подсказка

Работаете с ИИ-агентом? Передайте ему markdown-версию этой страницы. На ней достаточно данных, чтобы написать интеграцию для вашего сайта или магазина.

Подготовка

ЗначениеГде взять
API ключРаздел Интеграции
ID проектаРаздел Проекты
Секрет вебхукаНастройки проекта

Там же в настройках проекта укажите 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).

Обработка уведомления

При переходе счета в статус «Оплачен» сервис отправляет 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, а продавец может привязать платеж к счету вручную. Факт оплаты подтверждает само уведомление.

Что дальше