Помощь кассиру

Чек: receipt-v4 и статус

актуальная

Основной сценарий v4 из двух шагов: отправить документ, затем опрашивать статус до результата.

Отправить документ

POST/gate/receipt-v4HTTPTCP

По HTTP добавьте базу контура и заголовок token, см. адреса. По TCP путь тот же, токен не нужен. Поля документа описаны отдельно.

HTTP
curl -X POST 'https://ofd.yaros.kg:8143/ofd-0.0.1/gate/receipt-v4' \
  -H 'token: <токен>' -H 'Content-Type: application/json' \
  -d '{
    "id": "07b2f33c-0eaf-4353-abbf-794654654654",
    "operation": "INCOME",
    "cashless": true,
    "products": [
      { "id": "456587988", "name": "Молоко", "price": 100.00, "quantity": 6.1,
        "vat_value": 12.0, "st_value": 1.0, "calcItemAttributeCode": "0" }
    ]
  }'

Ответ:

JSON
{ "id": "07b2f33c-0eaf-4353-abbf-794654654654", "status": "OK", "info": "Document accepted", "kkmID": "65f1234567890abcdef12345" }

Опросить статус

POST/gate/receipt-status-v4HTTPTCP
HTTP
curl -X POST 'https://ofd.yaros.kg:8143/ofd-0.0.1/gate/receipt-status-v4' \
  -H 'token: <токен>' -H 'Content-Type: application/json' \
  -d '{ "id": "07b2f33c-0eaf-4353-abbf-794654654654" }'
ПолеТипОбяз.Описание
idStringдаid документа
needPrintBooleanнетtrue вернёт печатные поля чека

Ещё не готово:

JSON
{ "status": "PROCESSING", "info": "В процессе" }

Формат итогового ответа и значения статусов описаны в разделе ответ и статусы.

Сколько ждать

ЧтоHTTPTCP
Ответ на receipt-v4до 6 секунд, пока касса заберёт документсразу
Ответ на запрос статусадо 4 секунд внутри запросасразу
Интервал опроса1–2 секунды1 секунда
Общий таймаут операции3–5 минут3–5 минут

Дольше всего идут документы с оплатой картой: клиент физически прикладывает карту. Отказ банка тоже приходит не сразу, а после ожидания на терминале, это обычно от 30 секунд до полутора минут.

POST receipt-v4 (id, документ)
если ответ.status == ERROR:
    прервать, показать ответ.info

пока не истёк таймаут 3–5 минут:
    подождать 1–2 с
    POST receipt-status-v4 (id)
    если status == OK или PAID:  успех, сохранить qr и fdNumber
    если status == CANCELLED:    отменено на терминале
    если status == PROCESSING:   продолжить
    если status == ERROR:
        если info == "Request already working": продолжить
        иначе: неуспех, показать info

таймаут истёк:
    не считать документ непроведённым
    повторить receipt-status-v4 позже с тем же id

Повторы и обрывы связи

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

Что случилосьЧто делать
Нет ответа на receipt-v4повторить с тем же id, второй чек не пробьётся
Нет ответа на статусповторить запрос статуса
ERROR по существу: сумма возврата, смена, банкисправить документ и отправить с тем же id, он будет принят как новый
ERROR «Превышено время обработки документа»повтор не снимает ошибку: касса могла ещё вести документ. Спрашивайте статус, а затем проверьте поиском
CANCELLEDоплата отменена, для новой попытки нужен новый id
Нет результата, а заказ нужно провести сновасначала найдите чек по старому id. Нашёлся: второй пробивать нельзя

Результат по HTTP остаётся доступным и через сутки: сервер ищет чек в своей базе по id. По TCP результат живёт в памяти приложения, перезапуск его стирает.

Что ответит повтор

Эти ответы приходят со status: OK: документ уже известен, повторно он пробит не будет.

infoКаналЗначение
Document acceptedHTTPдокумент передан кассе
Документ принятTCPдокумент поставлен в очередь
Документ уже принятTCPдокумент с этим id уже в работе
For this request result alrady existsHTTPрезультат уже есть в сессии, опечатка в слове есть и в ответе сервера
For this request result alrady exists in DBHTTPчек с этим id уже пробит
Результат по документу уже полученTCPрезультат уже есть в памяти кассы

Смотрите также