Платежный терминал Ingenico (Arcus2)
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4655
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Платежный терминал Ingenico (Arcus2)
Добрый день.
Кто-нибудь пробовал работать с этими терминалами из clarion? Как я понял, там надо подключать их dll. Есть еще интерфейс командной строки, который позиционируется как для проверки работы (эмуляция кассового по). Есть еще вариант работы с низкоуровневым протоколом обмена.
Кто-нибудь пробовал работать с этими терминалами из clarion? Как я понял, там надо подключать их dll. Есть еще интерфейс командной строки, который позиционируется как для проверки работы (эмуляция кассового по). Есть еще вариант работы с низкоуровневым протоколом обмена.
C6/C11, ШВС, tps/btrieve.
Платежный терминал Ingenico (Arcus2)
C10 полет нормальный.
Соврешенно верно ArcCom.dll. В ней две функции
Module('')
ARCUSProcessOw(uLONG UAIG),LONG,C,DLL(True),NAME('ARCUSProcessOw')
ARCUSProcessOwFull(uLONG UAIFG, long UAIFSize),LONG,C,DLL(True),NAME('ARCUSProcessOwFull')
End
Нам банк рекомендовал использовать полную ARCUSProcessOwFull. Параметра два - адрес структуры с данными и ее размер. Структура и пример использования даны в документации.
Со структурой UserAuthInt была заморочка. В нашей версии ARCUS2 стояла опция выравнивания адресов полей в структурах. Поэтому поле system_res пришлось описать как
system_res CSTRING(6)
(поле не используется, и так сделано для корректного размера структуры).
Собственно все. Чистишь структуру (ZeroMemory). Присваиваешь нужные значения полей. Вызываешь ARCUSProcessOwFull. Забираешь из полей структуры ответы. Чек банковский формируется в текстовом слип-файле. Все.
Имхо - слишком заморочено.
Вроде есть новая версии. Но нам установили именно эту.
Ах да! Эта длл показывает свои окошки с ссобщениями. Мы отключили (есть опция в файле конфигурации). Весь диалог ведет кассовое ПО.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4655
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Платежный терминал Ingenico (Arcus2)
А на кларионе можете описания структуры UserAuthInt выложить?
Я еще смотрел вариант с использованием CommandLineTool.exe через запуск процесса, например:
CommandLineTool.exe /o1 /c643 /a100 (платеж на 1 руб)
На выходе дает 2 файла, в одном реквизиты платежа в формате <имя>:<значение>, во втором слип для печати на ккм.
Но что-то с ходу там не запустилось, после праздников дернут техподдержку банка.
Я еще смотрел вариант с использованием CommandLineTool.exe через запуск процесса, например:
CommandLineTool.exe /o1 /c643 /a100 (платеж на 1 руб)
На выходе дает 2 файла, в одном реквизиты платежа в формате <имя>:<значение>, во втором слип для печати на ккм.
Но что-то с ходу там не запустилось, после праздников дернут техподдержку банка.
C6/C11, ШВС, tps/btrieve.
Платежный терминал Ingenico (Arcus2)
В аттаче. Пожалуй я присоединюсь к рекомендации банка использовать вариант full.
Имхо это просто обертка к длл. Зачем она Вам нужна. Используйте напрямую длл, никаких проблем с ней нет.
Код: Выделить всё
!-------------------------
MAP
Module('Windows.dll')
LoadLibrary(*CString NameLibrary),UnSigned,RAW,PASCAL,DLL(TRUE),Name('LoadLibraryA')
FreeLibrary(UnSigned handle),BYTE,PASCAL,DLL(TRUE),proc
GetProcAddress(UnSigned handle, *CString NameFunction),ULong,Raw,PASCAL,DLL(TRUE)
GetLastError(),Long,PASCAL,DLL(TRUE)
SetLastError(Long),PASCAL,DLL(TRUE)
End
module('API')
ZeroMemory(long DestinationPtr,long dwLength),raw,pascal,name('RtlZeroMemory')
END
Module('')
ARCUSProcessOw(uLONG UAIG),LONG,C,DLL(True),NAME('ARCUSProcessOw')
ARCUSProcessOwFull(uLONG UAIFG, long UAIFSize),LONG,C,DLL(True),NAME('ARCUSProcessOwFull')
End
END
!-------------------------
AddrARCUSProcessOw ULONG,Static,Name('ARCUSProcessOw')
AddrARCUSProcessOwFull ULONG,Static,Name('ARCUSProcessOwFull')
!-------------------------
include('arcus2.inc')
!-------------------------
!-----------------------------------------------------
! Структура UserAuthInt
!-----------------------------------------------------
GUAIG GROUP(UserAuthIntGroup)
END
GUAIGAdress ULONG ! Адрес структуры
!-----------------------------------------------------
! Структура UserAuthIntFull
!-----------------------------------------------------
GUAIFG GROUP(UserAuthIntFullGroup)
END
GUAIFGAdress ULONG ! Адрес структуры
!-----------------------------------------------------
HLib UnSigned
ArcomModule STRING(255)
!---------------------------------------------
CS CSTRING(256)
RetVal LONG
CODE
! ......
! Адреса структур
GUAIGAdress = ADDRESS( GUAIG )
GUAIFGAdress = ADDRESS( GUAIFG )
! ......
! Подключаем библиотеку (анализ ошибок опущен)
ArcomModule = 'c:\Arcus2\DLL\ArcCom.dll'
Cs = CLIP(ArcomModule)
HLib = LoadLibrary(Cs)
IF HLib ! библиотека загружена
Cs = 'ProcessOw'
AddrARCUSProcessOw = GetProcAddress(HLib, Cs)
Cs = 'ProcessOwFull'
AddrARCUSProcessOwFull = GetProcAddress(HLib, Cs)
END
! .........
! Обращаемся к ARCUS2
ZeroMemory( GUAIFGAdress, SIZE(GUAIFG) )
GUAIFG.operType = код операции ну и т.д прочие поля.
RetVal = ARCUSProcessOwFull( GUAIFGAdress, SIZE(GUAIFG) )
! Файлы со слипом и стутусом сформированы
! Анализируем возвращенные значения и что то делаем
! .......
! Отключаем библиотеку
IF HLib THEN FreeLibrary( HLib ) .
Как то так.
- Вложения
-
- arcus2.inc
- (18.76 КБ) 605 скачиваний
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4655
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Платежный терминал Ingenico (Arcus2)
Спасибо. По поводу использования exe. Я тоже думаю, что это обертка над dll. Я читал недавнее обсуждение по работе укм4 (одна из самых распространенных кассовых программ) с данным терминалом. У пользователей были проблемы и требовалось накатывать какие-то патчи. Как я понял, это было связано с изменениями в обсуждаемой библиотеке. Вариант с exe позволяет избежать подобных сюрпризов. Вместо заполнения полей структуры мы передаем параметры через ключики командной строки, а результат получаем в простой для обработки файл. Кроме этого, проще локализовать проблему. Exe используют для проверки работоспособности терминала. Если она работает, то 100% будет работать и кассовое по. При варианте с dll могут возникнуть нюансы с заполнением полей структуры и потребуется время на выяснение причины.
В общем, есть над чем подумать.
В общем, есть над чем подумать.
C6/C11, ШВС, tps/btrieve.
Платежный терминал Ingenico (Arcus2)
Как я уже говорил есть новая версия. Там несколько другой подход и другие функции. Скорее всего поэтому и не работало. О каких ньюансах с заполнением полей структуры идет речь я не очень понимаю. Заполняются ровно те же поля, что передаются в командной строке через ключики и по тем же правилам. Я читал документацию на несколько версий. Этот подход был неизменен. Пока не вышла библиотека с другими функциями. Не поменялись ли там параметры командной строки, сказать не могу - не обратил внимание.
Мне проще было с длл. Кассовое ПО у меня тоже не работает напрямую с этой длл. Вокруг нее есть класс-обертка. Версия библиотеки arcus2 настраивается в качестве параметра в ПО. В зависимости от версии выбирается конкретная реализация этой обертки (производный класс). Пока реализовал только для той версии, что есть в наличии. Реализовать для другой - от силы день работы. Да и обертки могут быть разными. Сейчас встала задача разделить терминал между двумя рядом стоящими кассами. Штатный сервер устанавливать по ряду причин нет желания. Родился свой простенький серверочек. К кассоовому ПО дописывается новая обертка для перенаправления запросов к этому серверу. Конечно можно сделать и через командную строку. Еще раз повторю - мне проще через длл.
Мне проще было с длл. Кассовое ПО у меня тоже не работает напрямую с этой длл. Вокруг нее есть класс-обертка. Версия библиотеки arcus2 настраивается в качестве параметра в ПО. В зависимости от версии выбирается конкретная реализация этой обертки (производный класс). Пока реализовал только для той версии, что есть в наличии. Реализовать для другой - от силы день работы. Да и обертки могут быть разными. Сейчас встала задача разделить терминал между двумя рядом стоящими кассами. Штатный сервер устанавливать по ряду причин нет желания. Родился свой простенький серверочек. К кассоовому ПО дописывается новая обертка для перенаправления запросов к этому серверу. Конечно можно сделать и через командную строку. Еще раз повторю - мне проще через длл.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4655
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Платежный терминал Ingenico (Arcus2)
У меня есть опыт работы с curl.exe. Там ситуация аналогичная, есть возможность работы через dll или exe. Приложение тоже не работает напрямую с командной строкой. Есть класс, который запускает exe в виде процесса, выводит окно ожидания завершения и может, при необходимости, прервать процесс через заданное количество времени или по инициативе пользователя (все это опционально). Приложение не знает, как реализован интерфейс, оно просто вызывает один из методов класса. Данная технология работает достаточно продолжительное время, на достаточно большом количестве рабочих мест и в достаточно нагруженном режиме. Поэтому у меня и возникла мысль сыграть по аналогии в случае с рассматриваемым терминалом. В любом случае, еще раз спасибо за предоставленную информацию. Есть что покрутить и сравнить.
C6/C11, ШВС, tps/btrieve.
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Платежный терминал Ingenico (Arcus2)
GUAIFG.operType = код операции ну и т.д прочие поля.vvst писал(а): ↑06 Май 2019, 20:07
! .........
! Обращаемся к ARCUS2
ZeroMemory( GUAIFGAdress, SIZE(GUAIFG) )
GUAIFG.operType = код операции ну и т.д прочие поля.
RetVal = ARCUSProcessOwFull( GUAIFGAdress, SIZE(GUAIFG) )
! Файлы со слипом и стутусом сформированы
! Анализируем возвращенные значения и что то делаем
! .......
Так с терминалами не сталкивался. Просьба, пример по стандартным(наиболее используемым) операциям с полями по терминалу?
Благодарю за внимание.
С10 ABC
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- SergioRaguzini
- Старожил
- Сообщения: 236
- Зарегистрирован: 08 Декабрь 2009, 19:16
- Откуда: Краснодарский край
- Благодарил (а): 6 раз
Платежный терминал Ingenico (Arcus2)
Привет Всем!
У Arcus2 в комплекте есть файл CommandLineTool.exe - это утилита работы через коммандную строку, окно не выводится, результат формируется в текстовом файле. Лет 5 назад наспех сделал так, оказалось, все стабильно работает, поэтому, цивильно обрабатывать DLL было лень. Если необходимо, готов поделиться кодом
У Arcus2 в комплекте есть файл CommandLineTool.exe - это утилита работы через коммандную строку, окно не выводится, результат формируется в текстовом файле. Лет 5 назад наспех сделал так, оказалось, все стабильно работает, поэтому, цивильно обрабатывать DLL было лень. Если необходимо, готов поделиться кодом
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Платежный терминал Ingenico (Arcus2)
Если возможно, буду благодарен, пока разберусь с обработкой dll, тем более что сам терминал находиться удаленно у клиента.SergioRaguzini писал(а): ↑09 Июнь 2020, 14:21 Привет Всем!
У Arcus2 в комплекте есть файл CommandLineTool.exe - это утилита работы через коммандную строку, окно не выводится, результат формируется в текстовом файле. Лет 5 назад наспех сделал так, оказалось, все стабильно работает, поэтому, цивильно обрабатывать DLL было лень. Если необходимо, готов поделиться кодом
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- SergioRaguzini
- Старожил
- Сообщения: 236
- Зарегистрирован: 08 Декабрь 2009, 19:16
- Откуда: Краснодарский край
- Благодарил (а): 6 раз
Платежный терминал Ingenico (Arcus2)
Привет Всем!
Вот кусок прикладной функции обработки банковского эквайринга (есть лишние пременные и подпрограммы, которые можно выбросить, но принцип стабильно работает, и как я упомянул ранее, переделывать было лень). Здесь bc_Oper - принимаемые нарицательные EQUATE. Принцип взят из документации по АРКУС2
Вот кусок прикладной функции обработки банковского эквайринга (есть лишние пременные и подпрограммы, которые можно выбросить, но принцип стабильно работает, и как я упомянул ранее, переделывать было лень). Здесь bc_Oper - принимаемые нарицательные EQUATE. Принцип взят из документации по АРКУС2
Код: Выделить всё
! Переменные для обслуживания банковской платежной системы: 05/08/09
LOC:Amount DECIMAL(10,2) ! значение с копейками для исключения ошибки в Arcus2 12/12/16
LOC:Amount_Kopecks LONG ! сумма в копейках 15/08/16
LOC:bc_Cancel BYTE
LOC:bc_Oper CSTRING(12)
LOC:bc_Error BYTE
LOC:bc_Ole_ON BYTE
LOC:bc_Object CSTRING(21)
LOC:bc_Dll CSTRING(21)
LOC:bc_NumFunc LONG
LOC:bc_ReturnCode LONG
LOC:bc_ResponseCode CSTRING(3) ! строковый код используется в TRPOS 25/08/13
LOC:bc_Folder CSTRING(71)
LOC:bc_Param CSTRING(201) ! вспомагательная переменная для описания параметров и команд 25/08/13
LOC:bc_ResponseDescr CSTRING(1001)
LOC:outLen LONG
LOC:rcptLen LONG
LOC:OperID STRING(3)
LOC:outStr CSTRING(2001) ! DEBUG
LOC:receiptStr CSTRING(2001) ! DEBUG
LOC:ReceiptNumber LONG
SAL_Tmp3:Opened BYTE
SAL_Tmp4:Opened BYTE
LOC:ConnectTimeOut BYTE ! определяет разработчик, сколько времени ~ устанавливается соединение
LOC:Connect_Cnt LONG
LOC:Connect_Ok BYTE
! текстовый файл в Win-кодировке:
LOC_TXT FILE,DRIVER('ASCII'),NAME(ASCIIFileName),PRE(L_F)
Record RECORD,PRE()
Line STRING(300)
END
END
!* * * Подпрограммы для платежной системы: Arcus2 (используют многие банки ) * * *! 15/08/16
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
bc_Arcus2 ROUTINE
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
CLEAR(LOC:bc_ReturnCode) ! в исходное
CLEAR(LOC:Arcus2_ReturnCode)
CLEAR(LOC:Information)
CLEAR(GLO:Information) ! глобальную переменную
if LOC:Amount then LOC:Amount_Kopecks = LOC:Amount * 100 . ! если передано значение суммы
! перевести сумму в целые копейки !!!
CASE bc_Oper
!- . - . - . - . - . - . - . -!
OF 'payment' ! Оплата
LOC:Param = '/o1 /a' & LOC:Amount_Kopecks & ' /c643'
!- . - . - . - . - . -!
OF 'cancel' ! Отмена
LOC:Param = '/o2'
!- . - . - . - . - . -!
OF 'paying_back' ! Возврат
LOC:Param = '/o3 /a' & LOC:Amount_Kopecks & ' /c643'
!- . - . - . - . - . -!
OF 'check' ! Сверка
LOC:Param = '/o10'
!- . - . - . - . - . - . - . -!
End !Case
LOC:Command = CLIP(LOC:bc_Folder) & 'CommandLineTool\bin\CommandLineTool.exe ' & LOC:Param
DO arcus2:J_RibbonCommand ! протоколирование переданной комманды 10/12/16
RUN(LOC:Command, 1) ! выполнить внешнюю программу
DO arcus2:check_outFiles ! искать выходные файлы
If LOC:Exists ! файлы сформированы
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
DO sleep_1 ! задержка (пусть допишутся)
DO arcus2:analyse_rc ! анализ файла rc.out
DO arcus2:analyse_cheq ! анализ файла cheq.out
If LOC:bc_Error ! есть ошибка
!- - - - - - - - - - - - - - - - -!
LOC:bc_ReturnCode = LOC:Arcus2_ReturnCode
LOC:bc_ResponseDescr = '<13,10>' & LOC:Information
DO CreateErrorLog ! протоколирование ошибки терминала
DO show_ErrorMessage ! и выдать сообщение об ошибке
!- - - - - - - - - - - - - - - - -!
End !If
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
Else ! нет выходных файлов
LOC:bc_Error = TRUE ! есть ошибка
LOC:bc_ResponseDescr = 'нет результата выполнения ' & LOC:Command
DO CreateErrorLog ! протоколирование ошибки терминала
DO show_ErrorMessage ! и выдать сообщение об ошибке
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
End !If LOC:Exists
!. . . . . к о н е ц п о д п р о г р а м м ы . . . . . .!
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
arcus2:analyse_cheq ROUTINE ! анализ файла cheq.out
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
ASCIIFileName = LOC:bc_Folder & 'cheq.out'
OPEN(LOC_TXT, 12H) ! открыть текстовый файл
If ErrorCode() then DO error:LOC_TXT
!- - - - - - - - - - - - - - - - - - - - - - - - - - -!
Else ! файл успешно открыт
! cheq.out - файл-чек, содержащий данные по операции, формат и содержание такого чека определяются настройками
! специальистов банка и параметрами ПО терминала
if ~ LOC:bc_Error ! если нет ошибок, то
CheckOpen(SAL_Tmp3, 1) ! открыть глобальный текстовый файл для записи полученного слипа-чека
SAL_Tmp3:Opened = TRUE
end !if ~
DO analyse:LOC_TXT ! анализ содержимого файла cheq.out
If SAL_Tmp3:Opened ! а значит и нет ошибки
!- - - - - - - - - - - - - - - - - - - -!
GLO:Information = LOC:Information ! передать чек в глобальную переменную
if bc_Sum ! если передано значение суммы
!- - - - - - - - - - - - - - - -!
! для Arcus 2, в отличии от СберБанка необходимо самостоятельно формировать вторую копию слипа:
x = 1 ; CLEAR(PrintLine)
LOOP While x <= size:LongPrintLine
PrintLine = CLIP(PrintLine) & '=' ; x += 1 . ! заменено на '=' чтобы стандартизировать с СБЕРБАНКОМ 01/03/19
! и потом делать автоматическую отрезку
ST3:Line = '<13,10>' ; ADD(SAL_Tmp3) ! добавить запись "перевод-строки"
ST3:Line = PrintLine ; ADD(SAL_Tmp3) ! добавить запись "линия отреза"
ST3:Line = '<13,10>' ; ADD(SAL_Tmp3) ! добавить запись "перевод-строки"
DO analyse:LOC_TXT ! повторный анализ содержимого файла cheq.out
! для формирования второго экземпляра слипа
!- - - - - - - - - - - - - - - -!
end !if bc_Sum
!- - - - - - - - - - - - - - - - - - - -!
End !If
!- - - - - - - - - - - - - - - - - - - - - - - - - - -!
End !If
CLOSE(LOC_TXT) ! важно закрыть текстовый файл
! и нельзя(!) закрывать SAL_Tmp3
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
analyse:LOC_TXT ROUTINE ! анализ содержимого файла cheq.out
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
SET(LOC_TXT)
LOOP
NEXT(LOC_TXT)
IF ErrorCode() THEN BREAK . ! отказ от EOF c 12/06/03
! IF ~ () THEN CYCLE . ! Filter: по дате
!- . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . -!
LOC:Information = CLIP(LOC:Information) & CLIP(L_F:Line) & '<13,10>'
if SAL_Tmp3:Opened ! раз открыт, значит ошибок нет
!- - - - - - - - - - - - -!
ST3:Line = CLIP(L_F:Line)
ADD(SAL_Tmp3) ! добавить строку-чека
!- - - - - - - - - - - - -!
end !if
!- . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . -!
End !Loop LOC_TXT
!. . . . . к о н е ц п о д п р о г р а м м ы . . . . . .!
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
arcus2:analyse_rc ROUTINE ! анализ файла rc.out
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
ASCIIFileName = LOC:bc_Folder & 'rc.out'
OPEN(LOC_TXT, 12H) ! открыть текстовый файл
If ErrorCode() then DO error:LOC_TXT
!- - - - - - - - - - - - - - - - - - - - - - - - - - -!
Else ! файл успешно открыт
! rc.out - содержит трехзначное значение кода ответа от банка, при положительном результате выполнения операции
! возвращается 000, все остальные значения указывают, что операция не выполнена (в операции отказано)
! в этом файле только одна строка
SET(LOC_TXT)
LOOP
NEXT(LOC_TXT)
IF ErrorCode() THEN BREAK . ! отказ от EOF c 12/06/03
IF ~ (CLIP(L_F:Line) <> '') THEN CYCLE . ! Filter: по дате
!- . - . - . - . - . - . - . - . - . - . - . - . - . - . - . -!
LOC:Arcus2_ReturnCode = CLIP(L_F:Line)
BREAK
!- . - . - . - . - . - . - . - . - . - . - . - . - . - . - . -!
End !Loop LOC_TXT
!- - - - - - - - - - - - - - - - - - - - - - - - - - -!
End !If
CLOSE(LOC_TXT) ! важно закрыть текстовый файл
if LOC:Arcus2_ReturnCode <> '000' then LOC:bc_Error = TRUE . ! есть ошибка
!. . . . . к о н е ц п о д п р о г р а м м ы . . . . . .!
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
arcus2:check_outFiles ROUTINE ! искать в течение времени выходные файлы 16/08/16
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
! результатом работы модуля Arcus2 является формирование текстовых файлов:
!
! rc.out - содержит трехзначное значение кода ответа от банка, при положительном результате выполнения операции
! возвращается 000, все остальные значения указывают, что операция не выполнена (в операции отказано)
! cheq.out - файл-чек, содержащий данные по операции, формат и содержание такого чека определяются настройками
! специальистов банка и параметрами ПО терминала
!
! output.dat - содержит строки с данными по операции, например:
!000 - код ответа (NNN 000 - 999)
!447520******7014 - PAN
!R0000009 - Terminal ID (идентификатор терминала в платежной системе)
!738593 - код авторизации
!VISA - название типа карты
!ОДОБРЕНО - текстовое сообщение
!500 - сумма транзакции (если была указана в командной строке) 5.00р. 12 - номер чека в терминале
!4816D0C8FF699AE1B7638672E880D7943DC95117598971170C1C9D921F9AF09C - криптограмма данных о карте
! сканировать наличие файлов надо последовательно в порядке как привел выше в описании, именно
! так они формируются (отследил с пом утилиты по времени создания в миллисекундах)
LOC:Exists = FALSE
LOC:LoopIndex = 0
TimeOver# = CLOCK() + 30 * 100 ! вычислить время окончания попыток поиска квитанции в секундах
LOOP WHILE (LOC:Exists = FALSE AND CLOCK() < TimeOver# )
!- . - . - . - . - . - . - . - . - . - . - . - . -!
LOC:LoopIndex += 1 ! подсчитать за сколько циклов будет найден комплект файлов
LOC:Counter = 0 ! счетчик наличия файлов
DO sleep_1 ! задержка
if EXISTS(LOC:bc_Folder & 'rc.out') then LOC:Counter += 1 .
if EXISTS(LOC:bc_Folder & 'cheq.out') then LOC:Counter += 1 .
if EXISTS(LOC:bc_Folder & 'output.dat') then LOC:Counter += 1 .
if LOC:Counter = 3 then LOC:Exists = TRUE . ! полный комплект найден
!- . - . - . - . - . - . - . - . - . - . - . - . -!
END ! Loop while
!. . . . . к о н е ц п о д п р о г р а м м ы . . . . . .!
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
sleep_1 ROUTINE ! задержка
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
timeSleep1# = CLOCK() + 0.5 * 100
LOOP WHILE CLOCK() < timeSleep1# ! задержка на долю секунды
! DO Animation
End !Loop
!. . . . . к о н е ц п о д п р о г р а м м ы . . . . . .!
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
arcus2:delete_outFiles ROUTINE ! удалить файлы, которые создаст CommandLineTool.exe после его запуска
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
SETCURSOR(CURSOR:Wait) ! turn ON hourglass mouse cursor
LOC:FileName = CLIP(LOC:bc_Folder) & 'cheq.out' ; DO delete::LOC:FileName
LOC:FileName = CLIP(LOC:bc_Folder) & 'output.dat' ; DO delete::LOC:FileName
LOC:FileName = CLIP(LOC:bc_Folder) & 'output_ex.dat' ; DO delete::LOC:FileName
LOC:FileName = CLIP(LOC:bc_Folder) & 'output_ex.txt' ; DO delete::LOC:FileName
LOC:FileName = CLIP(LOC:bc_Folder) & 'rc.out' ; DO delete::LOC:FileName
!. . . . . к о н е ц п о д п р о г р а м м ы . . . . . .!
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
arcus2:J_RibbonCommand ROUTINE ! протоколирование переданной комманды
!- = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = - = * = -!
If S_O:DO_Journal = TRUE ! создание файла к.ленты предусмотрено
!- - - - - - - - - - - - - - - - - - - - - - - - - - - -!
CheckOpen:J_Ribbon ! открыть файл к.ленты (если надо)
CLEAR(J_R:Line) ; ADD(J_Ribbon) ; ADD(J_Ribbon) ! отделить пустуми строками
ADD(J_Ribbon) ; ADD(J_Ribbon) ! новый документ
J_R:Line = 'дата ' & FORMAT(TODAY(), @D05) & ', время ' & FORMAT(CLOCK(), @T4) ; ADD(J_Ribbon)
J_R:Line = 'посылка команды банковской платежной системы:' ; ADD(J_Ribbon)
J_R:Line = 'операция: ' & bc_Oper & ' сумма: ' & bc_Sum ; ADD(J_Ribbon)
J_R:Line = LOC:Command ; ADD(J_Ribbon)
CLEAR(J_R:Line) ; ADD(J_Ribbon) ! отступ на одну строку
!- - - - - - - - - - - - - - - - - - - - - - - - - - - -!
End !If S_O:DO_Journal
!. . . . . к о н е ц п о д п р о г р а м м ы . . . . . .!
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Платежный терминал Ingenico (Arcus2)
Спасибо огромное, посмотрю.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп