Работа с ТС ПИоТ

Если ваше приложение заменяет кассовый интерфейс, то возникает необходимость выполнять проверку кодов маркировки до добавления всех позиций в чек (командой OpenXXXXReceiptCommand или PrintXXXXReceiptCommand). Это нужно, чтобы сразу после сканирования марки предупредить пользователя о том, что марка не прошла проверку. Раньше можно было самостоятельно обратиться к true-api «Честного знака» с помощью токена пользователя. В скором времени обращаться к true-api напрямую будет запрещено, проверка будет доступна только с помощью ТС ПИоТ.

На смарт-терминалы Эвотор ТС ПИоТ устанавливается отдельным приложением «ЕСМ» через Эвотор.Маркет. Чтобы выполнять проверку марок через это приложение, мы предоставили специальный сервис в rc01-v0.6.35.

Процесс прохождения сертификации

Для проверки марок через ТС ПИоТ недостаточно просто подключиться к сервису в интеграционной библиотеке, требуется пройти сертификацию, чтобы получить специальные идентификаторы, которые добавляются в манифест вашего приложения.

Как выглядит процесс сертификации

  1. Запросите по почте developer@evotor.ru ПФС (программа испытаний от ЦРПТ), а также тестовую версию ТС ПИоТ (для работы через МГМ).
  2. Поддержите проверку марки через нашу интеграционную библиотеку в своем ПО.
  3. Отправьте на почту developer@evotor.ru запрос на прохождение сертификации. Эвотор сертифицирует интеграции с ПМСР Эвотор. Данные о прохождении сертификации направляются в ЦРПТ.
  4. На сертификации разработчик показывает в своем ПО прохождение сценариев из ПФС (программа испытаний от ЦРПТ). Разработчик при тестировании на своей стороне также должен опираться на этот список сценариев.
  5. После того, как ПО успешно прошло все сценарии из ПФС, Эвотор направляет в ЦРПТ следующие данные: ИНН организации, e-mail для связи.
  6. ЦРПТ в реестре партнеров выставляет интегратору роль «Разработчик интеграции с библиотекой». Если у интегратора нет ЛК в реестре партнеров ЦРПТ, то его необходимо создать, до сертификации.
  7. Разработчик интеграции с библиотекой в ЛК партнеров ЦРПТ:
    1. Создает продукт к интеграции:
      • Тип продукта = Компонент ТС ПИоТ;
      • Тип компоненты ТС ПИоТ = Программное обеспечение;
      • Дополнительная опция = Разработчик интеграции с библиотекой;
      • В поле «Библиотека» = Указывает библиотеку, с которой будет интегрироваться (Библиотека интеграций Evotor POS);
      • Приложение протокола.
    2. Подписывает заявление с помощью ЭЦП.
    3. Проходит проверку успешно и получает ключи регистрации ПО.
    4. Вставляет полученный ключ и рассчитанную с его помощью контрольную сумму в манифест своего приложения (ru.esm.PMSR_ID и ru.esm.PMSR_TOKEN).

Манифест приложения

Для работы с ТС ПИоТ в вашем приложении потребуется указать следующие данные:

<meta-data android:name="ru.esm.PMSR_ID" android:value="1234" />
<meta-data android:name="ru.esm.PMSR_TOKEN" android:value="4321" />
<uses-permission android:name="ru.evotor.permission.PMSR" />

Где:

Использование API

  1. Подключитесь к сервису: val tspiot = TsPioTServiceConnector.connectTsPioTService(context).
  2. Для получения информации от ТС ПИоТ используйте метод KktInfo getKktInfo(). Метод вернет объект с информацией о ТС ПИоТ:
    /** Идентификатор ТС ПИоТ */
    private final String tspiotId;
    /** ЗН ККТ */
    private final String kktSerial;
    /** ЗН ФН */
    private final String fnSerial;
    /** ИНН ККТ */
    private final String kktInn;
    /** Время проверки кода в ТС ПИоТ (В миллисекундах) */
    private final int codesCheckTimeOut;
    
  3. Для проверки марок используйте метод CodesCheckResult getMarkedProductsInfo(List<MarkingCode> codes, String? userUuid). Поле userUuid заполняется только в том случае, если пользователь, сканирующий марки, сменился. Для отслеживания смены пользователя используйте событие ru.evotor.framework.core.action.event.usersUserChangedEvent. Метод вернет объект с онлайн и оффлайн проверками:
    @Nullable private final List<OnlineCodesCheck> onlineCodesChecks;
    @Nullable private final List<OfflineCodesCheck> offlineCodesChecks;
    

    Внутри OnlineCodesCheck и OfflineCodesCheck содержатся данные с проверками, включая:

    /** Уникальный идентификатор запроса */
    protected final String reqId;
    /** Дата и время формирования запроса (в UTC) */
    protected final long reqTimestamp;
    

    Эти данные нужны для формирования позиции с проверкой марки (объект MarksCheckingInfo в Position). Внутри объекта с онлайн или офлайн-проверкой содержатся результаты проверки марок:

    /** Результат онлайн проверки марок*/
    private final List<OnlineCodeCheck> codes;
    /** Результат оффлайн проверки марок*/
    private final List<OfflineCodeCheck> codes;
    

    Используйте параметры с результатами проверки в соответствии с ПФС (программой испытаний от ЦРПТ), направленной вам для прохождения сертификации.

  4. Каждый из методов TsPioTService может вернуть клиентское исключение или исключение от драйвера ТС ПИоТ, их необходимо обработать. Полный список исключений доступен по пути ru.evotor.tspiot.exceptions.
  5. После завершения работы с ТС ПИоТ отключитесь от сервиса: TsPioTServiceConnector.disconnectTsPioTService()

Пример

try {
   //Подключение к ТС ПИоТ
   val tspiot = TsPioTServiceConnector.connectTsPioTService(this)
   //Получение информации о ТС ПИоТ
   val codesCheckTimeOut = tspiot.kktInfo.codesCheckTimeOut

   //Проверка марок
   val codesForCheck: MutableList<MarkingCode> = ArrayList()
   val userUuid = if(isUserChanged()) UserApi.getAuthenticatedUser(this)?.uuid else null

  codesForCheck.add(MarkingCode("0112345678901234219wbIc8fexZjeMSdKw==", null))

   val checkResult = tspiot.getMarkedProductsInfo(codesForCheck, userUuid)

   val onlineChecked = checkResult.onlineCodesChecks
   val offlineChecked = checkResult.offlineCodesChecks
   onlineChecked?.forEach {
       val marks = it.codes
       marks.forEach {
           val isMarkBlocked = it.blocked
           //Остальные проверки
       }
   }
}catch (e: TsPioTErrorHolderException){
   //Обработка исключений от драйвера ТС ПИоТ
   when(val error = e.errorDescriptionWrapper){
       is MessageErrorDescriptionWrapper.NotRegistered ->
       {
           Log.d("TsPioTErrorHolderException", "ТС ПИоТ не зарегистрирован!")
       }
       else -> {
           Log.d("TsPioTErrorHolderException", error.errorDescription.toString())
       }
   }
}catch (e: TsPioTServiceException){
   //Обработка исключений, которые могу возникнуть на стороне клиента ТС ПИоТ
   Log.d("TsPioTServiceException", e.message.toString())
}
//Завершение работы ТС ПИоТ
TsPioTServiceConnector.disconnectTsPioTService()