ДЕЙСТВУЮЩИЙ КОНТРАКТ
Статусы и callback¶
EasyTokenPay отправляет POST с JSON на URL, настроенный администратором для
мерчанта. Набор отправляемых статусов также задаётся в настройках мерчанта.
{
"merchant": "service_merchant",
"order_uuid": "71f25851-28d3-47eb-8770-51f717f5821e",
"status": "SUCCESSFULLY_FINISHED",
"real_income": "100000.000000",
"currency": "UZS",
"signature": "0123456789abcdef..."
}
signature присутствует только если для мерчанта настроен секрет callback.
Уведомления о выплатах приходят в другом формате и на отдельно настраиваемый
URL — см. callback по выплатам.
Значения статуса¶
| Статус | Значение |
|---|---|
BRAND_NEW |
Новая заявка |
IN_PROGRESS |
В работе у трейдера |
UNFINISHED_WITH_RECALCULATION |
Передана другая фактическая сумма |
IN_DISPUTE |
Открыт диспут |
SUCCESSFULLY_FINISHED |
Успешно завершена |
AUTO_APPROVED |
Автоматически подтверждена |
AUTO_APPROVED_DISPUTE |
Диспут подтверждён автоматически |
FINISHED_WITH_RECALCULATION |
Завершена с перерасчётом |
REQUISITES_NOT_FOUND |
Реквизит не найден |
TIME_OUT |
Истёк срок |
CANCELED_WITH_RECALCULATION |
Перерасчёт отклонён |
CANCELED |
Заявка отклонена |
Полная таблица с короткими кодами, группами состояний и действиями мерчанта доступна в справочнике статусов.
Для REQUISITES_NOT_FOUND основным уведомлением является синхронный ответ
404 на создание заявки. Не ожидайте отдельный callback для этого результата.
Не считайте callback единственным источником состояния. Если доставка задержалась или ответ был потерян, получите статус через API.
Проверка подписи¶
Подпись — HMAC-SHA256 от JSON без поля signature. Текущая реализация
формирует строку стандартным json.dumps Python с исходным порядком полей:
merchant, order_uuid, status, real_income, currency.
import hashlib
import hmac
import json
def verify_callback(payload: dict, secret: str) -> bool:
received = payload.get("signature", "")
unsigned = {key: value for key, value in payload.items() if key != "signature"}
message = json.dumps(unsigned).encode("utf-8")
expected = hmac.new(secret.strip().encode("utf-8"), message, hashlib.sha256).hexdigest()
return hmac.compare_digest(received, expected)
Отвечайте любым кодом 2xx только после сохранения события. Тайм-аут одного
запроса составляет 5 секунд; при ошибке доставка повторяется фоновой задачей
до трёх раз с увеличивающейся задержкой. Обработчик должен допускать повторную
доставку одного и того же состояния заявки.