Публичное пространство

Как анализировать ошибки при сбоях оплат по банковским картам

Включение логирования

Для анализа ситуаций со сбоями оплат по банковским картам необходимо анализировать журнал событий обмена с банковским терминалом.
События пишутся в \\IP кассы\storage\crystal-cash\logs\bank.log
По-умолчанию, уровень логирования этого логгера настроен на уровень ERROR. Этого уровня может не хватить для полноценного анализа, поэтому рекомендуется расширить уровень логирования согласно статье Настройка логирования кассовой программы
Уровень логирования можно повысить до TRACE в файле \\IP кассы\storage\crystal-cash\modules\loader\log4j.xml
для логера
    <logger name="ru.crystals.pos.bank">
        <level value="trace"/>
        <appender-ref ref="file-bank"/>
    </logger>
и аппендера
    <appender name="file-bank" class="org.apache.log4j.RollingFileAppender">
        <param name="Threshold" value="trace"/>
        <param name="file" value="logs/bank.log"/>
        <param name="MaxFileSize" value="1000KB"/>
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd.MM HH:mm:ss} %-5p [%c{1}] %m%n"/>
        </layout>

Сохранить файл и перезагрузить кассовый модуль

Анализ событий банковских операций

Общий техпроцесс

Все операции обмена между кассой и банковским ПО действуют по алгоритму запрос-ответ.
Кассовая программа выполняет запрос к терминалу используя банковское ПО, установленное на кассе. И спустя таймаут, сопоставимый с данным запросом, кассовая программа ожидает ответ от терминала.
Например, банковское ПО sb_pilot СберБанк устанавливается на кассе.
Касса использует ее при общении с терминалом командами: sb_pilot код команды 
Далее касса ожидает ответ  Response code/file
При этом код ответа может содержать положительные и отрицательные ответы. 

Рассмотрим на примерах

Продажа

22.02 09:13:59 INFO  [BankImpl] Sale amount=73600 (Сбербанк) -- кассовая программа сообщает об операции ОПЛАТА
22.02 09:13:59 INFO  [AbstractFileBasedBank] Operation SALE will be processed
22.02 09:13:59 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e) --удаление предыдущего файла ответа
22.02 09:13:59 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p) --удаление предыдущего слипа
22.02 09:13:59 INFO  [AbstractFileBasedBank] Executable command: /mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/sb_pilot 1 73600 0 -- кассовая программа передает команду об оплате
22.02 09:14:15 TRACE [AbstractFileBasedBank] Executable is finished
22.02 09:14:15 TRACE [AbstractFileBasedBank] Reading file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e) -- получение и чтение файла ответа
22.02 09:14:15 TRACE [AbstractFileBasedBank] File appeared in 0 millis
22.02 09:14:15 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e)
22.02 09:14:15 INFO  [Bank] Response file:
0,ОДОБРЕHО: -- чтетие файла ответа (в данном случае 0 - успешный файл ответа для команды ОПЛАТА)
427653******2107
12/18
158014
0004
Visa
1
00538506
20160222091402
605391718258
161B9817E7CD57DC3631E804E0EB2A16DA1F451E
0
530000001241
22.02 09:14:15 DEBUG [AbstractFileBasedBank] fillCommonFields finished
22.02 09:14:15 DEBUG [AbstractFileBasedBank] fillSpecificFields finished
22.02 09:14:15 TRACE [AbstractFileBasedBank] Reading file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p) -- получение и чтение слипа
22.02 09:14:15 TRACE [AbstractFileBasedBank] File appeared in 0 millis
22.02 09:14:15 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p)
22.02 09:14:15 INFO  [AbstractFileBasedBank] Slip file: -- печать слипа
22.02.16                           09:14
                 Оплата                 
Номер операции:                     0004
Терминал:                       00538506
Пункт обслуживания:         530000001241
                Visa      A0000000031010
Карта:(C)               ************2107 
Клиент:                       POPOV/YURI
 
Сумма (Руб):                 736.00
ОДОБРЕНО Код авторизации:       158014
 
         Введен ПИН-код         
  
  
   _________________________________
            подпись кассира

Возврат

Аналогично операции возврата
20.02 17:52:46 INFO  [BankImpl] refund amount=49900 (Сбербанк)-- кассовая программа сообщает об операции ВОЗВРАТ
20.02 17:52:46 INFO  [AbstractFileBasedBank] Operation REFUND will be processed
20.02 17:52:46 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e) --удаление предыдущего файла ответа
20.02 17:52:46 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p) --удаление предыдущего слипа
20.02 17:52:46 INFO  [AbstractFileBasedBank] Executable command: /mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/sb_pilot 3 49900 0 -- кассовая программа передает команду о возврате
20.02 17:52:50 TRACE [AbstractFileBasedBank] Executable is finished
20.02 17:52:50 TRACE [AbstractFileBasedBank] Reading file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e) -- получение и чтение файла ответа
20.02 17:52:50 TRACE [AbstractFileBasedBank] File appeared in 0 millis
20.02 17:52:50 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e)
20.02 17:52:50 INFO  [Bank] Response file:
0,ОДОБРЕHО: -- чтетие файла ответа (в данном случае 0 - успешный файл ответа для команды ВОЗВРАТ)
546953******0367
10/17
000000
0027
Mastercard
1
00538498
20160220175245
411468093967
AE737020282ADC5F7951F2EA1A6AF6AEB2F98F62
0
530000001241
20.02 17:52:50 DEBUG [AbstractFileBasedBank] fillCommonFields finished
20.02 17:52:50 DEBUG [AbstractFileBasedBank] fillSpecificFields finished
20.02 17:52:50 TRACE [AbstractFileBasedBank] Reading file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p) -- получение и чтение слипа
20.02 17:52:50 TRACE [AbstractFileBasedBank] File appeared in 0 millis
20.02 17:52:50 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p)
20.02 17:52:50 INFO  [AbstractFileBasedBank] Slip file: -- печать слипа
20.02.16                           17:52
                Возврат                 
Номер операции:                     0027
Терминал:                       00538498
Пункт обслуживания:         530000001241
          Mastercard      A0000000041010
Карта:(C)               ************0367 
Клиент:                   KROKHIN/EVGENY
 
Сумма (Руб):                 499.00
 
 
   ________________________________
            подпись клиента
  
  
   _________________________________
            подпись кассира

Сверка итогов (закрытие банковского дня)

22.02 21:53:30 INFO  [BankImpl] dailyLog-- кассовая программа сообщает об операции СВЕРКА ИТОГОВ
22.02 21:53:30 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e) --удаление предыдущего файла ответа
22.02 21:53:30 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p) --удаление предыдущего слипа
22.02 21:53:30 INFO  [AbstractFileBasedBank] Executable command: /mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/sb_pilot 7 -- кассовая программа передает команду о операции закрытие дня (сверка итогов)
22.02 21:53:33 TRACE [AbstractFileBasedBank] Executable is finished
22.02 21:53:33 TRACE [AbstractFileBasedBank] Reading file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e) -- получение и чтение файла ответа
22.02 21:53:33 TRACE [AbstractFileBasedBank] File appeared in 0 millis
22.02 21:53:33 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/e)
22.02 21:53:33 INFO  [Bank] Response file:
0,Успешно!-- чтетие файла ответа (в данном случае 0 - успешный файл ответа)
0
00538498
00000000000000
0
530000001241
22.02 21:53:33 TRACE [AbstractFileBasedBank] Reading file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p) -- получение и чтение слипа
22.02 21:53:33 TRACE [AbstractFileBasedBank] File appeared in 0 millis
22.02 21:53:33 TRACE [AbstractFileBasedBank] Deleting file (/mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/p)
22.02 21:53:33 INFO  [AbstractFileBasedBank] Slip file: -- печать слипа
22.02.16                           21:53
             Сверка итогов              
Терминал:                       00538498
Пункт обслуживания:         530000001241
-----------------------------------
Итоги совпали                      
----------------------------------------
 
Валюта    :                          Руб
  
 Оплата                       
   
 Всего операций:          80
   на сумму:       130145.60
   Скидка:              0.00
----------------------------------------
***********  Отчет закончен  ***********
.

Распространенные проблемы

Истек таймаут выполнения банковского модуля

Достаточно распространенная ситуация, когда долго обрабатывается запрос от кассы на сервере авторизации и спустя установленный таймаут кассовая программа прерывает операцию оплаты по банку. В данном случае может произойти ситуация, когда транзакция на банковском сервере авторизации прошла, но ответ о ее статусе не успел в таймаут вернуться на кассу. Покупатель оказывается в неприятной ситуации - деньги банк списал, а касса ("торговая точка") не зарегистрировала эту операцию.
Как эта ситуация выглядит в логе:
26.02 16:20:22 INFO  [BankImpl] Sale amount=107200 (Сбербанк)
26.02 16:20:22 INFO  [AbstractFileBasedBank] Operation SALE will be processed
26.02 16:20:22 INFO  [AbstractFileBasedBank] Executable command: /mnt/sda1/tce/storage/crystal-cash/banks/sberbank/linux/sb_pilot 1 107200 0
26.02 16:21:52 ERROR [AbstractFileBasedBank] Error processing executable
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask.get(Unknown Source)
at ru.crystals.pos.bank.filebased.AbstractFileBasedBank.startProcessWithTimeout(AbstractFileBasedBank.java:392)
at ru.crystals.pos.bank.filebased.AbstractFileBasedBank.runExecutable(AbstractFileBasedBank.java:373)
at ru.crystals.pos.bank.filebased.AbstractFileBasedBank.runExecutableAndGetResponseData(AbstractFileBasedBank.java:413)
at ru.crystals.pos.bank.filebased.AbstractFileBasedBank.makeTransaction(AbstractFileBasedBank.java:164)
at ru.crystals.pos.bank.filebased.AbstractFileBasedBank.sale(AbstractFileBasedBank.java:157)
at ru.crystals.pos.bank.BankImpl.sale(BankImpl.java:196)
at ru.crystals.pos.visualization.payments.bankcard.BaseCardPaymentContainer.processSale(BaseCardPaymentContainer.java:398)
at ru.crystals.pos.visualization.payments.bankcard.BaseCardPaymentContainer.doProcessPayment(BaseCardPaymentContainer.java:367)
at ru.crystals.pos.visualization.payments.PaymentContainer.processPayment(PaymentContainer.java:286)
at ru.crystals.pos.visualization.payments.bankcard.BaseCardPaymentContainer.enter(BaseCardPaymentContainer.java:100)
at ru.crystals.pos.visualization.components.CompositeContainer.enter(CompositeContainer.java:97)
at ru.crystals.pos.visualization.check.CheckContainer.enter(CheckContainer.java:1743)
at ru.crystals.pos.visualization.components.MainWindow.enter(MainWindow.java:1012)
at ru.crystals.pos.visualization.Factory.eventControlKey(Factory.java:442)
at ru.crystals.pos.techprocess.TechProcessImpl.eventControlKey(TechProcessImpl.java:4272)
at ru.crystals.pos.CashEventSource.sentOldKey(CashEventSource.java:158)
at ru.crystals.pos.CashEventSource.process(CashEventSource.java:129)
at ru.crystals.pos.CashEventSource.processEvent(CashEventSource.java:114)
at ru.crystals.pos.CashEventSource.run(CashEventSource.java:98)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
26.02 16:21:52 WARN  [BankImpl] Истек таймаут выполнения банковского модуля
ru.crystals.pos.bank.exception.BankCommunicationException: Истек таймаут выполнения банковского модуля
из лога видно, что команда об оплате выполнена в 26.02 16:20:22 , ответ не был получен своевременно и спустя 1,5 минуты в 26.02 16:21:52 касса отменила запрос с ошибкой.
Как решить: для магазинов с неудовлетворительном каналом связи рекомендуется увеличить таймаут для выполнения банковских операций. Для этого:
1. В файле \\IP кассы\storage\crystal-cash\config\plugins\bank-sberbank-config.xml (файл для процессинга Сбербанк) 
2. Отредактировать настройку
<property key="responseTimeout" value="90000"/> -- настройка задается в милисекундах.По-умолчанию 90000
3. Сохранить файл и перезагрузить кассу

Неверная настройка конфигурационного файла банковского ПО

Данный случай распространен для процессинга Аркус (Арком). Согласно порядку настройки в статье SetRetail10 ▪️ Касса ◾️ АРКОМ (Аркус) (Ingenico) ВТБ в пункте
10. Настройка конфигурационных файлов для работы банковского ПО (выполняет сотрудник банка):
Скопируйте конфигурационные файлы необходимо в каталог home/tc/storage/crystal-cash/banks/arcom/linux
в файле ops.ini или ops_spdh.ini - файл ресурсов для редактора настроек сотрудники банка могут допустить ошибку в сопоставлении команд. Таким образом происходит сбои, когда касса посылает команду оплата, а в файле ops.ini или ops_spdh.ini она вызывает совершенно другую команду.
Рассмотрим на примере:
В файле ops.ini или ops_spdh.ini для кода 1 указано выполнение команды 1=0,166,ТЕСТ СВЯЗИ, хотя по факту должна выполняться команда оплаты 1=0,128,ОПЛАТА
В результате происходит ошибка при попытке оплаты.
Как решить: обратиться к сотрудникам банка для правильной конфигурации команд.

© 1994-2023, ООО «Кристалл Сервис Интеграция».
Все права защищены..

Политика обработки персональных данных