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

Webhook URL

Описание

Задача этого функционала передать данные об оплаченном счете на сервер продавца. Это нужно для того, чтобы автоматически обработать платеж в магазине продавца и выдать товар или услугу вашему покупателю.

WH URL устанавливается индивидуально для каждого проекта в виде ссылки на скрипты и обработчики платежей внутри магазина продавца. Адрес должен быть на https и на доменном имени: IP-адреса не принимаются, сертификат проверяется при каждой отправке.

Каждый раз, когда статус счета сменяется на «Оплачен», сервис отправляет POST запрос на этот URL в следующем формате:

{
"wallet":{
"id":"47aa71e2-07a0-482e-9172-7114d7376ba0",
"name":"usdt-tron",
"blockchain":"tron",
"cryptocurrency":"usdt",
"address":"TKbstUwMzLrfTAGL4erYb7gc7ghmHQ9zG7"
},
"project":{
"id":"9deea1e2-0c08-41a3-bdc2-a34eada3892d",
"name":"My project",
"commissionPayer":"seller",
"commissionRate":1
},
"invoice":{
"id":"a4c9e2ee-9a03-43e5-a1a1-00caf679d16a",
"uid":"AFhygKX21ecd",
"createDatetime":"2024-02-26 13:29:24",
"timeToPayDatetime":"2024-02-27 01:29:24",
"commissionFiatUSD":0.05,
"amountFiatUSD":5.02,
"amountFiat":5,
"calcAmountFiat":5.02,
"currencyFiat":"USD",
"description":null,
"serviceData":null,
"status":"paid"
},
"payment":{
"id":"f986ad8d-2298-473d-982a-efbc817b975d",
"amount":5.02,
"hash":"74763b65e43bcc9492a6ce9a7f26fbfdbd7635aecd3454420b5e9534cba50ee6",
"transactionDatetime":"2024-02-26 13:32:57"
}
}

Уведомление отправляется при любом переходе счета в статус «Оплачен» — и когда сервис нашел платеж автоматически, и когда продавец привязал платеж к счету вручную.

Параметры запроса

ПараметрОписание
wallet.idID кошелька в формате UUID
wallet.nameНазвание кошелька
wallet.blockchainБлокчейн крипто кошелька
wallet.cryptocurrencyКриптовалюта кошелька
wallet.addressАдрес крипто кошелька
project.idID проекта в формате UUID
project.nameНазвание проекта
project.commissionPayerПлательщик комиссии
project.commissionRateРазмер комиссии в %
invoice.idID счета в формате UUID
invoice.uidID счета (для покупателя)
invoice.createDatetimeДата и время создания счета (UTC)
invoice.timeToPayDatetimeДата и время, до которого счет действителен для покупателя (UTC). Поиск платежей по счету продолжается еще 1 час после этой отметки — с учетом медленных сетей. Поэтому уведомление может прийти по счету, который уже отображался как просроченный
invoice.commissionFiatUSDСумма комиссии сервиса. Рассчитывается относительно суммы invoice.amountFiatUSD
invoice.amountFiatUSDСумма в валюте USD. При создании счета рассчитывается по текущему курсу относительно суммы invoice.amountFiat. В момент оплаты перезаписывается фактически поступившей суммой, приведенной к USD по курсу на этот момент. От нее же пересчитывается комиссия в invoice.commissionFiatUSD
invoice.amountFiatОригинальная сумма счета в фиатной валюте. Не меняется
invoice.calcAmountFiatРассчитанная сумма в валюте invoice.currencyFiat по курсу криптовалюты на момент оплаты. Этот параметр может отличаться от суммы в invoice.amountFiat из-за того, что покупатель мог оплатить счет не сразу после создания, а через некоторое время. За это время курс криптовалюты относительно invoice.currencyFiat мог поменяться в любую сторону
invoice.currencyFiatВалюта фиата
invoice.descriptionОписание, которое было задано при создании счета
invoice.serviceDataСлужебные данные, которые были заданы при создании счета
invoice.statusСтатус счета
payment.idID платежа в формате UUID
payment.amountСумма платежа в криптовалюте
payment.hashХэш транзакции в блокчейне
payment.transactionDatetimeДата и время транзакции в блокчейне (UTC)

Подпись уведомления

Каждый запрос подписывается секретом вебхука. Подпись передается в заголовках X-Timestamp и X-Signature и позволяет убедиться, что уведомление отправил сервис, а не посторонний, узнавший адрес вашего обработчика.

Проверяйте подпись до обработки заказа. Механика и готовые примеры — в разделе «Проверка подписи вебхука».

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

Не отклоняйте уведомление по истекшему сроку оплаты. Проверка вида «счет просрочен, значит оплата невалидна» выглядит логично, но отсекает часть реальных платежей: в медленных сетях транзакция может подтвердиться уже после истечения срока, а продавец может привязать платеж к просроченному счету вручную. Факт оплаты подтверждается самим уведомлением.

Сверяйте сумму по оригинальному полю invoice.amountFiat. Это сумма счета в том виде, в каком она была выставлена, она не меняется. Поле amountFiatUSD отражает фактически полученную сумму и может отличаться от выставленной — как из-за движения курса, так и из-за ручной привязки платежа.

Разбирайте суммы как числа. Незначащие нули пропадают: сумма 10.00 придет как 10, для показа форматируйте на своей стороне. Суммы меньше 0.0001 приходят в экспоненциальной записи, например 1.0e-6 — штатный разбор JSON отдаст правильное число, сломается только ручной разбор строки.

Обрабатывайте уведомления идемпотентно. Одно и то же уведомление может прийти повторно — например, если ваш скрипт успешно обработал платеж, но вернул код, отличный от 2xx. Перед выдачей товара проверяйте, не был ли этот invoice.id уже обработан.

Экранируйте значения при выводе. Поля invoice.description и invoice.serviceData возвращаются ровно в том виде, в каком их передал продавец. Если выводите их в HTML — экранируйте на своей стороне.

Периодичность доставки

По адресу WH URL сервер должен ответить с HTTP кодом 2xx. Любой другой код, таймаут или обрыв соединения считаются неудачной доставкой.

Редиректы не выполняются: ответ 301 или 302 — это неудачная доставка, а не переход по новому адресу. Указывайте конечный адрес обработчика.

На соединение отводится 5 секунд, на весь запрос — 10 секунд. Если обработчик не уложился, доставка считается неудачной.

При неудачной доставке сервис отправляет повторные запросы со следующей периодичностью:

  • Через 5 минут после последней неудачной доставки
  • Через 15 минут
  • Через 30 минут
  • Через 1 час
  • Через 3 часа
  • Через 6 часов
  • Через 12 часов
  • Через 24 часа

Дальнейшие попытки доставки уведомления прекращаются.

Отключение WH URL

Иногда WH скрипт интернет-магазина при корректной обработке платежа отдает HTTP код отличный от 2xx. Это приводит к частым повторным периодическим запросам нашим сервером по таймингам, указанным в предыдущем разделе, что дает лишнюю нагрузку на наш и клиентский сервер.

Для предотвращения таких случаев у нас работает механизм отключения WH URL в проекте. Чтобы этого не происходило, выполните следующие шаги:

  1. Измените программный код WH URL так, чтобы при успешной обработке платежа он отдавал код 2xx, обычно 200. Проверьте, используя любой эмулятор, например, Postman.
  2. Напишите в тех. поддержку для коррекции настроек.
  3. Снова включите WH URL в настройках проекта и сохраните проект.