Чек: receipt-v4 и статус
актуальнаяОсновной сценарий v4 из двух шагов: отправить документ, затем опрашивать статус до результата.
Отправить документ
/gate/receipt-v4HTTPTCPПо HTTP добавьте базу контура и заголовок token, см. адреса. По TCP путь тот же, токен не нужен. Поля документа описаны отдельно.
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" }
]
}'curl -X POST 'http://192.168.0.50:8090/gate/receipt-v4' \
-H 'Content-Type: application/json' -H 'Expect:' \
-d '{ … то же тело … }'Ответ:
{ "id": "07b2f33c-0eaf-4353-abbf-794654654654", "status": "OK", "info": "Document accepted", "kkmID": "65f1234567890abcdef12345" }Опросить статус
/gate/receipt-status-v4HTTPTCPcurl -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" }'curl -X POST 'http://192.168.0.50:8090/gate/receipt-status-v4' \
-H 'Content-Type: application/json' -H 'Expect:' \
-d '{ "id": "07b2f33c-0eaf-4353-abbf-794654654654" }'| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
id | String | да | id документа |
needPrint | Boolean | нет | true вернёт печатные поля чека |
Ещё не готово:
{ "status": "PROCESSING", "info": "В процессе" }Формат итогового ответа и значения статусов описаны в разделе ответ и статусы.
Сколько ждать
| Что | HTTP | TCP |
|---|---|---|
Ответ на 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 accepted | HTTP | документ передан кассе |
Документ принят | TCP | документ поставлен в очередь |
Документ уже принят | TCP | документ с этим id уже в работе |
For this request result alrady exists | HTTP | результат уже есть в сессии, опечатка в слове есть и в ответе сервера |
For this request result alrady exists in DB | HTTP | чек с этим id уже пробит |
Результат по документу уже получен | TCP | результат уже есть в памяти кассы |