Перейти к содержанию

ДЕЙСТВУЮЩИЙ КОНТРАКТ

Статусы и 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 секунд; при ошибке доставка повторяется фоновой задачей до трёх раз с увеличивающейся задержкой. Обработчик должен допускать повторную доставку одного и того же состояния заявки.