Skip to content

Статусы и стадии транзакции

Состояние платежа в системе описывается тремя независимыми полями, и это первое, обо что спотыкается новый разработчик. Короткий ответ: статус нужен мерчанту, стадия — нам, расширенный статус — только двухстадийным платежам.

Статус: что сообщаем наружу

Основное поле, которое видит мерчант и по которому принимаются денежные решения. Значений всего четыре:

СтатусЧто означает
NEWТранзакция создана, но в банк ещё не уходила
IN_PROCESSОтправлена в банк, ждём результата
COMPLETEУспех: деньги списаны, баланс мерчанта пересчитан
ERRORОтказ: банка, антифрода, валидации или по таймауту

Переходы жёсткие и однонаправленные:

Два правила, которые важно знать до того, как вы что-то поменяете в коде:

COMPLETE и ERROR — терминальные. Повторный ответ банка по закрытой транзакции её не изменит. Исключение одно — режим принудительной перепроверки, которым пользуются вручную при разборе инцидентов, и он снимает проверку текущего статуса. Это сделано намеренно: финализация меняет баланс мерчанта, и повторное применение исказило бы деньги.

Переход в IN_PROCESS атомарный. Он выполняется одной операцией с проверкой текущего статуса, чтобы два параллельных запроса не отправили один платёж в банк дважды.

Стадия: что происходит внутри обработки

Статуса недостаточно: между «отправлена в банк» и «есть результат» проходит сложный путь, и подавляющее большинство живых транзакций висит в IN_PROCESS. Стадия — это подсостояние внутри него, и значений у неё несколько десятков. Устанавливают её драйверы: банк сообщает, что происходит, драйвер переводит это в нашу стадию.

Значений несколько десятков, но именно эти встречаются чаще всего и стоит узнавать по имени, когда они попадаются в транзакции при разборе:

СтадияКогда стоит
NEWТранзакция только создана, обработка не начиналась
NEED_AUTHORIZATIONДвухстадийный платёж: сумма ещё не заблокирована
AUTHORIZEDДвухстадийный платёж: сумма заблокирована, ждём списания или отмены
INITIATE_AUTHENTICATIONНачали запрос на 3DS
AUTHENTICATE_PAYERЖдём действие плательщика на стороне 3DS
THREEDSПлательщик на странице ACS
THREEDS2_WAIT_CALLBACKЖдём уведомление браузера при 3DS второй версии
THREEDS_RETURNED_WAIT_STATUSПлательщик вернулся с ACS, спрашиваем у банка итог
ACS_APPROVEDACS подтвердил плательщика, платёж уходит на списание
BANK_PAYMENT_FORMПлательщик на форме банка, а не на нашей
PAYИдёт непосредственное списание в банке
WAITING_CONTINUE_BALANCER_ACTIONПауза балансировщика между попытками каскада
WAITING_FTD_PROBE_THREE_DSЖдём 3DS проверочного платежа (FTD-probe)
WAIT_FTD_PROBE_FINISHEDПроверочный платёж выполняется, основной ждёт его исхода
SPLIT_WAITРазделённая выплата: ждём результата частей
SPLIT_FINALIZINGВсе части выплаты отработали, считается общий результат
FINALОбработка внутри IN_PROCESS закончена, дальше решает статус

Это не весь перечень: часть значений специфична для конкретных интеграций и в эту таблицу не попала. Полный список смотрите в коде ядра, если понадобится редкое значение — дублировать его здесь бессмысленно, он меняется вместе с драйверами. Что стоит запомнить: единой схемы переходов стадий не существует. Последовательность зависит от драйвера и типа платежа, поэтому «правильная» стадия определяется конкретной интеграцией, а не общим правилом.

Расширенный статус: только для двухстадийных

Третье поле касается платежей с разделением на авторизацию и списание, когда деньги сначала блокируются на карте, а списываются позже. Оно принимает значения вроде «авторизован», «списан», «отменён», «не удался» и уходит мерчанту отдельным полем в колбеке. Для обычного одностадийного платежа это поле неинтересно — см. Двухстадийные платежи.

Как этим пользоваться при разборе инцидента

Начинайте с пары «статус и стадия» — она почти однозначно указывает на шаг, где всё остановилось:

  • NEW и не двигается — платёж не дошёл до банка: не нашёлся гейт, сработал лимит или антифрод. Смотрите категорию ошибки и логи балансировщика.
  • IN_PROCESS на стадии 3DS — плательщик ушёл на страницу банка и не вернулся. Ждём таймаут или переспрос статуса.
  • IN_PROCESS на стадии ожидания колбека — банк не прислал уведомление; проверьте, работает ли очередь переспроса.
  • COMPLETE, а мерчант жалуется — вопрос не к платежу, а к доставке колбека.

Сопоставление шагов флоу со статусами — на странице Платёж картой server-to-server.

Внутренняя база знаний. Нашли неточность — поправьте страницу или заведите вопрос в разделе «Открытые вопросы».