Введение

Данный документ является руководством программиста для интеграции с программной кассой (ПК).

Вся интеракция с ПК происходит без взаимодейтсвия с пользователем. Исключением является:

  • Ожидание прикладывания карты пользователем.

Способы взаимодействия

  • Android Intent
    • Для взаимодействия с ПК по интентам необходимо создать Intent передав в него тип action - by.ikassa.smartx.android.TRANSACTION. Пример: val intent = Intent("by.ikassa.smartx.android.TRANSACTION")
  • HTTP Сервер
    • Для взаимодействия с ПК по HTTP, необходимо включить режим сервера в настройках кассы.
    • Отправка происходит через POST запросы используя порт 37015 по адресу v1. Пример: http://192.168.1.2:37015/v1

Для выбора типа операции необходимо предать Header с ключом INTENT_OPERATION_TYPE и значением из доступнх типов операций. Регистр ключа ОБЯЗАН быть передан в верхнем регистре. Значение передаваемое по ключу регистронезависимо и может быть передано в любом регистре. При получении неизвестного типа операции или его отсутсвии будет выброшена ошибка.

SSDP (Simple Service Discovery Protocol)

  • Пример запроса на python

    • ssdp discover --st 'ikassa-smartx'
  • Пример ответа

{
[::ffff:192.168.88.91]:41724 - - [Wed May 15 17:02:11 2024] HTTP/1.1 200 OK
ST: ikassa-smartx
USN: uuid:dcc76660-c8f5-11ed-afa1-0242ac120002
LOCATION: http://192.168.88.91:37015
SERIAL_NUMBER: AVQ11129961000
REG_NUMBER: 129961000
}
  • LOCATION - ip-адрес устройства и порт.
  • SERIAL_NUMBER: серийный номер СКО.
  • REG_NUMBER: регистрационный номер СКО.

Способы авторизации

  • Для того чтобы работать с кассой, необходима авторизация. После успешной авторизации, касса остается авторизована, до перезапуска ПК.
  • При передаче специального флага, ПК помимо авторизации вернет token. Этот токен валиден в течение 24 часов и дает возможность автоматической авторизации в случае если ПК была перезапущена. Для использования этой возможности необходимо передать полученный token в Header с ключом Auth-token.

Способы передачи INTENT_OPERATION_TYPE

Типом операции во всех случаях является строка String

  • Android Intent
    • Добавить поле в интент intent.putExtra("INTENT_OPERATION_TYPE", #ТипОперации#).
  • HTTP Сервер
    • Передать в Header запроса ["Content-Type": "application/json"]
    • Передать в Header запроса ["INTENT_OPERATION_TYPE": #ТипОперации#].

Способы передачи Auth-token

Типом операции во всех случаях является строка String

  • Android Intent
    • Добавить поле в интент intent.putExtra("Auth-token", #Токен#).
  • HTTP Сервер
    • Передать в Header запроса ["Auth-token": #Токен#].

Способы передачи тела запроса

Телом операции в запросах является Json строка String.

  • Android Intent
    • Добавить поле в интент intent.putExtra("INTENT_OPERATION_DATA", #JsonСтрока#).
  • HTTP Сервер
    • Передать в теле запроса Json строку.

Параметр финиширования активити

Передать в queryParam запроса closeActivity=true

Пример запроса:

suspend fun send() {
  val response: String = client.post("http://192.168.88.18:37015/v1?closeActivity=true", A(cashier = "admin", sum = "100")) {
  contentType(ContentType.Application.Json)
  header("INTENT_OPERATION_TYPE", "DEPOSIT")
}
println(response)

Получение ответа

В качестве ответа ПК возвращает обратно Json строку с обязательными полями вида Подробнее:

{    
    "messageDetail": "Успешная оплата",
    "messageTitle": "Успех",
    "registerNumberSKO": "123456789",
    "resultCode": 200,
    "type": "SALE"
}
  • Android Intent
    • Проверить resultCode на ошибку:
      • -1 (Activity.RESULT_OK) – ОК.
      • -2 – Ошибка.
    • Использовать ключ INTENT_OPERATION_RESULT_INFO для получения результата. Пример: val json = intent.getStringExtra("INTENT_OPERATION_RESULT_INFO").
  • HTTP Сервер
    • Проверить статус ответа:
      • 200 - ОК
      • 400 - Ошибка
    • Получить результат из body ответа.