Протокол взаимодействия с драйверами терминалов авторизации
Использование протокола
Протокол используется
- для взаимодействия кассового сервера с драйвером терминала авторизации (хост драйвера - касса или сервер печати просто передают данные без модификации).
- Для взаимодействия драйвера терминала авторизации верхнего уровня auHTTPv3 с процессом-драйвером авторизации нижнего уровня.
Версии протокола
Текущая версия - 60 (версии синхронизированы с версиями протокола универсального драйвера фискального регистратора
1. Новые функции TerminalXMLCall, TerminalXMLAbort.
2. Несколько платежей в авторизации. В результате авторизации может вернуться больше платежей, чем было. Новый атрибут payTransType. Новый тэг OPTIONS в AUTHTRANSACTIONRESULT на инициализации.
12. Новая процедура SetCallbacks, новый тэг PRINTUNFISCAL в возврате.
13. Новый тэг MENU в AUTHTRANSACTIONRESULT на инициализации, новый корневой тэг MENUOPERATION.
44. Атрибут authCode передаётся на вход в AUTHOPERATION.
51. Необязательный атрибут xml:lang у тэга PRINTUNFISCAL, указывается язык по стандарту ISO 639-1
- 55. Добавлена поддержка payTransType="discount"
- 59. В OPTIONS добавлена опция MultiOperations. Если установлена, то при всех операциях после авторизации, вызывающий группирует транзакции по transactionNumber, если transactionNumber <> 0
- 60. Новый тэг Logs в AUTHTRANSACTIONRESULT на инициализации.
- 61. Опции CreateTransaction, SeqTransactionID. Новый task="createTransaction"
Версия 1... (XML интерфейс)
DLL предоставляет следующие функции (TerminalXMLAbort не обязательная):
procedure TerminalXMLCall(Number: Integer; InXML:PChar; var OutXML:Pchar); stdcall;
procedure TerminalXMLAbort(Number: Integer; InXML:Pchar); stdcall;
procedure SetCallbacks(Number: Integer; InterfaceCallback: tInterfaceCallbackProc; PropCallback: tPropCallbackProc); stdcall;
Если функция TerminalXMLCall не обнаружена, то считается, что драйвер работает по версии 0 (до XML).
Процедура SetCallbacks начиная с версии 12, не обязательная, если она есть, то вызывается сразу после инициализации, описaние процедур tInterfaceCallbackProc и tPropCallbackProc см. Описание протокола универсального драйвера фискального регистратора
GetStatus
GetStatus - функция, общая для всех драйверов, совместимых с принтерами не обязательна.
PrintersStarted
procedure PrintersStarted(Handle: Integer); stdcall;
Функция, общая для всех драйверов, совместимых с принтерами, не обязательна. Если есть, то вызовется посл инициализации всех принтеров. Может использоваться для печати на другие устройства на старте кассы
SetCallbacks
procedure SetCallbacks(Number: Integer; InterfaceCallback: tInterfaceCallbackProc; PropCallback: tPropCallbackProc); начиная с версии 12, не обязательная, если она есть, то вызывается сразу после инициализации, описaние процедур tInterfaceCallbackProc и tPropCallbackProc см. Описание протокола универсального драйвера фискального регистратора.
Вместо PropCallback можно передать nil.
TerminalXMLCall
procedure TerminalXMLCall(Number: Integer; InXML:PChar; var OutXML:Pchar);
Number - порядковый номер устройства данного типа, начиная с 0 (для второго устройства Number=1)
InXML - см. XML вызова (TerminalXMLCall, TerminalAbort)
OutXML - см. xml_ответа_terminalxmlcall
вызовы TerminalXMLCall строго последовательные для одного устройства (одного Number). Результат OutXml хранится в памяти, выделенной драйвером (для конкретного Number) и валидный вплоть до следующего вызова TerminalXMLCall (для конкретного Number). За контроль последовательности (не одновременности) вызовов для одного устройства отвечает вызывающая сторона.
TerminalXMLAbort
procedure TerminalXMLAbort(Number: Integer; InXML:Pchar);
Number - порядковый номер устройства данного типа, начиная с 0 (для второго устройства Number=1)
InXML - см. xml_вызова_terminalxmlcall_terminalabort
TerminalXMLAbort может вызываться для прерывания текущей операции. Драйвер должен проверить, что XML соответствует XML выполняемой операции. Процедура не должна быть связана с ожиданием. Возврат из процедуры не означает, что указанная операция прервана. Если операция была прервана, то об этом будет видно из ответа выполняемой операции.
XML вызова (TerminalXMLCall, TerminalXMLAbort)
Инициализация
<AUTHINIT MaxProtocolVersion="12"> <DriverParameters> <Parameter Name="Port Name" IntegerValue="" StringValue="Com1"/> <Parameter Name="Port Configuration" IntegerValue="" StringValue="baud=9600 parity=N"/> <Parameter Name="Password" IntegerValue="0"/> <Parameter Name="LowDriverParams">
<![CDATA[[<?xml version="1.0" encoding="utf-8"?><DriverConfig></DriverConfig>]]>
</Parameter> </DriverParameters> </AUTHINIT>
возврат
<AUTHTRANSACTIONRESULT task="init" hardErrorCode="0" softErrorCode="0" errorText="No error" protocolVersion="12" dllVersion="95"> <OPTIONS> <OPTION Name="Encashment"/>
<OPTION Name="MultiOperations"/> <OPTION Name="SeqTransactionID"/>
</OPTIONS> <MENU> <MENUITEM caption="Group 1"> <!-- так зажаётся подменю, caption - обязательный --> <MENUITEM caption="Test supergiperfunction" <!-- обязательный --> operationId="{123E720F-BAFC-453F-9948-50662663F75C}" <!-- обязательный для исполняемого пункта меню --> parameter="12345" <!-- число, не обязательный, если есть будет скопирован при вызове в parameter --> purposeToLock="{7DA9C7F9-7DAE-462F-9FC5-113E2E3810B2}" <!-- назначение печати (и вывод на экран), перед выполнением принтер с этого назначения будет заблокирован, не обязательный, ({7DA9C7F9-7DAE-462F-9FC5-113E2E3810B2} - в RK7 "для пречеков", для вывода на экран {9FD45000-7B7C-45F6-9EA7-F0391269A232}) --> userRight="{A4C4606D-F7C4-4FBF-83D7-00AD12DD7E55}"> <!-- пользовательское право, которое будет проверяться перед выполнением, не обязательный --> <DIALOGINFO dialogType="DateInterval"|"NumberInterval"|"OneDate"|"OneNumber" caption="Enter date interval for superreport"/> <!-- не обязательный --> </MENUITEM> <MENUITEM caption="Settings"> <!-- подменю --> <MENUITEM caption="Set superpassword" <!-- обязательный --> operationId="{123E720F-BAFC-453F-9948-50662663F75C}"/> </MENUITEM> </MENUITEM> </MENU>
<Logs><!-- начиная с версии 60, не обязательный, содержит маски логов, атрибуты не обязательны, если на заданы будут заполнены верхним уровнем.-->
<Log Module="cvSBPilot.dll#0">c:\rkeeper 7\bin\win\cvSBPilot_0.log</Log>
<Log Module="cvSBPilot.dll#0">c:\rkeeper 7\bin\win\cvSBPilot_0.*.log</Log>
<Log Module="cvSBPilot.dll#0/pilot_nt">c:\rkeeper 7\bin\win\pilot_nt\pilot_nt*.log</Log>
</Logs>
</AUTHTRANSACTIONRESULT>
OPTIONS начиная с версии 2, в тэгах OPTION с обязательным атрибутом Name содержится описание опций терминала, которые должны как то поддерживаться кассой.
- Encashment - обналичивание. Вместе с операцией на авторизацию карты для оплаты приходит операция с payTransType="encashment"
- MultiOperations - Если установлена, то при всех операциях после авторизации, вызывающий группирует транзакции по transactionNumber, если transactionNumber <> 0. Без опции группировка не производится. Для предыдущих версий протокола группировка производится при transactionNumber <> 0.
- SeqTransactionID - если на входе protocolVersion>=61, то драйвер ожидает, что на вход при авторизации или создании транзакции поступит уникальный transactionNumber.
- CreateTransaction - дополнительный вызов перед авторизации для запоминания transactionNumber,EXTTRANSACTIONINFO, которые позволят откатить последующую авторизацию даже при неопределённом результате
Сразу после инициализации вызывается SetCallbacks (начиная с версии 12)
Финализация
<AUTHDONE/>
возврат
<AUTHTRANSACTIONRESULT task="done"/>
Операции меню (с 13 версии)
<MENUOPERATION operationId="{5B3F851D-1C75-41C1-B3B3-B0927E49D3ED}" parameter="12345"> <DIALOGINFO from="2014-12-31" to="2015-12-31"/> <!-- не обязательный, если был вызов диалога, to заполняется для типов диалога "DateInterval","NumberInterval" --> </MENUOPERATION>
возврат
<AUTHTRANSACTIONRESULT task="menuOperation" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTUNFISCAL xml:lang="ru"><!-- не обязательный --> <Unfiscal> </Unfiscal> <Unfiscal> </Unfiscal> </PRINUNFISCAL> </AUTHTRANSACTIONRESULT>
Закрытие смены
<AUTHCLOSESHIFT terminalId="5B3F851D-1C75-41C1-B3B3-B0927E49D3ED"/>
возврат, описание тэгов см. ниже
<AUTHTRANSACTIONRESULT task="closeShift" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTTEXT> </PRINTTEXT> <SCREENTEXT> </SCREENTEXT> <PRINTUNFISCAL> <!-- с версии 12, если есть заменяет PRINTTEXT, одновременное появление и PRINTUNFISCAL - ошибка--> <Unfiscal> </Unfiscal> <Unfiscal> </Unfiscal> </PRINUNFISCAL> </AUTHTRANSACTIONRESULT>
Остальные операции (транзакции)
<AUTHTRANSACTION terminalId="{5B3F851D-1C75-41C1-B3B3-B0927E49D3ED}" task="authorize/confirm/rollbackConfirm/void/rollbackVoid/createTransaction" afterPrint="0/1" orderId="{E47D3F17-18D4-4935-AA4F-002CE5E27A37}" terminalPrintDetailIdent="22D4B396-6D27-4639-8504-3490E9BD2451"> <PRINTTEXT> </PRINTTEXT> <AUTHOPERATIONS> <AUTHOPERATION value="123.32" payId="{A400DCEE-E441-4B6F-916F-8FCC9D60AF30}" inputType="manual/inpid/kbd/calc/xml" transactionNumber="3210" transactionStatus="noTransaction/canceled/created/authorizing/authorized/confirmed/voided/dayClosed" extIntegerInfo="123123" currencyId="{C7E6E4B7-051C-44B6-A82D-5FCE78823A81}" payTransType="pay/tip/encashment/discount"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTION>
terminalId - логический идентификатор терминала в рамках этой системы
task - все, кроме abort только для TerminalXMLCall, abort только для TerminalXMLAbort
init - инициализация
done - финализация
authorize - первичная авторизация
confirm перед печатью чека
rollbackConfirm - отмена confirm (при ошибке печати), в старом протоколе (версии 0) ничего не делалось
void - отмена авторизации либо при удалении платежа на кассе либо при удалении чека
rollbackVoid - отмена отмены авторизации (при ошибке печати) в старом протоколе (версии 0) вызывался confirm
- createTransaction - с протокола 61 - при опции "CreateTransaction" перед авторизацией (task="authorize") выполняется создание транзакции. В результате должна заполниться информация для отката транзакции (transactionNumber,EXTTRANSACTIONINFO) , в том числе в случае неопределённости результата авторизации, например при выключении кассы или кассового сервера. transactionStatus="created"
afterPrint - не обязательный, по умолчанию 0, имеет смысл только для task=«confirm», «rollbackConfirm» и task=«void», см. needAfterPrint в XML возврата
orderId - строковый идентификатор заказа
terminalPrintDetailIdent - не обязательный, идентификатор выбора из опционного меню перед авторизацией.
PayId - уникальный идентификатор платежа, не может изменяться
inputType - способ добавления платежа в заказ
manual - вручную (или скриптом)
inpid - сигнал на добавление пришёл от внешнего устройства считывания идентификаторов (магнитная читалка, таблетка, RFID, сканер)
kbd - был введён «код с клавиатуры»
calc - платёж добавился автоматически при расчёте чека
xml - добавлен через XML интерфейс
transactionNumber - обязательный, по умолчанию 0, целое число int32, сохраняется в базе в TransactionID, операции с одинаковым transactionnumber передаются в драйвер терминала авторизации в одном XML в одном тэге AUTHOPERATIONS,
authCode - код авторизации, текст, сохраняется в базе в AuthCode string[20]
extIntegerInfo - обязательный, по умолчанию 0, целое число int64
currencyId - идентификатор (GUID) валюты, dвозможны разные валюты для разных юр. лиц и т.п.
payTransType - начиная с версии 2 - «pay/tip/encashment/discount» - новый признак платежа. tip - чаевые, encashment - обналичка, discount - скидка, добавленная при оплате, начиная с версии 55
PRINTTEXT - макетированный текст для использования терминалом в различных целях, только для задачи «authorize», бинарные данные, кодируются BASE64
AUTHOPERATIONS, AUTHOPERATION, EXTTRANSACTIONINFO обязательны для задач, перечисленных в начале этого раздела
EXTTRANSACTIONINFO - сохраняется в базу в ExtTransactionInfo string[255] с разделителями между частями «/», соответственно такие разделители в тексте запрещены.
EXTTRANSACTIONINFOPART value
XML возврата TerminalXMLCall
<AUTHTRANSACTIONRESULT task="authorize/confirm/rollbackConfirm/void/rollbackVoid/closeShift/createTransaction" orderId="{E47D3F17-18D4-4935-AA4F-002CE5E27A37}" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTTEXT> </PRINTTEXT> <PRINTUNFISCAL> <!-- с версии 12, если есть заменяет PRINTTEXT, одновременное появление PRINTTEXT и PRINTUNFISCAL - ошибка--> <Unfiscal> </Unfiscal> <Unfiscal> </Unfiscal> </PRINUNFISCAL> <SCREENTEXT> </SCREENTEXT> <AUTHOPERATIONS> <AUTHOPERATION payId="{A400DCEE-E441-4B6F-916F-8FCC9D60AF30}" value="123.32" needAfterPrint="0/1" transactionNumber="3210" transactionStatus="noTransaction/canceled/created/authorizing/authorized/confirmed/voided/dayClosed" cardNum="123456******9876" extIntegerInfo="123123" authCode="OK" owner="VISA/MASTERCARD/MAESTRO/AMERICAN EXPRESS/DINERS CLUB/VISA ELECTRON/PRO100/CASHIER CARD/SBERCARD/JCB" needAskBeforePrint="0/1" payTransType="pay"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> <!-- чаевые: payId сгенерирован --> <AUTHOPERATION payId="{32C5AA5C-64EE-4D7D-A6E9-4EF27D478827}" value="10.00" payTransType="tip" needAfterPrint="0/1" transactionNumber="3210" transactionStatus="noTransaction/canceled/created/authorizing/authorized/confirmed/voided/dayClosed" cardNum="123456******9876" extIntegerInfo="123123" authCode="OK" owner="VISA/MASTERCARD/MAESTRO/AMERICAN EXPRESS/DINERS CLUB/VISA ELECTRON/PRO100/CASHIER CARD/SBERCARD/JCB" needAskBeforePrint="0/1"> </AUTHOPERATION> <!-- скидка, начиная с протокола 55: payId сгенерирован, value должна совпадать с уменьшением value в операции payTransType="pay" -->
<AUTHOPERATION payId="{4CA4C45B-369C-48FA-A9D5-CB613A83F90A}" value="10.00" payTransType="discount" needAfterPrint="0/1" transactionNumber="3210" transactionStatus="noTransaction/canceled/created/authorizing/authorized/confirmed/voided/dayClosed" cardNum="123456******9876" extIntegerInfo="123123" authCode="OK" owner="VISA/MASTERCARD/MAESTRO/AMERICAN EXPRESS/DINERS CLUB/VISA ELECTRON/PRO100/CASHIER CARD/SBERCARD/JCB" needAskBeforePrint="0/1">
</AUTHOPERATION>
</AUTHOPERATIONS> </AUTHTRANSACTIONRESULT>
Для тэга AUTHOPERATION обязательные атрибуты payId и transactionStatus. При отсутствии тэга AUTHOPERATION статус транзакции платежа не меняется. Значения атрибутов по умолчанию
task и orderID если заданы, то проверяются на совпадение с соответствующими полями при вызове. Помогают ориентироваться в логах.
payId - уникальный идентификатор платежа, не может изменяться, обязателен для заполнения. Для операций, добавленных в результате авторизации (чаевые, инкассация, скидка) payId должен быть заполнен честно сгенерированным GUID
needAfterPrint только для task=«confirm» и task=«void». Означает, что надо будет вызвать ещё раз после печати. Момент вызова (до или после печати) передаётся в afterPrint, по умолчанию «0».
transactionStatus - обязательно должен быть заполнен
cardNum - PAN
needAskBeforePrint - надо ли после авторизации но перед печатью чека задать вопрос о печати чека, по умолчанию «1»
transactionNumber - обязательный, целое число int32, сохраняется в базе RK7 в TransactionID, операции с одинаковым transactionnumber передаются в драйвер терминала авторизации в одном XML в одном тэге AUTHOPERATIONS
extIntegerInfo - обязательный, целое число int64, сохраняется в базе RK7 в AccountIdent
owner - тип карты VISA/MASTERCARD/MAESTRO/AMERICAN EXPRESS/DINERS CLUB/VISA ELECTRON/PRO100/CASHIER CARD/SBERCARD/JCB
value - необязательный, если не задан, считается, что совпадает с value из запроса. Если задан, должен быть больше ноля и не больше value из запроса.
payTransType=«pay/tip/encashment/discount» - не обязательный, если не задан, то как в вызове, не должен меняться, но в результате авторизации может быть добавлен новый тэг AUTHOPERATION c payTransType="tip" или payTransType="encashment". Начиная с протокола 55 добавлена поддержка payTransType="discount"
EXTTRANSACTIONINFO - при наличии тэга сохраняется в базу в ExtTransactionInfo string[255] с разделителями между частями «/», соответственно такие разделители в тексте запрещены. При отсутствии тэга EXTTRANSACTIONINFO в базе для платежа остаётся старое значение. Пустой тэг EXTTRANSACTIONINFO приведёт к очистке в базе поля ExtTransactionInfo.
EXTTRANSACTIONINFOPART value
PRINTTEXT - текст для печати, бинарные данные, кодируются BASE64
SCREENTEXT - текст для вывода на экран, в том числе сообщения об ошибках, присланные банком, utf-8, выводится только если hardErrorCode=0 и softErrorCode=0, иначе текст ошибки в атрибуте errorText корневого тэга. При успешном выполнении выодится н
PRINTUNFISCAL - начиная с версии 3 содержит набор тэгов Unfiscal, таких же, как в описании протокола универсального драйвера фискального регистратора.
Последовательность вызовов
Создание транзакции
с версии 61, не обязательное, при выставленной опции CreateTransaction, в ответе transactionStatus="created"
<AUTHTRANSACTION terminalId="5B3F851D-1C75-41C1-B3B3-B0927E49D3ED" task="createTransaction" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" terminalPrintDetailIdent="22D4B396-6D27-4639-8504-3490E9BD2451" <AUTHOPERATIONS> <AUTHOPERATION value="123.32" payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" inputType="manual" transactionStatus="noTransaction" payTransType="pay" /> </AUTHOPERATIONS> </AUTHTRANSACTION>
Ответ:
<AUTHTRANSACTIONRESULT task="authorize" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTTEXT> <!-- в новых версиях PRINTUNFISCAL --> Это слип, который надо напечатать </PRINTTEXT> <AUTHOPERATIONS> <AUTHOPERATION payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" transactionNumber="3210" transactionStatus="created" extIntegerInfo="123123" authCode="OK"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="RRN:123321123"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTIONRESULT>
Авторизация
<AUTHTRANSACTION terminalId="5B3F851D-1C75-41C1-B3B3-B0927E49D3ED" task="authorize" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" terminalPrintDetailIdent="22D4B396-6D27-4639-8504-3490E9BD2451" <PRINTTEXT/> <AUTHOPERATIONS> <AUTHOPERATION value="123.32" payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" inputType="manual" transactionStatus="noTransaction" payTransType="pay" /> </AUTHOPERATIONS> </AUTHTRANSACTION>
Ответ:
<AUTHTRANSACTIONRESULT task="authorize" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" hardErrorCode="0" softErrorCode="0" errorText="No error"> <SCREENTEXT> Попросите клиента подписаться на слипе! </SCREENTEXT> <PRINTTEXT> <!-- в новых версиях PRINTUNFISCAL --> Это слип, который надо напечатать </PRINTTEXT> <AUTHOPERATIONS> <AUTHOPERATION payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" value="123.32" transactionNumber="3210" transactionStatus="authorized" cardNum="123456******9876" extIntegerInfo="123123" authCode="OK" owner="VISA/MASTERCARD/MAESTRO/AMERICAN EXPRESS/DINERS CLUB/VISA ELECTRON/PRO100/CASHIER CARD/SBERCARD/JCB" needAskBeforePrint="1"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTIONRESULT>
Если softErrorCode<>0 или hardErrorCode<>0 хост показывает errorText и больше ничего не делает.
Получив такой (успешный) ответ хост показывает содержимое SCREENTEXT и печатает то, что в PRINTTEXT или в PRINTINFISCAL в зависимости от поддерживаемого протокола.
Если статус «authorized» или «confirmed» - платёж терминалом (банком) принят.
Потом, скажем, клиент расписывается на слипе или ещё где то, так как стоит needAskBeforePrint=«1» хост перед печатью чека запрашивает у кассира «Всё ок, печатаем чек?».
Если клиент или кассир желает всё отменить, выполняем отмену платежа, иначе печатаем чек.
Печать чека
Если вернулся transactionStatus=«confirmed», то ничего делать не надо вообще. Если вернулся статус «authorized» то перед печатью чека вызываем так:
<AUTHTRANSACTION terminalId="5B3F851D-1C75-41C1-B3B3-B0927E49D3ED" task="confirm" afterPrint="0" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37"> <AUTHOPERATIONS> <AUTHOPERATION value="123.32" payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" inputType="manual" transactionNumber="3210" transactionStatus="authorized" extIntegerInfo="123123" currencyId="C7E6E4B7-051C-44B6-A82D-5FCE78823A81" payTransType="pay" authCode="OK"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTION>
Ответ:
<AUTHTRANSACTIONRESULT task="confirm" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTTEXT> </PRINTTEXT> <PRINTUNFISCAL> <!-- с версии 12, если есть заменяет PRINTTEXT, одновременное появление и PRINTUNFISCAL - ошибка--> <Unfiscal> </Unfiscal> <Unfiscal> </Unfiscal> </PRINUNFISCAL> <SCREENTEXT> </SCREENTEXT> <AUTHOPERATIONS> <AUTHOPERATION payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" value="123.32" needAfterPrint="1" transactionNumber="3210" transactionStatus="confirmed" extIntegerInfo="123123" authCode="OK"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTIONRESULT>
Если softErrorCode<>0 или hardErrorCode<>0 хост показывает errorText и отменяет печать чека.
Если на входе тип транзакции «authorized», то драйвер при успехе выставляет тип «confirmed». Остальные типы транзакции игнорируются
Автоматическую отмену платежа лучше не делать.
Если softErrorCode=0 и hardErrorCode=0 - печатаем слип, при ошибке печати слипа можно отменить confirm вызвав rollbackConfirm с тем, чтобы потом когда-нибудь заново выполнить confirm и заново получить слип confirm. r_k 7 в этом случае задаёт вопрос, что дальше делать - повторно попытаться распечатать слип или отменить печать чека, при выборе «отмена» чек не печатается.
После печати чека, если при выполнении confirm был возврат needAfterPrint=«1» надо вызвать так (afterPrint=«1»):
<AUTHTRANSACTION terminalId="5B3F851D-1C75-41C1-B3B3-B0927E49D3ED" task="confirm" afterPrint="1" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37"> <AUTHOPERATIONS> <AUTHOPERATION value="123.32" payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" inputType="manual" transactionNumber="3210" transactionStatus="authorized" extIntegerInfo="123123" currencyId="C7E6E4B7-051C-44B6-A82D-5FCE78823A81" payTransType="pay"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTION>
ответ:
<AUTHTRANSACTIONRESULT task="confirm" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTTEXT> </PRINTTEXT> <PRINTUNFISCAL> <!-- с версии 12, если есть заменяет PRINTTEXT, одновременное появление и PRINTUNFISCAL - ошибка--> <Unfiscal> </Unfiscal> <Unfiscal> </Unfiscal> </PRINUNFISCAL> <SCREENTEXT> </SCREENTEXT> <AUTHOPERATIONS> <AUTHOPERATION payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" value="123.32" needAfterPrint="1" transactionNumber="3210" transactionStatus="confirmed" extIntegerInfo="123123" authCode="OK"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTIONRESULT>
Ошибки в этом случае следует игнорировать (записав в лог)
Отмена платежа
Желательно инициировать отмену платежа не автоматически, а по конкретной осознанной команде кассира, так как в некоторых терминалах нет автоматической отмены и требуется катать карту.
Отмена платежа может быть либо после авторизации, когда чек ещё не был напечатан, либо при удалении уже распечатанного чека. В любом случае вызов одинаков:
<AUTHTRANSACTION terminalId="5B3F851D-1C75-41C1-B3B3-B0927E49D3ED" task="void" afterPrint="0" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37"> <AUTHOPERATIONS> <AUTHOPERATION value="123.32" payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" inputType="manual" transactionNumber="3210" transactionStatus="confirmed" extIntegerInfo="123123" currencyId="C7E6E4B7-051C-44B6-A82D-5FCE78823A81" payTransType="pay"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTION>
ответ:
<AUTHTRANSACTIONRESULT task="void" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTTEXT> </PRINTTEXT> <PRINTUNFISCAL> <!-- с версии 12, если есть заменяет PRINTTEXT, одновременное появление и PRINTUNFISCAL - ошибка--> <Unfiscal> </Unfiscal> <Unfiscal> </Unfiscal> </PRINUNFISCAL> <SCREENTEXT> </SCREENTEXT> <AUTHOPERATIONS> <AUTHOPERATION payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" value="123.32" needAfterPrint="1" transactionNumber="3210" transactionStatus="voided" extIntegerInfo="123123" authCode="OK"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTIONRESULT>
После этого хост печатает слип, удаляет чек (если надо), после этого, если всё прошло хорошо и вернулось needAfterPrint=«0» (или нет атрибута needAfterPrint) всё закончилось.
Если вернулось needAfterPrint=«1» хост выполняет:
<AUTHTRANSACTION terminalId="5B3F851D-1C75-41C1-B3B3-B0927E49D3ED" task="void" afterPrint="1" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37"> <AUTHOPERATIONS> <AUTHOPERATION value="123.32" payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" inputType="manual" transactionNumber="3210" transactionStatus="confirmed" extIntegerInfo="123123" currencyId="C7E6E4B7-051C-44B6-A82D-5FCE78823A81" payTransType="pay"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTION>
ответ:
<AUTHTRANSACTIONRESULT task="void" orderId="E47D3F17-18D4-4935-AA4F-002CE5E27A37" hardErrorCode="0" softErrorCode="0" errorText="No error"> <PRINTTEXT> </PRINTTEXT> <PRINTUNFISCAL> <!-- с версии 12, если есть заменяет PRINTTEXT, одновременное появление и PRINTUNFISCAL - ошибка--> <Unfiscal> </Unfiscal> <Unfiscal> </Unfiscal> </PRINUNFISCAL> <SCREENTEXT> </SCREENTEXT> <AUTHOPERATIONS> <AUTHOPERATION payId="A400DCEE-E441-4B6F-916F-8FCC9D60AF30" value="123.32" needAfterPrint="1" transactionNumber="3210" transactionStatus="voided" extIntegerInfo="123123" authCode="OK"> <EXTTRANSACTIONINFO> <EXTTRANSACTIONINFOPART value="BANK:SBRF"/> <EXTTRANSACTIONINFOPART value="PdsCard=BA3FECE89032815503E8A123456789AC64BA6573D;0001"/> </EXTTRANSACTIONINFO> </AUTHOPERATION> </AUTHOPERATIONS> </AUTHTRANSACTIONRESULT>
Печатается слип, ошибки этого ответа и ошибки печати игнорируются.
Версия 0 (до XML)
DLL предоставляет следующие функции:
InitDevice
GetStatus
TerminalAuthorizeEx (устаревшая TerminalAuthorize)
TerminalConfirmEx (устаревшая TerminalConfirm)
TerminalVoidEx (устаревшая TerminalVoid)
Элемент ненумерованного списка TerminalAfterPrintVoid
TerminalAfterPrintConfirm
TerminalAbort
Done