Тема
Статусы и стадии транзакции
Состояние платежа в системе описывается тремя независимыми полями, и это первое, обо что спотыкается новый разработчик. Короткий ответ: статус нужен мерчанту, стадия — нам, расширенный статус — только двухстадийным платежам.
Статус: что сообщаем наружу
Основное поле, которое видит мерчант и по которому принимаются денежные решения. Значений всего четыре:
| Статус | Что означает |
|---|---|
| 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_APPROVED | ACS подтвердил плательщика, платёж уходит на списание |
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.