Платежный терминал Ingenico (Arcus2)

Сканеры, кассы, ККТ и т.д.
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Платежный терминал Ingenico (Arcus2)

Сообщение finsoftrz »

Добрый день.
Кто-нибудь пробовал работать с этими терминалами из clarion? Как я понял, там надо подключать их dll. Есть еще интерфейс командной строки, который позиционируется как для проверки работы (эмуляция кассового по). Есть еще вариант работы с низкоуровневым протоколом обмена.
C6/C11, ШВС, tps/btrieve.
vvst
Новичок
Сообщения: 5
Зарегистрирован: 24 Февраль 2012, 20:15

Платежный терминал Ingenico (Arcus2)

Сообщение vvst »

finsoftrz писал(а): 27 Апрель 2019, 8:44Кто-нибудь пробовал работать с этими терминалами из clarion?
C10 полет нормальный.
finsoftrz писал(а): 27 Апрель 2019, 8:44Как я понял, там надо подключать их dll.
Соврешенно верно 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 писал(а): 27 Апрель 2019, 8:44Есть еще вариант работы с низкоуровневым протоколом обмена.
Имхо - слишком заморочено.

Вроде есть новая версии. Но нам установили именно эту.

Ах да! Эта длл показывает свои окошки с ссобщениями. Мы отключили (есть опция в файле конфигурации). Весь диалог ведет кассовое ПО.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Платежный терминал Ingenico (Arcus2)

Сообщение finsoftrz »

А на кларионе можете описания структуры UserAuthInt выложить?
Я еще смотрел вариант с использованием CommandLineTool.exe через запуск процесса, например:
CommandLineTool.exe /o1 /c643 /a100 (платеж на 1 руб)
На выходе дает 2 файла, в одном реквизиты платежа в формате <имя>:<значение>, во втором слип для печати на ккм.
Но что-то с ходу там не запустилось, после праздников дернут техподдержку банка.
C6/C11, ШВС, tps/btrieve.
vvst
Новичок
Сообщения: 5
Зарегистрирован: 24 Февраль 2012, 20:15

Платежный терминал Ingenico (Arcus2)

Сообщение vvst »

finsoftrz писал(а): 06 Май 2019, 19:24А на кларионе можете описания структуры UserAuthInt выложить?
В аттаче. Пожалуй я присоединюсь к рекомендации банка использовать вариант full.
finsoftrz писал(а): 06 Май 2019, 19:24Я еще смотрел вариант с использованием CommandLineTool.exe
Имхо это просто обертка к длл. Зачем она Вам нужна. Используйте напрямую длл, никаких проблем с ней нет.

Код: Выделить всё

!-------------------------

  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 КБ) 595 скачиваний
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Платежный терминал Ingenico (Arcus2)

Сообщение finsoftrz »

Спасибо. По поводу использования exe. Я тоже думаю, что это обертка над dll. Я читал недавнее обсуждение по работе укм4 (одна из самых распространенных кассовых программ) с данным терминалом. У пользователей были проблемы и требовалось накатывать какие-то патчи. Как я понял, это было связано с изменениями в обсуждаемой библиотеке. Вариант с exe позволяет избежать подобных сюрпризов. Вместо заполнения полей структуры мы передаем параметры через ключики командной строки, а результат получаем в простой для обработки файл. Кроме этого, проще локализовать проблему. Exe используют для проверки работоспособности терминала. Если она работает, то 100% будет работать и кассовое по. При варианте с dll могут возникнуть нюансы с заполнением полей структуры и потребуется время на выяснение причины.
В общем, есть над чем подумать.
C6/C11, ШВС, tps/btrieve.
vvst
Новичок
Сообщения: 5
Зарегистрирован: 24 Февраль 2012, 20:15

Платежный терминал Ingenico (Arcus2)

Сообщение vvst »

Как я уже говорил есть новая версия. Там несколько другой подход и другие функции. Скорее всего поэтому и не работало. О каких ньюансах с заполнением полей структуры идет речь я не очень понимаю. Заполняются ровно те же поля, что передаются в командной строке через ключики и по тем же правилам. Я читал документацию на несколько версий. Этот подход был неизменен. Пока не вышла библиотека с другими функциями. Не поменялись ли там параметры командной строки, сказать не могу - не обратил внимание.

Мне проще было с длл. Кассовое ПО у меня тоже не работает напрямую с этой длл. Вокруг нее есть класс-обертка. Версия библиотеки arcus2 настраивается в качестве параметра в ПО. В зависимости от версии выбирается конкретная реализация этой обертки (производный класс). Пока реализовал только для той версии, что есть в наличии. Реализовать для другой - от силы день работы. Да и обертки могут быть разными. Сейчас встала задача разделить терминал между двумя рядом стоящими кассами. Штатный сервер устанавливать по ряду причин нет желания. Родился свой простенький серверочек. К кассоовому ПО дописывается новая обертка для перенаправления запросов к этому серверу. Конечно можно сделать и через командную строку. Еще раз повторю - мне проще через длл.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Платежный терминал Ingenico (Arcus2)

Сообщение finsoftrz »

У меня есть опыт работы с curl.exe. Там ситуация аналогичная, есть возможность работы через dll или exe. Приложение тоже не работает напрямую с командной строкой. Есть класс, который запускает exe в виде процесса, выводит окно ожидания завершения и может, при необходимости, прервать процесс через заданное количество времени или по инициативе пользователя (все это опционально). Приложение не знает, как реализован интерфейс, оно просто вызывает один из методов класса. Данная технология работает достаточно продолжительное время, на достаточно большом количестве рабочих мест и в достаточно нагруженном режиме. Поэтому у меня и возникла мысль сыграть по аналогии в случае с рассматриваемым терминалом. В любом случае, еще раз спасибо за предоставленную информацию. Есть что покрутить и сравнить.
C6/C11, ШВС, tps/btrieve.
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Платежный терминал Ingenico (Arcus2)

Сообщение gopstop2007 »

vvst писал(а): 06 Май 2019, 20:07
! .........
! Обращаемся к ARCUS2

ZeroMemory( GUAIFGAdress, SIZE(GUAIFG) )

GUAIFG.operType = код операции ну и т.д прочие поля.

RetVal = ARCUSProcessOwFull( GUAIFGAdress, SIZE(GUAIFG) )

! Файлы со слипом и стутусом сформированы
! Анализируем возвращенные значения и что то делаем

! .......
GUAIFG.operType = код операции ну и т.д прочие поля.

Так с терминалами не сталкивался. Просьба, пример по стандартным(наиболее используемым) операциям с полями по терминалу?

Благодарю за внимание.
С10 ABC
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

Платежный терминал Ingenico (Arcus2)

Сообщение SergioRaguzini »

Привет Всем!
У Arcus2 в комплекте есть файл CommandLineTool.exe - это утилита работы через коммандную строку, окно не выводится, результат формируется в текстовом файле. Лет 5 назад наспех сделал так, оказалось, все стабильно работает, поэтому, цивильно обрабатывать DLL было лень. Если необходимо, готов поделиться кодом
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Платежный терминал Ingenico (Arcus2)

Сообщение gopstop2007 »

SergioRaguzini писал(а): 09 Июнь 2020, 14:21 Привет Всем!
У Arcus2 в комплекте есть файл CommandLineTool.exe - это утилита работы через коммандную строку, окно не выводится, результат формируется в текстовом файле. Лет 5 назад наспех сделал так, оказалось, все стабильно работает, поэтому, цивильно обрабатывать DLL было лень. Если необходимо, готов поделиться кодом
Если возможно, буду благодарен, пока разберусь с обработкой dll, тем более что сам терминал находиться удаленно у клиента.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

Платежный терминал Ingenico (Arcus2)

Сообщение SergioRaguzini »

Привет Всем!
Вот кусок прикладной функции обработки банковского эквайринга (есть лишние пременные и подпрограммы, которые можно выбросить, но принцип стабильно работает, и как я упомянул ранее, переделывать было лень). Здесь 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



!.  .  .  .  .  к о н е ц   п о д п р о г р а м м ы .  .  .  .  .  .!




gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Платежный терминал Ingenico (Arcus2)

Сообщение gopstop2007 »

Спасибо огромное, посмотрю. :ty:
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить