Головний
/Інтеграція Host to host (white label)
Копіювати сторінку
Ця інструкція описує приймання криптоплатежів через пряму серверну взаємодію (server-to-server) з API Heleket. На відміну від інтеграції через готову платіжну сторінку, ваш бекенд створює інвойси, отримує платіжні реквізити та обробляє сповіщення про статус платежу. Ви можете відображати платіжну форму на своєму боці або використовувати URL, повернений у відповіді API.
Для приймання платежів вам потрібні два значення з особистого кабінету:
| Значення | Де взяти |
|---|---|
| Merchant ID | UUID мерчанта. Розділ Бізнес → Мерчанти → Налаштування мерчанта. |
| API-ключ платежів | Генерується в налаштуваннях мерчанта після проходження модерації. |
API-ключ виплат видається окремо в Налаштування → API, потребує підключеної двофакторної автентифікації та не потрібен для приймання платежів.
Базовий endpoint усіх запитів:
Усі запити надсилаються методом POST у форматі JSON і мають бути підписані.
Кожен запит автентифікується двома HTTP-заголовками:
| Заголовок | Значення |
|---|---|
| merchant | Ваш Merchant ID (UUID). |
| sign | Підпис тіла запиту. |
| Content-Type | application/json |
Підпис — це MD5-хеш base64-кодованого JSON-тіла запиту, об’єднаного з вашим API-ключем.
$body = json_encode($data);
$sign = md5(base64_encode($body) . $API_KEY);КопіюватиДля запитів без параметрів у тілі обчислюйте підпис від порожнього рядка:
$sign = md5(base64_encode('') . $API_KEY);КопіюватиВажливо про екранування слешів. PHP за замовчуванням екранує / у JSON (\/), а багато інших мов — ні. Підпис обчислюється від того самого рядка, який надсилається в тілі, тому рядок для підпису й тіло запиту мають бути байт у байт ідентичними. У стеках не на PHP екрануйте слеші вручну, інакше підпис не збігатиметься (та сама проблема виникає під час перевірки вебхуків, див. розділ 5).
curl https://api.heleket.com/v1/payment \
-X POST \
-H 'merchant: 8b03432e-385b-4670-8d06-064591096795' \
-H 'sign: fe99035f86fa436181717b302b95bacff1' \
-H 'Content-Type: application/json' \
-d '{"amount":"15","currency":"USD","order_id":"1"}'КопіюватиНе покладайтеся лише на вебхук: завжди майте fallback через /v1/payment/info (розділ 6) на випадок, якщо callback не надійшов.
Endpoint:
| Параметр | Тип | Обов’яз. | Опис |
|---|---|---|---|
| amount | string | так | Сума до сплати. Дробова частина через крапку, напр. 10.28. |
| currency | string | так | Код валюти інвойсу (фіат або криптовалюта), напр. USD, USDT, BTC. |
| order_id | string | так | Ваш ідентифікатор замовлення. Лише літери, цифри, _ і -. Має бути унікальним. |
| network | string | ні | Код блокчейн-мережі, напр. tron, bsc, eth. |
| to_currency | string | ні | Цільова криптовалюта для перерахунку суми (завжди код криптовалюти, не фіат). |
| url_callback | string | ні | URL, на який Heleket надсилає вебхуки зі статусом. Фактично обов’язковий для H2H. |
| url_return | string | ні | Куди повернути клієнта з платіжної форми до оплати. |
| url_success | string | ні | Куди повернути клієнта після успішної оплати. |
| lifetime | integer | ні | Термін дії інвойсу в секундах (300–43200, за замовчуванням 3600). |
| subtract | integer | ні | Який відсоток комісії покласти на клієнта (0–100). |
| accuracy_payment_percent | numeric | ні | Допустима недоплата у % (0–5): інвойс закриється як оплачений, якщо недоплата в цих межах. |
| is_payment_multiple | boolean | ні | Дозволити доплату залишку. За замовчуванням true. |
| additional_data | string | ні | Довільний рядок для вас (клієнту не видно), до 255 символів. |
| currencies | array | ні | Білий список валют/мереж для оплати. |
| except_currencies | array | ні | Чорний список валют/мереж. |
| discount_percent | integer | ні | Знижка (додатна) або націнка (від’ємна), від -99 до 100. |
| is_refresh | boolean | ні | Оновити прострочений інвойс із тим самим order_id (нова адреса й термін). |
Про order_id: якщо інвойс із таким order_id уже існує, новий створено не буде — повернуться реквізити наявного. Це зручно для ідемпотентності: повторний запит для того самого замовлення безпечний.
Коли адреса гаманця надходить одразу. Поле address заповнюється під час створення, лише якщо валюту оплати визначено однозначно: задано криптовалюту + мережу (to_currency + network) або криптовалюта має єдину мережу (напр. BTC). Інакше клієнт вибирає валюту/мережу на платіжній сторінці, а address з’явиться пізніше.
Мінімальний інвойс на 15 USD (клієнт сам вибере криптовалюту й мережу):
{ "amount": "15", "currency": "USD", "order_id": "1" }КопіюватиІнвойс на 20 USDT у мережі TRON — адреса буде одразу:
{ "amount": "20", "currency": "USDT", "order_id": "1", "network": "tron" }КопіюватиІнвойс на 25 USD, оплата лише в USDT у будь-якій мережі:
{ "amount": "25", "currency": "USD", "order_id": "1", "to_currency": "USDT" }Копіювати{
1 "state": 0,
2 "result": {
3 "uuid": "1ec87133-b22d-4643-988f-cac29a6ac85d",
4 "order_id": "3",
5 "amount": "20000.00",
6 "payment_amount": null,
7 "payer_amount": "254.92",
8 "payer_currency": "USDT",
9 "currency": "RUB",
10 "merchant_amount": "249.82816502",
11 "network": "bsc",
12 "address": "0x2b...",
13 "txid": null,
14 "payment_status": "check",
15 "url": "https://pay.heleket.com/pay/1ec87133-b22d-4643-988f-cac29a6ac85d",
16 "expired_at": 1753202502,
17 "is_final": false,
18 "commission": "5.09853397",
19 "address_qr_code": "data:image/png;base64 ..."
20 }
21}Копіювати| Поле | Призначення |
|---|---|
| uuid | UUID інвойсу в Heleket. Збережіть його разом із замовленням. |
| address | Адреса гаманця для оплати. Може бути null, доки валюту не вибрано. |
| payer_amount | Сума до сплати в payer_currency з урахуванням знижки або націнки. |
| payer_currency | Валюта оплати. null означає, що клієнт її ще не вибрав. |
| merchant_amount | Сума, яка буде зарахована на ваш баланс після вирахування комісій. |
| payment_status | Поточний статус (див. розділ 7). |
| url | Посилання на платіжну сторінку Heleket, якщо ви не відображаєте форму самостійно. |
| address_qr_code | QR-код платіжної адреси у форматі base64. |
| expired_at | Unix-мітка часу завершення строку дії інвойсу. |
| is_final | Ознака того, що інвойс закритий і більше не може бути оплачений. |
state: 0 означає успіх. У разі помилок валідації state: 1 (розділ 8).
Heleket надсилає POST webhook щоразу, коли змінюється статус інвойсу.
| Поле | Опис |
|---|---|
| type | Тип: payment або wallet. |
| uuid | UUID платежу. |
| order_id | Ваш ідентифікатор замовлення — за ним знаходите замовлення. |
| amount | Сума інвойсу. |
| payment_amount | Скільки фактично сплатив клієнт. |
| payment_amount_usd | Фактично сплачено в USD. |
| merchant_amount | Зараховано на баланс за вирахуванням комісії. |
| commission | Комісія Heleket. |
| is_final | Чи закритий інвойс остаточно. |
| status | Статус платежу (див. розділ 7). |
| from | Адреса гаманця платника. |
| network | Мережа платежу. |
| currency | Валюта інвойсу. |
| payer_currency | Валюта, якою фактично оплатили. |
| txid | Хеш транзакції в блокчейні (може бути відсутнім при p2p/ручному закритті). |
| sign | Підпис вебхука для перевірки. |
{
1 "type": "payment",
2 "uuid": "62f88b36-a9d5-4fa6-aa26-e040c3dbf26d",
3 "order_id": "97a75bf8eda5cca41ba9d2e104840fcd",
4 "amount": "3.00000000",
5 "payment_amount": "3.00000000",
6 "merchant_amount": "2.94000000",
7 "commission": "0.06000000",
8 "is_final": true,
9 "status": "paid",
10 "from": "THgEWubVc8tPKXLJ4VZ5zbiiAK7AgqSeGH",
11 "network": "tron",
12 "currency": "TRX",
13 "payer_currency": "TRX",
14 "txid": "6f0d9c8374db57cac0d806251473de754f361c83a03cd805f74aa9da3193486b",
15 "sign": "a76c0d77f3e8e1a419b138af04ab600a"
16}КопіюватиОскільки на основі вебхука ви видаєте товар або поповнюєте баланс користувача, потрібно переконатися, що запит надійшов саме від Heleket. Перевіряйте обома способами:
// 1. Зчитуємо сире тіло запиту
1$data = json_decode(file_get_contents('php://input'), true);
2
3// 2. Дістаємо й видаляємо підпис із масиву
4$sign = $data['sign'];
5unset($data['sign']);
6
7// 3. Обчислюємо хеш від тіла (без sign) + ваш API-ключ платежів
8$hash = md5(base64_encode(json_encode($data, JSON_UNESCAPED_UNICODE)) . $apiPaymentKey);
9
10// 4. Звіряємо
11if (!hash_equals($hash, $sign)) {
12 // підпис неправильний — відхилити
13 http_response_code(400);
14 exit;
15}КопіюватиТа сама проблема зі слешами, що й у розділі 2: під час кодування JSON поза PHP екрануйте / вручну (JSON.stringify(data).replace(/\//g, "\\/") у JS), інакше підпис не збігатиметься.
Endpoint:
Передайте uuid або order_id (якщо передати обидва — пріоритет у order_id).
curl https://api.heleket.com/v1/payment/info \
-X POST \
-H 'merchant: 8b03432e-385b-4670-8d06-064591096795' \
-H 'sign: <підпис тіла>' \
-H 'Content-Type: application/json' \
-d '{"order_id":"1"}'КопіюватиВідповідь містить той самий об’єкт платежу з актуальними payment_status та is_final. Використовуйте цей метод для періодичної звірки «завислих» замовлень, а не як основний механізм (вебхуки швидші й потребують менше запитів).
| Статус | Фінальний | Значення |
|---|---|---|
| check | ні | Очікування появи транзакції в блокчейні. |
| process | ні | Платіж обробляється. |
| confirm_check | ні | Транзакцію видно, очікуємо потрібну кількість підтверджень мережі. |
| wrong_amount_waiting | ні | Недоплата з можливістю доплатити залишок. |
| paid | так | Сплачено рівно необхідну суму. Видавайте товар. |
| paid_over | так | Сплачено більше, ніж було потрібно. Видавайте товар. |
| wrong_amount | так | Клієнт заплатив менше, ніж було потрібно. |
| fail | так | Помилка під час оплати. |
| cancel | так | Платіж скасовано, клієнт не оплатив. |
| system_fail | так | Системна помилка. |
| locked | так | Кошти заблоковано за програмою AML. |
| refund_process | ні | Повернення обробляється. |
| refund_paid | так | Повернення виконано. |
| refund_fail | так | Помилка під час повернення. |
Вважайте paid і paid_over успішними платежами. confirm_check також може надходити у webhook як проміжний статус.
Помилки валідації — HTTP 422, state: 1:
{ "state": 1, "errors": { "amount": ["validation.required"] } }КопіюватиПоширені повідомлення (state: 1, поле message):
| Повідомлення | Причина |
|---|---|
| The network was not found | Передано непідтримуваний код мережі. |
| The currency was not found | Передано непідтримуваний код валюти. |
| Not found service to_currency | Для to_currency немає доступного платіжного сервісу. |
| Minimum amount 0.5 USDT | Сума нижча за мінімальну для валюти. |
| Maximum amount 10000000 USDT | Сума перевищує максимальну для валюти. |
| Wallet not found | Немає активного гаманця мерчанта для валюти платежу. |
| You are forbidden | Платежі заблоковані. Зверніться до служби підтримки. |
| Gateway error / Server error | Сталася тимчасова технічна помилка, і платіж недоступний. |
Внутрішня помилка — HTTP 500:
{ "message": "Server error, #1", "code": 500, "error": null }КопіюватиВважайте Gateway error, Server error і HTTP 500 тимчасовими та повторюйте запит з експоненційною затримкою.
Довідник кодів валют і мереж, методи повернення, статичні гаманці та виплати наведені у відповідних розділах документації Heleket.