Введение

XML​-интерфейс предоставляет наиболее удобный способ получения информации о системе r_keeper 7 и сохранения данных в базах данных r_keeper 7, а также выполнения различных операций.

Существует 3 вида интерфейсов в r_keeper 7:

  • Для кассовых станций
  • Для кассовых серверов
  • Для серверов справочников (отчетов).

Каждый тип интерфейса поддерживает различный набор команд.

XML-интерфейс позволяет:

  • Читать данные из справочников и коллекций — справедливо для всех видов интерфейсов
  • Создавать новые и изменять свойства существующих элементов справочников — только для серверов справочников
  • Получать информацию о текущих заказах, создавать новые и оперировать имеющимися заказами, выполнять любые кассовые операции — только для кассового сервера
    Примеры операций:
    • Закрытие общей смены
    • Печать отчета

Общая схема взаимодействия представлена ниже:

image2022-1-20_11-13-44.png

На основе XML-интерфейса работают такие продукты, как Мобильный официант, Киоск самообслуживания, Kiosk PRO, и т.д.

Возможности интерфейсов сервера справочников

  • Чтение элементов справочников
  • Изменения свойств существующих элементов справочников
  • Создания новых элементов справочников.

Применяется обычно для:

  • Интеграции с сайтом ресторана – выгрузка меню
  • Выгрузки меню, цен и прочего во внешнюю доставку
  • Выгрузки ассортимента во внешние системы учета, например, 1С
  • Загрузка меню, цен и других параметров на сервер справочников.

Возможности интерфейса кассового сервера

  • Чтение справочников
  • Чтение информации по текущим заказам
  • Создание и редактирование заказов
  • Выполнение кассовых операций.

Применяется обычно для:

  • Интеграций с сайтом доставки ресторана – полный цикл от создания заказа до оплаты
  • Интеграций мобильных приложений, систем самообслуживания, доставки и других систем
  • Мониторинг текущего состояния продаж и прочего
  • Интеграций с системами лояльности
  • Интеграций с системами видеонаблюдения.

Особенности XML-интерфейса кассовой станции

  • Можно добавить блюдо прямо в открытый заказ
  • Чтение содержимого открытого заказа на кассе
  • Выполнение кассовых операций — прокатка карты, запрос инфо о карте
  • Оплата текущего заказа.

Лицензирование

Существует два варианта лицензирования XML-интерфейса:

  • LifeTimeR-Keeper модуль XML сохранение заказов ПО — лицензия приобретается на конкретный объект в системе лицензирования единовременно, не предполагает никаких ограничений по запросам в рамках этого объекта.
    После приобретения лицензии необходимо сгенерировать лицензионный ключ и добавить его в свойства ресторана в менеджерской станции. Подробнее читайте в статье Интерфейс XML сохранения заказов

  • По подписке — лицензия для интеграции внешних приложений на 1 или 12 месяцев. Запросы SaveOrder, PayOrder, MakeRetunGoods должны подписываться и проверяться системой лицензирования. Подробнее читайте в статье Использование XML-интерфейса по подписке.

Способы обмена данными с XML-интерфейсом

Существует два способа обмена данными с XML-интерфейсом:

Настройка работы XML-запросов через HTTPS

Выполнение XML запросов через HTTPS возможно только для версии r_keeper 7.05.03 и выше.

В менеджерской станции необходимо настроить доступ к кассовому серверу через HTTPS. Для этого требуется создать работника с соответствующей привилегией. В актуальных версиях r_keeper есть предустановленное право HTTPS Access, созданное специально для этих целей и мы рекомендуем использовать его.

Если роль и сотрудник с привилегией на доступ HTTPS у вас уже есть, остается только дать доступ к кассовому серверу. Для этого:

  1. Перейдите в меню Сервис > Станции и устройства
  2. Выберите ресторан и перейдите на кассовый сервер
  3. В свойствах сервера:
    • В поле HTTP Data Port пропишите свободный порт. По желанию, включите настройку Use Free Listen Port, чтобы сервер выбрал другой порт в случае, когда заданный в свойстве HTTP Data Port порт занят.
    • В разделе HTTP Ограничения выберите во всех полях привилегию HTTP_Access
  4. Сохраните изменения
  5. Перезагрузите кассовый сервер.

Если требуется создать отдельную привилегию и роль с правом доступа по HTTPS, нажмите ниже.

  1. Перейдите в меню Сервис > Менеджерская станция > Привилегии на объекты. 
  2. Добавьте новую привилегию, например HTTP_порт.
  3. Перейдите в меню Настройки > OLAP отчеты > Серверы отчетов
  4. Выберите нужный сервер справочников
  5. В свойствах сервера:
    • В разделе HTTP Server найдите поле HTTP Data Port и пропишите свободный порт.
      Включите настройку Use Free Listen Port, чтобы программа выбрала другой порт в случае, когда заданный в свойстве HTTP Data Port порт занят.
      Для доступа к web-интерфейсу данного сервера можно использовать:
      • Порт, прописанный в свойствах сервера справочников в менеджерской станции — HTTP Data Port
      • Порт, прописанный в rk7srv.ini в секции [TSPSOC], параметр port.
    • В разделе HTTP Ограничения поставьте во всех полях созданную привилегию
    • В разделе Ограничения включите в привилегию на объекты созданную привилегию
  6. Сохраните изменения
  7. Перезагрузите сервер
  8. В менеджерской станции перейдите в меню Сервис > Станции и устройства
  9. Выберите ресторан и перейдите на кассовый сервер
  10. В свойствах сервера:
    • В разделе HTTP Server найдите поле HTTP Data Port и пропишите свободный порт.
      Включите настройку Use Free Listen Port, чтобы программа выбрала другой порт в случае, когда заданный в свойстве HTTP Data Port порт занят.
      Для доступа к web-интерфейсу данного сервера можно использовать:
      • Порт, прописанный в свойствах сервера справочников в менеджерской станции — HTTP Data Port
      • Порт, прописанный в rk7srv.ini в секции [TSPSOC], параметр port.
    • В разделе HTTP Ограничения поставьте во всех полях созданную привилегию
  11. Создайте роль с правами на созданную привилегию

    При авторизации HTTPS запросов используются только роли текущего ресторана и центрального офиса.

  12. Для созданной роли добавьте работника, задайте ему пароль.
    Название и пароль данного работника будут использоваться для авторизации на сервере через HTTPS.

Пример настройки подключения связи r_keeper 7 и Menuboard Pro

Отправка запросов к кассовому серверу должна осуществляться по следующему URL:

https://*IP:HTTPDataPort*/rk7api/v0/xmlinterface.xml
CODE

IP:HTTPDataPort необходимо указать свои.

Для доступа к интерфейсу необходимо передавать логин и пароль — название и пароль работника по типу Basic Authorization при отправке каждого запроса.
Обмен данными с кассовым сервером должен происходить в кодировке UTF-8.

Проверка XML-интерфейса через встроенную утилиту

Для проверки XML-интерфейса через HTTPS-интерфейс:

  • Зайдите по адресу https://ip:port/webgui/iservxmltest.htm. Например, https://127.0.0.1:13665/webgui/iservxmltest.htm
  • Введите данные созданного сотрудника: имя пользователя и пароль 
  • Введите текст XML-запроса для выполнения
  • Нажмите кнопку Execute
    Результат должен быть такой, как на рисунке ниже:

Аутентификация и выполнение запросов

Для аутентификация и авторизации используется имя название и пароль работника из r_keeper 7.

WEB-интерфейс на момент написания статьи имеет ограничения:

После указания права и его назначения, соответствующей роли можно проверить корректность настроек, открыв в WEB интерфейсе соответствующие страницы. 

Введите в адресной строке один из вариантов, появится окно авторизации — введите название работника и пароль. Обратите внимание, что вам необходимо ввести свой IP и порт.

Выполнение запроса через wget 

Пример выполнения запроса с использованием утилиты wget:

wget.exe --secure-protocol=TLSv1 --no-check-certificate --header="Content-Type: text/xml" --http-user=9006 --http-password=9006 --post-file=requestData.xml https://127.0.0.1:20001/rk7api/v0/xmlinterface.xml
CODE

Параметры запроса:

  • Пользователь: --http-user=9006
  • Пароль: --http-password=9006
  • Файл с запросом: --post-file=requestData.xml

После выполнения такого запроса его результат будет сохранен в файл xmlinterface.xml.

Настройка работы XML-интерфейса с использованием rk7xml.dll

Внимание!

Данный способ взаимодействия с XML-интерфейсом не рекомендуется из-за отсутствия авторизации.

XML-интерфейс работает через драйвер iTCPXML.dll. При работе с XML-интерфейсом через rk7xml.dll, помимо настроек, описанных выше, необходимо вручную добавить интерфейс на кассовый сервер:

  1. Перейдите в меню Сервис > Станции и устройства
  2. Выберите ресторан и перейдите на кассовый сервер
  3. На вкладке Устройства добавьте драйвер XML Interface For Windows 
  4. Пропишите порт в параметре  Port

  5. Привяжите добавленный интерфейс к логическому интерфейсу в справочнике Сервис > Интерфейсы.
    По умолчанию в системе уже будет предустановленный XML-интерфейс с кодом 104. Для каждого внешнего приложения можно сделать копию данного интерфейса и связать его с драйвером на кассовом сервере.
  6. После привязки интерфейса перезагрузите кассовый сервер. Проверьте, что интерфейс загружен в свойствах кассового сервера
  7. Запустите кассовый сервер с параметром desktop и откройте его интерфейс, дважды нажав на его значок в трее.
    Загруженный интерфейс должен быть виден на вкладке
     Интерфейсы

  8. Вызов функций осуществляется через RK7XML.dll, интерфейсный модуль
    1. Функция CallRK7XMLRPC
      Параметры:

      • AddressName — адрес:порт

      • Request — XML-запрос

      • RequestSize — длина XML-запроса

      • ResultFile — имя файла, куда записывается результат

      • ErrorBufместо, куда пишутся ошибки соединения

      • ErrorBufSize — размер ErrorBuf

    2. Функция CallRK7XMLRPCToStreamаналогична функции выше, но ее результат пишется в поток IStream
      Параметры:

      • AddressName — адрес:порт
      • Request — XML-запрос
      • RequestSize — размер XML-запроса
      • ResultStream — IStream — поток, куда передается результат
      • ErrorBuf — место, куда пишутся ошибки соединения
      • ErrorBufSize — размер ErrorBuf
    3. Функция SetUseTempFileLimit  — устанавливает лимит размера файла, если время возвращения результата превышает порог. По умолчанию = 1000000 ms
    4. Функция GetDLLVersion — возвращает версию DLL
    5. Функция SetCryptKey — устанавливает ключ шифрования. Может быть различным для различных кассовых серверов, прописывается в свойствах XML интерфейса.

Текущая версия протокола 2 предполагает осуществления контроля за выполнением команд сервером. В прошлой версии было невозможно узнать, выполнился ли последний запрос, если возникал разрыв связи после начала обработки запроса.
Сейчас для этого существуют новые функции GetLastXMLResult и GetLastXMLResultToStream. Если ответ после выполнения запроса не удалось отправить, он хранится на сервере вплоть до специального запроса при вызове этих функций или до следующего запроса. Если ответ был успешно отослан, он на сервере не хранится. В любом случае всегда можно узнать номер последнего выполненного запроса для конкретного ConnectName.

ConnectName — произвольная Null-terminated строка, идентификатор соединения
RequestNum — последовательный номер запроса, ведётся по каждому идентификатору соединения отдельно. Надо передать 0, иначе будет использован переданный номер запроса.

function CallRK7XMLRPC2(AddressName: PChar; ConnectName:PChar;
  Request: PChar; RequestSize: integer;
  var RequestNum: DWord; //в обе стороны. Если 0, то генерируется сервером.
  ResultFile: PChar;
  ErrorBuf: PChar; ErrorBufSize: integer):BOOL;stdcall;
function CallRK7XMLRPCToStream2(AddressName: PChar; ConnectName,
  Request: PChar; RequestSize: integer;
  var RequestNum: DWord; //в обе стороны. Если 0, то генерируется сервером.
  ResultStream: IStream;
  ErrorBuf: PChar; ErrorBufSize: integer):BOOL;stdcall;
function GetLastXMLResult(AddressName: PChar; ConnectName:PChar;
  out RequestNum: DWord; //всегда возвращается номер последнего выполненного запроса
  ResultFile: PChar; //результат заполнен, если была ошибка передачи данных результата, после успешной передачи стирается
  ErrorBuf: PChar; ErrorBufSize: integer):BOOL;stdcall;
function GetLastXMLResultToStream(AddressName: PChar; ConnectName: PChar;
  out RequestNum: DWord; //всегда возвращается номер последнего выполненного запроса
  ResultStream: IStream; //результат заполнен, если была ошибка передачи данных результата, после успешной передачи стирается
  ErrorBuf: PChar; ErrorBufSize: integer):BOOL;stdcall;
DELPHI

Проверка XML-запросов через TESTXML.exe

Для проверки запроса при использовании rk7xml.dll воспользуйтесь утилитой XMLTEST.exe, которую можно скачать по ссылке или с FTP-сервера по адресу: ftp://FTP.ucs.ru/rk7/ForDealers/XMLInterface/

Обратите внимание, при запуске без параметров утилита выводит информацию об использовании:

xmltest.exe 127.0.0.1:1122 xmlquery.xml response.xml /pass:password
CODE

Описание параметров:

  • 127.0.0.1:1122 — IP адрес и порт, на который настроен XML интерфейс в r_keeper 7

  • xmlquery.xml — имя файла с XML запросом

  • response.xml — имя файла, в который следует записать ответ

  • /pass:password — пароль, заданный в XML интерфейсе в r_keeper 7

После выполнения утилита сохранит в файл response.xml ответ от XML интерфейса r_keeper 7. Для проверки работоспособности и корректности настроек можно использовать следующий запрос, который следует сохранить в файл xmlquery.xml:

<?xml version="1.0" encoding="UTF-8"?>
<RK7Query>
<RK7CMD CMD="GetSystemInfo"/>
</RK7Query>
CODE

Для удобства существует утилита с графическим интерфейсом TestXML.zip.

Логирование запросов

  1. Перейдите в меню Сервис > Станции и устройства
  2. Выберите ресторан и перейдите на кассовый сервер
  3. В свойствах кассового сервера в разделе HTTP Server укажите HTTP Log path и поставьте галочку Log HTTP query and response:
  1. Перейдите в меню Сервис > Станции и устройства
  2. Выберите ресторан и перейдите на кассовый сервер
  3. На вкладке Устройства выберите один из драйверов XML Interface For Windows 
  4. Раскройте раздел Опции и заполните параметр OutputDir

Обязательно перезагрузите кассовый сервер после произведенных изменений. 

Запросы будут парные — INxxxxx.XML и OUTxxxxx.XML.

Дополнительно можно включить параметр NoLogginQueries — он отвечает за отключение логирования указанных в параметре запросов. Укажите в поле нужные запросы.