В связи с изменениями в налоговом законодательстве будем производить кассовое совмещение терминала «ПриватБанк» VX-520 с 1с77, и поскольку 1С77 плохо обрабатывает результаты WinSock, то используем внешний скрипт vbs.
Принцип работы следующий, сам скрипт vbs обеспечивает передачу данных на терминал и сохранение ответа в файл, со стороны 1с мы вызываем скрипт со следующими параметрами:
- IP адрес терминала
- Порт терминала
- Данные для оплаты (сумма)
- Имя файла для сохранения полученных от терминала данных
Сам скрипт:
Dim WinSock, i, responseData, requestData, remoteHost, remotePort, fso, file, buffer
‘ Проверяем аргументы
If WScript.Arguments.Count < 4 Then WScript.Echo «Использование: cscript script.vbs «
WScript.Quit
End If
‘ Читаем аргументы
remoteHost = WScript.Arguments(0)
remotePort = WScript.Arguments(1)
‘requestData = «{«»method»»: «»GetTerminalInfo»», «»step»»: 0}»
requestData = WScript.Arguments(2)
requestData = Replace(requestData, «‘», «»»»)
outputFile = WScript.Arguments(3)
‘ Создаём объект Winsock
Set WinSock = CreateObject(«MSWinsock.Winsock»)
If WinSock Is Nothing Then
WScript.Echo «Не удалось создать объект MSWinsock.Winsock!»
WScript.Quit
End If
‘ Устанавливаем IP и порт сервера
WinSock.RemoteHost = remoteHost
WinSock.RemotePort = CInt(remotePort)
‘ Подключаемся
WinSock.Connect
‘ Ждём подключения (5 секунд)
For i = 1 To 200
WScript.Sleep 100
If WinSock.State = 7 Then ‘ 7 — Connected
WScript.Echo «Подключение установлено!»
Exit For
End If
Next
‘ Проверяем подключение
If WinSock.State <> 7 Then
WScript.Echo «Не удалось подключиться!»
WScript.Quit
End If
‘ Отправляем JSON-запрос
WinSock.SendData requestData
WScript.Echo «Запрос отправлен: » & requestData
‘ Ожидаем ответ от сервера
WScript.Echo «Ожидание ответа…»
responseData = «»
For i = 1 To 400 ‘ 10 секунд ожидания
WScript.Sleep 250
If WinSock.BytesReceived > 0 Then
Do
tempData = «»
WinSock.GetData tempData
responseData = responseData & tempData
WScript.Sleep 8000 ‘ Ждём 500 мс перед повторной проверкой
Loop While WinSock.BytesReceived > 0
Exit For
End If
Next
‘ Проверяем, есть ли данные
If Len(responseData) > 0 Then
WScript.Echo «Ответ от сервера получен: » & responseData
Else
responseData = «Ошибка: ответ не получен»
WScript.Echo responseData
End If
‘ Записываем ответ в файл
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set file = fso.CreateTextFile(outputFile, True)
file.WriteLine responseData
file.Close
‘ НЕ закрываем соединение, можно повторно отправлять запросы
‘ *** Раскомментируй, если нужно закрытие ***
WinSock.Close
Set WinSock = Nothing
На стороне 1с все очень просто,
Сверху объявляем переменные
Перем terminalId;
Перем paymentSystem;
Перем pan;
Перем approvalCode;
Перем rrn;
формируем и делаем запрос
Перем WinSock, IP_Терминала, ПортТерминала, JSONЗапрос, Ответ;
// Перем terminalId, paymentSystem, pan, approvalCode, rrn;
// IP и порт терминала (укажите свой)
IP_Терминала = Склад.ТерминалАйпи;
Порт_Терминала = Склад.ТерминалПорт;
СуммаОтформатирована = Формат(Сумма, "Ч8.2");
СуммаОтформатирована = СтрЗаменить(СуммаОтформатирована, " ", "");
// Формируем JSON-запросJSON_Запрос = "{'method': 'Purchase', 'step': 0, 'params': { " +
JSON_Запрос = "{'method': 'Purchase', 'step': 0, 'params': { " +
// «‘amount’: ‘» + Строка(Формат(Сумма, «ЧГ=0.00»)) + «‘, » +
«‘amount’:'»+Строка(СуммаОтформатирована)+»‘,»+
«‘discount’: », » +
«‘merchantId’: ‘0’, » +
«‘facepay’: ‘false’, » +
«‘subMerchant’: » } }»;
//Сообщить(JSON_Запрос);
КаталогВременныхФайловТерминалов=»C:\Files\terminal\»;
ВременныйФайл = КаталогВременныхФайловТерминалов+»output»+СокрЛП(Склад.Код)+».txt»;
// Команда для запуска VBScript
Команда = "cscript C:\Files\terminal\req2.vbs " +IP_Терминала+" " +Порт_Терминала+" """+JSON_Запрос+""" " + ВременныйФайл;
Сообщить("cscript C:\Files\terminal\req2.vbs " +IP_Терминала+" " +Порт_Терминала+" """+JSON_Запрос+""" " + ВременныйФайл);
// Запускаем скрипт через WScript.Shell
Shell = СоздатьОбъект("WScript.Shell");
Shell.Run(Команда, 0, 1); // 0 - фоновый режим, 1 - ждем завершения
Далее получаем и разбираем ответ