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

Оплата картой без чека

только TCP

Запустить оплату на терминале и получить результат по TCP. Чек не пробивается.

Простой локальный метод для кассовых систем, которым нужна только банковская операция. Запустить её можно и документом с fiscal: false, см. способы оплаты: он работает на обоих каналах и даёт полный протокол v4.

Как это работает

 Клиент                   YaKassa                     Банк
   │  GET /payment            │                         │
   │  amount, processId ────► │ запуск оплаты ────────► │
   │  ◄── status=wait         │                         │
   │  GET /status?processId=… │                         │
   │  ──────────────────────► │                         │
   │  ◄── status=wait         │ ◄── результат операции ─│
   │  GET /status?processId=… │                         │
   │  ──────────────────────► │                         │
   │  ◄── success или fail    │                         │
ПараметрЗначение
Адресhttp://<IP кассы>:<порт>, порт по умолчанию 8090
Методтолько GET, параметры в строке запроса
ОтветJSON в UTF-8
Авторизациянет
Соединениеодин запрос, один ответ, затем сокет закрывается

На кассе должны быть включены TCP сервер и настроена безналичная оплата.

Запустить оплату

GET/paymentTCP
Командная строка
curl --get 'http://192.168.0.50:8090/payment' \
  --data-urlencode 'amount=250.00' \
  --data-urlencode 'processId=61d770e8-7c70-4d2f-b3f4-e4b1dbac4462'
ПолеТипОбяз.Описание
amountDecimalдасумма, разделитель точка или запятая. Передавайте положительную сумму с двумя знаками
processIdStringдауникальный идентификатор операции, лучше UUID v4
JSON
{ "processId": "61d770e8-7c70-4d2f-b3f4-e4b1dbac4462", "status": "wait", "amount": 250.00 }

wait значит только, что запрос передан в обработку. Он не подтверждает списание денег.

Получить результат

GET/statusTCP
Командная строка
curl --get 'http://192.168.0.50:8090/status' \
  --data-urlencode 'processId=61d770e8-7c70-4d2f-b3f4-e4b1dbac4462'

Опрашивайте раз в секунду. Общий таймаут ставьте не меньше времени, которое даёт банк, обычно 2–4 минуты. Истечение таймаута у вас не означает отказ банка.

Успех
{
  "processId": "61d770e8-7c70-4d2f-b3f4-e4b1dbac4462",
  "status": "success",
  "amount": 250.00,
  "chequeInfo": { "method": "card", "rrn": "123456789012" }
}
ПолеОписание
processIdидентификатор запроса
statuswait, success или fail
amountсумма операции
chequeInfo.methodспособ, всегда card
chequeInfo.rrnRRN банка. Поля нет, если банк его не вернул

Повторы и занятая касса

Терминал один, поэтому оплата идёт только одна.

ЗапросЧто ответит касса
Повтор /payment с тем же processId, оплата идёттекущее состояние, вторая оплата не запускается
Повтор /payment с тем же processId, оплата успешнасохранённый результат
/payment с другим processId, пока идёт оплатакод 400, Касса занята оплатой на сумму …, идёт процесс …

Если результат так и не пришёл, через 5 минут касса освобождается для новых оплат.

После обрыва связи нельзя создавать новый processId и сразу повторять списание. Сначала вызовите /status со старым идентификатором, иначе возможна двойная оплата.

Успешный результат хранится на кассе и переживает перезапуск приложения. Отказ хранится только в памяти: после перезапуска /status ответит ошибкой Result not found by processId ….

Ошибки

JSON
{ "status": "fail", "message": "описание ошибки" }
HTTPУсловиеmessage
400нет amountamount absent
400неверная суммаamount error
400нет processIdprocessId absent
400безнал не настроенon terminal not settings for card pay
400результат не найденResult not found by processId …
400идёт другая оплатаКасса занята оплатой на сумму …, идёт процесс …
404метод не GETmethod POST not supported
500внутренняя ошибкатекст ошибки

Проверяйте и код HTTP, и поле status: часть ошибок разбора запроса приходит с кодом 200 и телом status: fail.

Чего здесь нет

Метод только запускает оплату и выдаёт её статус. Здесь нет авторизации, возврата, отмены и причины отказа банка. Значения параметров не декодируются, поэтому processId передавайте латинскими буквами и цифрами, а сумму без пробелов. Для возвратов используйте документ обмена.

Рекомендации

План проверки

  1. Новая оплата: wait, затем success.
  2. Отказ или отмена: wait, затем fail.
  3. Неизвестный processId в /status.
  4. Повторный /payment после успеха.
  5. Потеря соединения после /payment и восстановление через /status.
  6. Перезапуск YaKassa после успешной операции.
  7. Неверная и отсутствующая сумма, отсутствующий processId.
  8. Оплата при ненастроенном безнале.
  9. Вторая оплата, пока идёт первая.

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