Войти

Документация API
  • Главная
  • Получение ключей APIФормат запроса
  • Платежи
    Начало работы Создание платежа Создание статического кошелька Сгенерировать QR-код Заблокировать статический кошелек Осуществление возврата если кошелек заблокирован Информация о платеже Повторно отправить webhook Тестовый webhook Список сервисов История платежей Webhook Статусы платежей Ссылки AML
    Выплаты
    Начало работы Расчет суммы снятия Создание выплаты Информация о выплате Возврат История выплат Статусы выплат Webhook Список сервисов Перевод на личный кошелек Перевод на бизнес-кошелек
  • H2H-интеграция(White Label)
  • SDK
    PHP GO PYTHON NODEJS
  • CMS Модули
  • Оплата со скидкой
    Список скидок Установить скидку для способа оплаты
  • Список обменных курсовБалансШорт коды методов

Главная

/

H2H-интеграция (White Label)

Копировать страницу
FAQAPIКонтакты

Ⓒ 2026 Heleket

Privacy policy

Terms of use

AML

FAQAPIКонтакты

Host-to-Host (H2H) интеграция Heleket для мерчантов

Эта инструкция описывает приём криптоплатежей через прямое серверное взаимодействие (server-to-server) с API Heleket. В отличие от интеграции через готовую платёжную страницу, при H2H ваш бэкенд сам создаёт инвойс, получает реквизиты для оплаты и обрабатывает уведомления о статусе платежа. Платёжную форму при этом вы можете отрисовывать на своей стороне или использовать ссылку url из ответа API.

1. Что нужно перед стартом

Для приёма платежей вам потребуются два значения из личного кабинета:

ЗначениеГде взять
Merchant IDUUID мерчанта. Раздел Бизнес → Мерчанты → Настройки мерчанта.
API-ключ платежейГенерируется в настройках мерчанта после прохождения модерации.

Где взять

UUID мерчанта. Раздел Бизнес → Мерчанты → Настройки мерчанта.

Где взять

Генерируется в настройках мерчанта после прохождения модерации.

Порядок получения ключа приёма платежей:

  1. Бизнес → Мерчанты → Создать мерчанта, задайте имя.
  2. В настройках мерчанта нажмите Оставить заявку, укажите URL сайта и подтвердите домен.
  3. Дождитесь модерации мерчанта.
  4. После одобрения скопируйте API-ключ платежей и Merchant ID в разделе Настройки.

Ключ выплат — отдельный, выпускается в Настройки → API личного кабинета и требует подключённой 2FA. Для приёма платежей он не нужен.

Базовый endpoint всех запросов:

https://api.heleket.com/
Копировать

Все запросы отправляются методом POST в формате JSON и должны быть подписаны.

2. Аутентификация и подпись запроса

Каждый запрос аутентифицируется двумя HTTP-заголовками:

ЗаголовокЗначение
merchantВаш Merchant ID (UUID).
signПодпись тела запроса.
Content-Typeapplication/json

Значение

Ваш Merchant ID (UUID).

Значение

Подпись тела запроса.

Значение

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"}'
Копировать

3. Схема H2H-потока

  1. Клиент оформляет заказ у вас → вы фиксируете order_id на своей стороне
  2. Ваш сервер → POST /v1/payment → Heleket возвращает uuid, адрес, сумму, url
  3. Вы показываете клиенту реквизиты / адрес / QR (или ссылку url)
  4. Клиент платит в блокчейне
  5. Heleket → POST на ваш url_callback (webhook) при каждой смене статуса
  6. Вы проверяете подпись вебхука → обновляете заказ
  7. (Подстраховка) периодически опрашиваете POST /v1/payment/info по order_id

Не полагайтесь только на вебхук: всегда держите fallback через /v1/payment/info (раздел 6) на случай, если callback не дошёл.

4. Создание платежа

Endpoint:

POST
https://api.heleket.com/v1/payment
Копировать

Основные параметры запроса

ПараметрТипОбяз.Описание
amountstringдаСумма к оплате. Дробная часть через точку, напр. 10.28.
currencystringдаКод валюты инвойса (фиат или крипта), напр. USD, USDT, BTC.
order_idstringдаВаш идентификатор заказа. Только буквы, цифры, _ и -. Должен быть уникальным.
networkstringнетКод блокчейн-сети, напр. tron, bsc, eth.
to_currencystringнетЦелевая крипта для пересчёта суммы (всегда код криптовалюты, не фиат).
url_callbackstringнетURL, на который Heleket шлёт вебхуки со статусом. Обязателен для H2H по факту.
url_returnstringнетКуда вернуть клиента из платёжной формы до оплаты.
url_successstringнетКуда вернуть клиента после успешной оплаты.
lifetimeintegerнетСрок жизни инвойса в секундах (300–43200, по умолчанию 3600).
subtractintegerнетКакой % комиссии переложить на клиента (0–100).
accuracy_payment_percentnumericнетДопустимая недоплата в % (0–5): инвойс закроется как оплаченный при недоплате в пределах.
is_payment_multiplebooleanнетРазрешить дооплату остатка. По умолчанию true.
additional_datastringнетПроизвольная строка для вас (клиенту не видна), до 255 символов.
currenciesarrayнетБелый список валют/сетей для оплаты.
except_currenciesarrayнетЧёрный список валют/сетей.
discount_percentintegerнетСкидка (положит.) или наценка (отрицат.), от -99 до 100.
is_refreshbooleanнетОбновить просроченный инвойс по тому же order_id (новый адрес и срок).

Тип

string

Обяз.

да

Описание

Сумма к оплате. Дробная часть через точку, напр. 10.28.

Тип

string

Обяз.

да

Описание

Код валюты инвойса (фиат или крипта), напр. USD, USDT, BTC.

Тип

string

Обяз.

да

Описание

Ваш идентификатор заказа. Только буквы, цифры, _ и -. Должен быть уникальным.

Тип

string

Обяз.

нет

Описание

Код блокчейн-сети, напр. tron, bsc, eth.

Тип

string

Обяз.

нет

Описание

Целевая крипта для пересчёта суммы (всегда код криптовалюты, не фиат).

Тип

string

Обяз.

нет

Описание

URL, на который Heleket шлёт вебхуки со статусом. Обязателен для H2H по факту.

Тип

string

Обяз.

нет

Описание

Куда вернуть клиента из платёжной формы до оплаты.

Тип

string

Обяз.

нет

Описание

Куда вернуть клиента после успешной оплаты.

Тип

integer

Обяз.

нет

Описание

Срок жизни инвойса в секундах (300–43200, по умолчанию 3600).

Тип

integer

Обяз.

нет

Описание

Какой % комиссии переложить на клиента (0–100).

Тип

numeric

Обяз.

нет

Описание

Допустимая недоплата в % (0–5): инвойс закроется как оплаченный при недоплате в пределах.

Тип

boolean

Обяз.

нет

Описание

Разрешить дооплату остатка. По умолчанию true.

Тип

string

Обяз.

нет

Описание

Произвольная строка для вас (клиенту не видна), до 255 символов.

Тип

array

Обяз.

нет

Описание

Белый список валют/сетей для оплаты.

Тип

array

Обяз.

нет

Описание

Чёрный список валют/сетей.

Тип

integer

Обяз.

нет

Описание

Скидка (положит.) или наценка (отрицат.), от -99 до 100.

Тип

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}
Копировать

Ключевые поля ответа:

ПолеНазначение
uuidUUID инвойса в Heleket. Сохраните рядом с заказом.
addressАдрес кошелька для оплаты (может быть null, пока валюта не выбрана).
payer_amountСумма к оплате в payer_currency (с учётом скидки/наценки).
payer_currencyВалюта оплаты. null — клиент ещё не выбрал.
merchant_amountСколько зачислится на ваш баланс за вычетом комиссий.
payment_statusТекущий статус (см. раздел 7).
urlСсылка на платёжную страницу Heleket (если не рисуете форму сами).
address_qr_codeQR-код адреса в base64 — можно показать клиенту напрямую.
expired_atUnix-таймстамп истечения инвойса.
is_finaltrue — инвойс закрыт (оплачен или просрочен), оплатить уже нельзя.

Назначение

UUID инвойса в Heleket. Сохраните рядом с заказом.

Назначение

Адрес кошелька для оплаты (может быть null, пока валюта не выбрана).

Назначение

Сумма к оплате в payer_currency (с учётом скидки/наценки).

Назначение

Валюта оплаты. null — клиент ещё не выбрал.

Назначение

Сколько зачислится на ваш баланс за вычетом комиссий.

Назначение

Текущий статус (см. раздел 7).

Назначение

Ссылка на платёжную страницу Heleket (если не рисуете форму сами).

Назначение

QR-код адреса в base64 — можно показать клиенту напрямую.

Назначение

Unix-таймстамп истечения инвойса.

Назначение

true — инвойс закрыт (оплачен или просрочен), оплатить уже нельзя.

state: 0 означает успех. При ошибках валидации state: 1 (раздел 8).

5. Webhook: приём уведомлений о статусе

При каждой смене статуса инвойса Heleket отправляет POST на ваш url_callback.

Тело вебхука (основные поля)

ПолеОписание
typeТип: payment или wallet.
uuidUUID платежа.
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Подпись вебхука для проверки.

Описание

Тип: payment или wallet.

Описание

UUID платежа.

Описание

Ваш идентификатор заказа — по нему находите заказ.

Описание

Сумма инвойса.

Описание

Сколько фактически заплатил клиент.

Описание

Фактически уплачено в USD.

Описание

Зачислено на баланс за вычетом комиссии.

Описание

Комиссия Heleket.

Описание

Закрыт ли инвойс окончательно.

Описание

Статус платежа (см. раздел 7).

Описание

Адрес кошелька плательщика.

Описание

Сеть платежа.

Описание

Валюта инвойса.

Описание

Валюта, которой реально оплатили.

Описание

Хэш транзакции в блокчейне (может отсутствовать при p2p/ручном закрытии).

Описание

Подпись вебхука для проверки.

Пример полезной нагрузки:

{
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. Белый список IP. Принимайте callback только с IP Heleket: 31.133.220.8.
  2. Проверка подписи. Подпись считается тем же алгоритмом, что и для запросов, но проверяется так:
// 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), иначе подпись не совпадёт.

Рекомендации по обработке вебхука

  • Идемпотентность. Один и тот же статус может прийти повторно (в т.ч. через ручную переотправку). Привязывайтесь к order_id + status и не выдавайте товар дважды.
  • Реагируйте на финальные статусы (paid, paid_over), а не на промежуточные.
  • Отвечайте HTTP 200 только после успешной обработки; иначе Heleket может повторить отправку.
  • Сверяйте payment_amount / merchant_amount с ожидаемой суммой заказа.

6. Поллинг статуса (подстраховка к вебхукам)

Endpoint:

POST
https://api.heleket.com/v1/payment/info
Копировать

Передайте 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. Используйте этот метод как периодическую сверку для «зависших» заказов, а не как основной механизм (вебхуки быстрее и дешевле по запросам).

7. Статусы платежа

СтатусФинальныйЗначение
checkнетОжидание появления транзакции в блокчейне.
processнетПлатёж обрабатывается.
confirm_checkнетТранзакция видна, ждём нужное число подтверждений сети.
wrong_amount_waitingнетНедоплата с возможностью доплатить остаток.
paidдаОплачено ровно на нужную сумму. Выдавайте товар.
paid_overдаОплачено больше, чем требовалось. Выдавайте товар.
wrong_amountдаКлиент заплатил меньше, чем требовалось.
failдаОшибка при оплате.
cancelдаПлатёж отменён, клиент не оплатил.
system_failдаСистемная ошибка.
lockedдаСредства заблокированы по программе AML.
refund_processнетВозврат обрабатывается.
refund_paidдаВозврат выполнен.
refund_failдаОшибка при возврате.

Финальный

нет

Значение

Ожидание появления транзакции в блокчейне.

Финальный

нет

Значение

Платёж обрабатывается.

Финальный

нет

Значение

Транзакция видна, ждём нужное число подтверждений сети.

Финальный

нет

Значение

Недоплата с возможностью доплатить остаток.

Финальный

да

Значение

Оплачено ровно на нужную сумму. Выдавайте товар.

Финальный

да

Значение

Оплачено больше, чем требовалось. Выдавайте товар.

Финальный

да

Значение

Клиент заплатил меньше, чем требовалось.

Финальный

да

Значение

Ошибка при оплате.

Финальный

да

Значение

Платёж отменён, клиент не оплатил.

Финальный

да

Значение

Системная ошибка.

Финальный

да

Значение

Средства заблокированы по программе AML.

Финальный

нет

Значение

Возврат обрабатывается.

Финальный

да

Значение

Возврат выполнен.

Финальный

да

Значение

Ошибка при возврате.

Считайте платёж успешным при paid и paid_over. Для статусов вебхука дополнительно встречается confirm_check как промежуточный «почти готово».

8. Обработка ошибок

Ошибки валидации — HTTP 422, state: 1:

{ "state": 1, "errors": { "amount": ["validation.required"] } }
Копировать

Частые сообщения (state: 1, поле message):

СообщениеПричина
The network was not foundПередан неподдерживаемый код сети.
The currency was not foundНеподдерживаемый код в currency.
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Технические работы, платёж временно недоступен.

Причина

Передан неподдерживаемый код сети.

Причина

Неподдерживаемый код в currency.

Причина

Нет сервиса под валюту to_currency.

Причина

Сумма меньше минимума для валюты.

Причина

Сумма больше максимума для валюты.

Причина

Нет активного торгового кошелька под валюту платежа.

Причина

Платежи заблокированы — обратитесь в поддержку.

Причина

Технические работы, платёж временно недоступен.

Внутренняя ошибка — HTTP 500:

{ "message": "Server error, #1", "code": 500, "error": null }
Копировать

На стороне клиента трактуйте Gateway error / Server error / 500 как временные и применяйте повтор с экспоненциальной задержкой.

9. Чек-лист интеграции

  • Мерчант создан и прошёл модерацию; получены Merchant ID и API-ключ платежей.
  • Реализована подпись запросов (MD5 от base64-тела + ключ), учтено экранирование слешей.
  • Создание инвойса через POST /v1/payment с уникальным order_id и заданным url_callback.
  • Эндпоинт вебхука доступен по HTTPS и принимает POST.
  • Проверка вебхука: фильтр по IP 31.133.220.8 и сверка подписи.
  • Обработка вебхука идемпотентна (нет двойной выдачи товара).
  • Товар/услуга выдаётся на paid / paid_over; сумма сверяется.
  • Реализован fallback-поллинг через POST /v1/payment/info.
  • Логируются uuid, order_id, txid, статусы — для разбора спорных платежей.
  • API-ключи хранятся в секретах, не в коде/репозитории.

Справочник кодов валют и сетей, методы возвратов, статические кошельки и выплаты — в соответствующих разделах документации Heleket.