Интеграция с ПО UPOS через библиотеку GATE. 1.0 Платформа Win32.

- Титульная страница
- Группы
- Структуры данных

Группы
Примеры работы с библиотекой

## Группы

| Оплата
| Возврат покупки
| Отмена покупки
| Отмена покупки с указанием RRN
| Уникальный идентификатор операции RequestID
| Пример запуска 2000 оплат для проверки утечки памяти
| Плати QR
| Служебные функции библиотеки
| Описание функций инициализация и финализация, получение чека, перечень поддерживаемых функций, вызов функций мониторинга.
| Финансовые операции по картам
| Информационные операции по банковским картам и картам лояльности
| Cлужебные операции по картам
| Общие служебные операции
| Функции этого класса позволяют получать информацию о ранее выполненых операциях и отчетах, таких как сводный чек и контрольная лента.
| Операции ядра sb_kernel

## Подробное описание

Функция call_sb_kernel является основной для выполнения всех операций.

GATE_API DWORD call_sb_kernel(DWORD func, void *in_arg, void *out_arg);

Предупреждения
  В решении Windows x86 функция линкуется по имени с подчеркиванием _call_sb_kernel, в решении для Windows CE без подчеркивания.

Первый параметр func типа DWORD (целочисленное положительное) принимает значения из списка KernelOperation и задает основное действие. Входные аргументы передаются вторым параметром в структуре ::InArg. Основная информация передается с помощью поля InArg::in_struct, а дополнительное поле InArg::Reserved. Не используемые поля ::InArg должны быть установлены в нулевые значения. Выходные аргументы передаются третьим параметром в структуре ::OutArg. Для получения расширенной информации следует проинициализоровать поля OutArg::out_struct и OutArg::Reserved.

В случае успешного вызова функции ядра функция call_sb_kernel возвращает 0 (соответствует константе ERR_OK – см. описание кодов ошибок ниже), в противном случае – ненулевой код ошибки. Вызывающая программа должна проанализировать значение, воз-вращаемое функцией call_sb_kernel. Если функция вернула ERR_OK, следует проанализировать поле out_arg.ErrorCode. В поле ErrorCode возвращается код ошибки или 0, если операция была успешно выполнена. Перед вызовом функции вызывающая программа должна установить значение поля Flags в 0. После вызова функции вызывающая программа должна проанализировать содержимое поля Flags и выполнить действия в соответствии с установленными флагами. Если установлен флаг F_HAVE_DOCUMENT, вызывающая программа должна выполнить печать документа с помощью специальных функций KO_SIZE_OF_CHEQUE и KO_GET_LAST_CHEQUE. Если установлен флаг F_HAVE_MONMSG, вызывающая программа должна выполнить чтение сообщения системы мониторинга с помощью специальной функций KO_GET_MONITORING_STATE. Если установлен флаг F_CRITICAL (может устанавливаться только совместно с F_HAVE_DOCUMENT), вызывающая программа после печати документа должна убедиться, что он напечатан успешно (при необходимости запросив подтверждение у пользователя). Параметр Reserved должен иметь значение NULL, если противное специально не оговари-вается в описании конкретной функции. Параметр out_struct – указатель на буфер типа struct_out_clX, где X – номер класса, для функций ненулевого клаcса, или указатель на буфер типа struct_outX, где X – номер функции класса 0, или NULL, если функция не возвращает результатов. Этот буфер за-полняется данными только в случае успешного выполнения функции. Примеры работы с библиотекой входят в состав дистрибутива и расположены в папке "Docs\Для разработчиков ПО ККМ\examples\gate.dll\cpp"

В общем случае код вызова может выглядеться так (последовательность действий рекомендательная):

1. Включить заголовочные файлы
   #include "..\..\..\..\errors.h"
   #include "..\..\..\..\gate.h"
   #include "..\..\..\..\sbkernel.h"
2. Объявить аргументы
   InArg in;
   OutArg out;
   struct_in_cl4 InDetail;
   struct_out_cl4 OutDetail;
   struct_in_reserved4 inExtra;
   struct_out_reserved4 outExtra;
3. Связать аргументы
   in.in_struct = &InDetail;
   out.out_struct = &OutDetail;
   out.Reserved = &outExtra;
   outExtra.size = sizeof(outExtra);
   inExtra.size = sizeof(inExtra);
   in.Reserved = &inExtra;
4. Задать значения
   InDetail.Amount = amount;
   strcpy_s(inExtra.RRN, rrn.c_str());
5. Загрузить библиотеку и основную функцию.
   HMODULE dll = LoadLibrary("gate.dll");
   Gate_Call_Sb_Kernel gate_Call_Sb_Kernel = (Gate_Call_Sb_Kernel)GetProcAddress(dll, "_call_sb_kernel");
   Предупреждения
     Обязательно инициализировать библиотеку функцией KO_INITIALIZATION
6. Вызвать динамически загруженную функцию
   DWORD error = gate_Call_Sb_Kernel(KO_PREAUTH,&in,&out);
7. Проверить результат вызова
   throw_if_error(error, "perform_preauth");
   throw_if_error(out.ErrorCode, "perform_preauth");
   std::cout << "Customer used card:" << OutDetail.CardName << std::endl;
8. При необходимости выгрузить библиотеку.
   Предупреждения
     Обязательно завершить работу библиотеки KO_FINALIZATION
     FreeLibrary(dll);