Открыть меню

Сценарии сбоев ATM — обзор

Создано 5 мая 2026 г. Обновлено 2 июн. 2026 г. 4 мин чтения

Справочная заметка ATM: Сценарии сбоев ATM — обзор.

Сценарии сбоев ATM — обзор

Классификация сбоев

Сбои делятся по точке возникновения и по финансовым последствиям:

mindmap
  root((ATM Failures))
    Сеть/Хост
      Timeout авторизации
      Потеря соединения
      Network unreachable
    Диспенсер
      No Dispense
      Partial Dispense
      Jam банкнот
      Кассета пуста
    Карта
      Card Read Error
      Card Capture
      Chip fallback
    Клиент
      PIN timeout
      Session timeout
      Cash not taken
    Хост
      Decline
      Invalid response
      Format error
    Питание
      Power failure mid-txn
      UPS expired

Матрица сценариев — финансовые последствия

СценарийАвторизацияДеньги выданыReversalФинансовый исход
DeclineНетНетНе нуженНет списания
Timeout (нет ответа)НеизвестноНетНуженЗависит от результата reversal
No DispenseДа (Approved)НетНуженReversal восстанавливает средства
Partial DispenseДаЧастичноНужен (на разницу)Списывается фактически выданная сумма
Cash not taken (Retract)ДаВыдано, возвращеноЗависит от схемыФинансово завершена (деньги у банка)
Card CaptureНетНетНе нуженНет списания
Power failure after approveДаНеизвестноОбязателен при восстановленииТребует расследования
Format ErrorНетНетНе нуженНет списания

Сводная схема обработки сбоев

flowchart TD
    TXN[Транзакция отправлена\nISO 8583 0200]
    
    TXN --> RESP{Ответ получен?}
    
    RESP -->|Нет, таймаут| TO_PATH[Timeout Path]
    RESP -->|Да| PARSE{F39 = ?}
    
    TO_PATH --> TO_REV[Reversal 0420\nF39 неизвестен]
    TO_REV --> TO_RETRY{Reversal\nдоставлен?}
    TO_RETRY -->|Нет| TO_QUEUE[Reversal в очередь\nповторная отправка]
    TO_RETRY -->|Да| TO_END[Сессия закрыта\nОшибка клиенту]
    
    PARSE -->|00 Approved| DISP_PATH[Dispense Path]
    PARSE -->|Decline код| DECLINE[Decline Path]
    PARSE -->|96 Sys Error| SYS_ERR[System Error Path]
    
    DISP_PATH --> DISP{Купюры\nвыданы?}
    DISP -->|Да, OK| SHUTTER[Shutter Open\nОжидание клиента]
    DISP -->|Нет, сбой| ND_REV[No-Dispense Reversal 0420]
    DISP -->|Частично| PART_REV[Partial Reversal 0420\nF95 = фактическая сумма]
    
    SHUTTER --> TAKEN{Деньги взяты?}
    TAKEN -->|Да| SUCCESS[Транзакция успешна]
    TAKEN -->|Нет, таймаут| RETRACT[Retract\nВозврат в кассету]
    RETRACT --> RETRACT_EJ[Запись в EJ:\nReturned-not-taken]
    
    DECLINE --> SHOW_ERR[Показать код ошибки клиенту]
    SHOW_ERR --> CAPTURE{F39 = 41/43?}
    CAPTURE -->|Да| CARD_CAP[Card Capture\nКарта изъята]
    CAPTURE -->|Нет| EJECT[Вернуть карту]
    
    SYS_ERR --> SYS_RETRY{Retry?\n< max retries}
    SYS_RETRY -->|Да| TXN
    SYS_RETRY -->|Нет| SYS_FAIL[Fatal error\nATM Out of Service]

Приоритет сообщений при сбое

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

  1. Reversal отправляется немедленно при обнаружении сбоя
  2. Если reversal не доставлен — хранится в reversal queue (персистентная очередь)
  3. После восстановления связи — reversal отправляется повторно
  4. Reversal должен быть доставлен до следующей транзакции на этом терминале
  5. Некоторые схемы принимают reversal в течение 24–72 часов

[!warning] Потеря reversala Если reversal не доставлен и хост не получил подтверждение — клиент может быть списан за невыданные деньги. Это dispute (опротестование). Разрешается через chargeback процесс карточной схемы.


Логирование сбоев (Electronic Journal)

Каждый сбой должен быть зафиксирован в EJ с полным контекстом:

[2026-05-05 14:23:41] TXN START    STAN=123456 PAN=****1234 AMT=5000 RUB
[2026-05-05 14:23:41] AUTH SENT    MTI=0200 HOST=192.168.1.100
[2026-05-05 14:23:71] AUTH TIMEOUT no response in 30s
[2026-05-05 14:23:71] REVERSAL     MTI=0420 STAN=123456
[2026-05-05 14:23:72] REV ACK      MTI=0430 F39=00
[2026-05-05 14:23:72] TXN END      STATUS=REVERSED reason=TIMEOUT

Восстановление после сбоя питания

sequenceDiagram
    participant ATM as ATM App
    participant EJ as EJ Storage
    participant HOST as ACQ Switch

    Note over ATM: Питание восстановлено\nATM перезагружается

    ATM->>EJ: Читать последнюю незавершённую транзакцию
    EJ-->>ATM: TXN {STAN, PAN, AMT, STATUS=IN_PROGRESS}

    ATM->>ATM: Определить состояние диспенсера\nБыли ли выданы деньги?

    alt Деньги в transport/shutter (не выданы клиенту)
        ATM->>ATM: Retract деньги
        ATM->>HOST: Reversal 0420 {STAN, F95=0}
        HOST-->>ATM: 0430 acknowledged
    else Состояние диспенсера неизвестно
        ATM->>HOST: Reversal 0420 {STAN, F95=0}
        Note over ATM,HOST: Банк расследует по EJ\nи камерам
    end

    ATM->>EJ: Mark TXN as REVERSED
    ATM->>ATM: Перейти в In Service

Связанные заметки

Ссылаются на эту заметку

Источник: публичный слой Obsidian Vault.