Открыть меню

No Dispense и Reversal

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

Справочная заметка ATM: No Dispense и Reversal.

No Dispense и Reversal

No Dispense — определение

No Dispense — ситуация, когда:

  1. Хост одобрил транзакцию (F39=00, MTI 0210)
  2. ATM попытался выдать банкноты
  3. Банкноты не были выданы и не были предъявлены клиенту из-за механического сбоя, jam, пустой кассеты, ошибки сенсора, timeout устройства или сбоя терминального ПО.

Финансовый риск: без reversal клиент списывается за деньги, которые не получил.

No dispense нужно отделять от cash presented but not taken: если деньги были предъявлены в shutter, но клиент их не забрал, правила обработки могут быть другими.


Причины No Dispense

ПричинаОписаниеXFS Error
Mechanical jamБанкноты застряли в транспортном механизмеWFS_ERR_CDM_TOOMANYITEMS
Shutter failureЗатвор не открылся / не закрылсяWFS_ERR_CDM_SHUTTERNOTOPEN
Empty cassetteКассета опустела в момент выдачиWFS_ERR_CDM_CASHUNITERROR
Double detectДвойная подача, банкноты отправлены в rejectБанкноты в reject кассете
Sensor errorСенсорный сбой во время транспортировки
Power failureПитание пропало во время диспенсирования

Sequence Diagram — No Dispense Reversal

sequenceDiagram
    autonumber
    participant CH as Cardholder
    participant APP as ATM App
    participant XFS as XFS/CDM
    participant ACQ as ACQ Switch
    participant CS as Card Scheme
    participant ISS as Issuer Auth

    APP->>ACQ: ISO 8583 0200 (Withdrawal 5000 RUB)
    ACQ->>CS: 0200 forward
    CS->>ISS: 0200 route
    ISS->>ISS: Approved\nHold funds
    ISS-->>CS: 0210 F39=00
    CS-->>ACQ: 0210 F39=00
    ACQ-->>APP: 0210 F39=00 APPROVED

    APP->>XFS: Dispense {5000 RUB}
    XFS->>XFS: Transport banknotes...
    Note over XFS: ❌ JAM — механический сбой
    XFS-->>APP: DispenseFail\nWFS_ERR_CDM_TOOMANYITEMS

    APP->>APP: Detect: Approved but not dispensed\n→ Must send Reversal

    APP->>ACQ: ISO 8583 0420 (Reversal Advice)\nF2=PAN\nF3=010000\nF4=000000500000\nF90={original MTI, STAN, date}\nF95=000000000000 (replacement amt=0)

    Note over APP,ACQ: Reversal Advice (0420) не требует\nподтверждения для продолжения\n(fire-and-forget с retry)

    ACQ->>CS: 0420 forward
    CS->>ISS: 0420 route
    ISS->>ISS: Release hold\nRestore 5000 RUB

    ISS-->>CS: 0430 F39=00
    CS-->>ACQ: 0430 F39=00
    ACQ-->>APP: 0430 Reversal Acknowledged

    APP->>XFS: Eject Card
    XFS-->>CH: Карта возвращена
    APP->>CH: Показать: "Операция не выполнена.\nСредства не списаны.\nОбратитесь к администратору"

    APP->>APP: Log в EJ:\nSTATUS=NO_DISPENSE\nREVERSED=true
    APP->>APP: Trigger: Диспенсер — Out of Service
    APP->>APP: ATM: частичный Out of Service

ISO 8583: Поля Reversal (MTI 0420)

FieldНазваниеЗначение
MTIMessage Type Indicator0420 (Reversal Advice)
F2PANТот же, что в оригинале
F3Processing CodeТот же, что в оригинале
F4Transaction AmountОригинальная сумма
F7Transmission Date/TimeТекущее время
F11STANНовый STAN для reversal
F38Authorization CodeИз ответа 0210
F39Response CodeПусто (не используется в запросе)
F41Terminal IDТот же
F90Original Data ElementsMTI + STAN + Date + Acq ID + Fwd ID
F95Replacement Amounts0 (no dispense) или фактическая сумма (partial)

F90 — Original Data Elements (критически важен):

F90 = Original MTI (4) + Original STAN (6) + 
      Original Transmission Date/Time (10) + 
      Original Acquirer ID (11) + Original Forwarding ID (11)

Partial Dispense

Partial Dispense — выдана только часть суммы (например, запрошено 5000, выдано 3000).

Отдельная логика:

СценарийЧто произошло физическиТиповая финансовая логика
No dispenseКлиенту ничего не предъявленоFull reversal / отмена суммы, если оригинал был авторизован
Partial dispenseКлиент получил часть суммыКорректировка до фактически выданной суммы; механизм зависит от сети и профиля ISO 8583
Cash presented but not takenДеньги были предъявлены, но клиент не забрал их до timeoutНе считать автоматически no dispense; смотреть правила схемы, EJ, retract cassette и видео
sequenceDiagram
    participant APP as ATM App
    participant XFS as XFS/CDM
    participant ACQ as ACQ Switch
    participant ISS as Issuer Auth

    APP->>ACQ: 0200 F4=000000500000 (5000)
    ACQ-->>APP: 0210 F39=00

    APP->>XFS: Dispense 5000
    XFS->>XFS: Выдано 3000\nJam на 4-й купюре
    XFS-->>APP: PartialDispense {dispensed=3000, failed=2000}

    APP->>XFS: Open Shutter (3000)
    XFS-->>APP: Cash taken

    Note over APP: Выдано 3000 из 5000\nНужен Partial Reversal на 2000

    APP->>ACQ: 0420 Reversal Advice\nF4=000000500000 (original)\nF95=000000300000 (actual dispensed=3000)

    Note over APP,ACQ: F95 указывает фактически\nвыданную сумму\nСписывается только 3000
    ACQ->>ISS: 0420 with F95
    ISS->>ISS: Adjust: hold 5000\nCharge only 3000\nRelease 2000

    ISS-->>ACQ: 0430 F39=00
    ACQ-->>APP: 0430

Reversal Queue — механизм повторной отправки

ATM хранит неподтверждённые reversals в персистентной очереди (файл или БД на диске):

flowchart TD
    FAIL[Reversal создан\nNo Dispense / Timeout]
    SEND[Отправить 0420]
    ACK{0430 получен?}
    QUEUE[Добавить в Reversal Queue\nПерсистентное хранилище]
    RETRY[Retry при следующей\nвозможности связи]
    SENT[Пометить как delivered\nУдалить из очереди]
    MAXRETRY{Max retries\nисчерпаны?}
    ALERT[Alert: Failed Reversal\nТребует ручного расследования]

    FAIL --> SEND
    SEND --> ACK
    ACK -->|Да| SENT
    ACK -->|Нет| QUEUE
    QUEUE --> RETRY
    RETRY --> ACK
    MAXRETRY -->|Да| ALERT
    MAXRETRY -->|Нет| RETRY

Важно:

  • Очередь должна быть спроектирована так, чтобы переживать перезагрузку ATM.
  • Приоритет и порядок повторной отправки reversal определяются terminal software, процессингом и правилами сети.
  • Допустимые сроки доставки и retry policy зависят от платёжной схемы и профиля процессинга.

Dispute и Chargeback при неудачном Reversal

Если reversal не доставлен или отклонён:

flowchart LR
    A[Клиент обращается в банк\nДеньги списаны, не выданы]
    B[Банк-эмитент создаёт\nChargeback]
    C[Card Scheme\nарбитраж]
    D[Банк-эквайер предоставляет\nEJ + видео + reversal logs]
    E{Reversal был\nуспешным?}
    F[Chargeback accepted\nСредства возвращены]
    G[Dispute resolved in\nfavor of acquirer]

    A --> B --> C --> D --> E
    E -->|Нет| F
    E -->|Да| G

Доказательства для dispute:

  • Electronic Journal (EJ) ATM
  • Запись камеры ATM
  • Логи reversal (отправлен/доставлен)
  • Логи диспенсера (что именно произошло)
  • Данные из reject/retract кассет (физический счёт)

Что требует проверки

  • Конкретные MTI, поля replacement amounts и правила retry зависят от профиля ISO 8583 и платежной схемы.
  • Для Mastercard есть публичное правило: acquirer не должен автоматически делать full/partial reversal авторизованной ATM transaction только потому, что cardholder не забрал cash.
  • Для МИР/НСПК публичные Правила ПС «Мир» дают общую рамку по авторизации, представлению операций на клиринг, отмене операций в целях исправления ошибок, документам по операциям и спорным ситуациям. Но точные message-level правила no-dispense/partial-dispense reversal требуют актуальных стандартов/руководств НСПК для участников системы.
  • Для Visa/UnionPay также нужно смотреть соответствующие operating rules.
  • Формулировка клиентского сообщения “Средства не списаны” допустима только если ATM/host уверены в успешной отмене или локальная политика разрешает такую коммуникацию.

Типы MTI Reversal в ISO 8583

MTIТипОписание
0400Reversal RequestATM инициирует, ждёт подтверждения (синхронно)
0410Reversal ResponseОтвет на 0400
0420Reversal AdviceATM инициирует, не ждёт (fire-and-forget, с retry)
0430Reversal Advice ResponseПодтверждение получения 0420

[!info] 0420 vs 0400 В отдельных ATM-профилях используется 0420 (Advice): терминал может сохранить сообщение в очереди и доставить его позднее. Выбор между 0400, 0420 и другими вариантами зависит от профиля ISO 8583, процессинга и правил сети.


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

Источники

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

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