Не так давно потребовалось срочно реализовать эквайринг от Сбербанка в одно самописной конфигурации. За основу была взята соответствующая часть конфигурации «Библиотека подключаемого оборудования» от 1С, из которой я выкинул все лишнее. Отмечу, что «лишними» те или иные части кода были признаны исходя из особенностей задачи и моего субъективного мнения, то есть в Вашем случае это может быть не так.
Отдельно отмечу, что эквайринг — тема очень ответственная, ибо напрямую связана с деньгами (можно, например, продать товар и не взять за него денег), поэтому прошу быть предельно осторожными и не стесняться добавлять всевозможные проверки.
Ну и напоследок напомню, что все написанное ниже приводится в ознакомительных целях и использовать эту информацию Вы можете исключительно на свой страх и риск.
Регистрация и подключение библиотеки
Итак, для работы нам нужно зарегистрировать в системе две DLL-ки: SBRF.dll и SBRFCOM.dll. Библиотека SBRFCOM.dll бывает в двух вариантах: старый (3 параметра) и новый (7 параметров), нам естественно нужен новый.
Получить обе эти DLL-ки можно у того специально обученного человека из Сбербанка, который придет настраивать терминал. Регистрацию библиотек в системе обычно делает все тот же сотрудник Сбербанка, но если этого по какой-то причине не произошло, то библиотеки нужно зарегистрировать самостоятельно, из командной строки при помощи утилиты regsvr32 (командную строку запустите от имени администратора):
Подключение зарегистрированной библиотеки необходимо выполнить перед совершением каких-либо операций с эквайринговым терминалом, делается это примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | &НаКлиенте Процедура Подключение(Команда) ОбъектДрайвераАвторизатора = ПодключитьАвторизатор(); КонецПроцедуры &НаКлиенте Функция ПодключитьАвторизатор() Попытка ПодключитьВнешнююКомпоненту("AddIn.SBRFCOMObject"); ОбъектДрайвераАвторизатора = Новый ("AddIn.SBRFCOMExtension"); Исключение ОбъектДрайвераАвторизатора = Неопределено; Сообщить("Ошибка при подключении авторизатора: "+ОписаниеОшибки()); КонецПопытки; Возврат ОбъектДрайвераАвторизатора; КонецФункции |
В случае успеха, переменную «ОбъектДрайвераАвторизатора» нужно каким-либо образом сохранить для дальнейшего использования, именно через эту переменную будут вызываться все необходимые методы.
Вспомогательные функции SBRFCOM
Общая схема работы с методами библиотеки SBRFCOM (кроме сверки итогов) такова:
- Вызвали метод;
- Если все хорошо, то получили и распечатали слип;
- Если возникли проблемы — отменили операцию.
Вначале скажу несколько слов о слипе. Итак слип — это документ, который печатается в двух экземплярах (один клиенту, один организации) при осуществлении каких-либо операций с банковской картой. Печать слипа обязательна (хотя зачастую обходятся и без него), так как в случае каких-либо разногласий с банком эквайрером разбирательства начинаются с проверки наличия слипа по конкретной операции. Технически слип формируется самим терминалом (по крайней мере в нашем случае) или вручную. Если надумали формировать слип вручную, то в конфигурации «Библиотека подключаемого оборудования» имеется общий макет содержащий пример слипа.
Рассмотрим две служебные функции. Первая из них — «АварийнаяОтменаОперации», служит для отмены операции в том случае, когда при получении слипа возникли ошибки. О важности получения слипа говорилось выше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | &НаКлиенте Функция АварийнаяОтменаОперации(СуммаВРублях, СсылочныйНомер) Результат = Истина; Ошибка = Неопределено; ОбъектДрайвераАвторизатора.ТипКарты = 0; СуммаВременная = СуммаВРублях * 100; Ответ = ОбъектДрайвераАвторизатора.ОтменитьПлатежПоПлатежнойКарте(СуммаВременная, СсылочныйНомер); Если НЕ Ответ Тогда ОбъектДрайвераАвторизатора.ПолучитьОшибку(Ошибка); Результат = Ложь; КонецЕсли; Возврат Результат; КонецФункции |
Вторая функция получает строки слипа и формирует из них готовую к печати текст.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | &НаКлиенте Функция ПолучитьСтрокиСлипЧека(СлипЧек) Результат = Истина; СлипЧек = ""; Для Индекс = 1 По ОбъектДрайвераАвторизатора.КоличествоСтрокСлипЧека Цикл СтрокаЧека = ""; УспешноПолучено = ОбъектДрайвераАвторизатора.ПолучитьСтрокуСлипЧека(Индекс, СтрокаЧека); Если УспешноПолучено Тогда Если КодСимвола(СтрокаЧека) = 0 Тогда СлипЧек = СлипЧек + "[cut]" + Символы.ПС + СтрокаЧека; Иначе СлипЧек = СлипЧек + СтрокаЧека + ?(Индекс = ОбъектДрайвераАвторизатора.КоличествоСтрокСлипЧека, "", Символ(13) + Символ(10)); КонецЕсли; Иначе Сообщить("Ошибка при получении строк слип-чека"); Результат = Ложь; КонецЕсли; КонецЦикла; Если Результат Тогда КопииСлипЧека = ""; Для Индекс = 1 По ОбъектДрайвераАвторизатора.КоличествоКопийСлипЧека Цикл КопииСлипЧека = КопииСлипЧека + СлипЧек + ?(Индекс = ОбъектДрайвераАвторизатора.КоличествоКопийСлипЧека, "", Символы.ПС + "[cut]" + Символы.ПС); КонецЦикла; СлипЧек = КопииСлипЧека; КонецЕсли; Возврат Результат; КонецФункции |
Основные функции SBRFCOM
Теперь приведем самую главную функцию — собственно оплата картой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | &НаКлиенте Функция ОплатитьКартой(СуммаВРублях) Результат = Ложь; СсылочныйНомер = Неопределено; КодАвторизации = Неопределено; КодХеш = Неопределено; КартаСбербанка = Неопределено; НазваниеКарты = Неопределено; Ошибка = Неопределено; ОбъектДрайвераАвторизатора.ТипКарты = 0; СуммаВременная = СуммаВРублях * 100; НомерКарты = "****************"; Попытка Ответ = ОбъектДрайвераАвторизатора.ОплатитьПлатежнойКартой(СуммаВременная, СсылочныйНомер, КодАвторизации, КодХеш, КартаСбербанка, НазваниеКарты, НомерКарты); Исключение Сообщить("Ошибка при работе с библиотекой SBRFCOM:"+ОписаниеОшибки()); Возврат Результат; КонецПопытки; Если НЕ Ответ Тогда ОбъектДрайвераАвторизатора.ПолучитьОшибку(Ошибка); Иначе СлипЧек = Неопределено; Результат = ПолучитьСтрокиСлипЧека(СлипЧек); Если Результат Тогда //ПечатьТекста(СлипЧек); Иначе Сообщить("Произошла ошибка. Аварийная отмена операции..."); АварийнаяОтменаОперации(СуммаВРублях, СсылочныйНомер); КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции |
В случае успешного выполнения переменные, объявленные в начале функции, обретают осмысленные значения и было бы неплохо сохранить их каким-либо образом с привязкой к документу оплаты, эти данные потребуются для отмены или возврата платежа. Закомментированная строка вызывает функцию печати текста, реализация этой функции может быть различной.
Далее следует функция отмены платежа, она применяется для отмены платежа по платежной карте совершенного в этот же день (до сверки итогов).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | &НаКлиенте Функция ОтменитьОперацию(СуммаВРублях, СсылочныйНомер) Результат = Истина; Ошибка = Неопределено; ОбъектДрайвераАвторизатора.ТипКарты = 0; СуммаВременная = СуммаВРублях * 100; Ответ = ОбъектДрайвераАвторизатора.ОтменитьПлатежПоПлатежнойКарте(СуммаВременная, СсылочныйНомер); Если НЕ Ответ Тогда ОбъектДрайвераАвторизатора.ПолучитьОшибку(Ошибка); Результат = Ложь; Иначе СлипЧек = Неопределено; Результат = ПолучитьСтрокиСлипЧека(СлипЧек); Если Результат Тогда //ПечатьТекста(СлипЧек); Иначе АварийнаяОтменаОперации(СуммаВРублях, СсылочныйНомер); КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции |
Если же требуется отменить оплату спустя один или несколько дней, то нужно использовать возврат платежа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | &НаКлиенте Функция ВозвратПлатежа(СуммаВРублях, НомерКарты) Результат = Ложь; Ошибка = Неопределено; СсылочныйНомер = Неопределено; КодАвторизации = Неопределено; КодХеш = Неопределено; КартаСбербанка = Неопределено; НазваниеКарты = Неопределено; ОбъектДрайвераАвторизатора.ТипКарты = 0; СуммаВременная = СуммаВРублях * 100; Попытка Ответ = ОбъектДрайвераАвторизатора.ВернутьПлатежПоПлатежнойКарте(СуммаВременная, СсылочныйНомер, КодАвторизации, КодХеш, КартаСбербанка, НазваниеКарты, НомерКарты); Исключение Сообщить("Ошибка при работе с библиотекой SBRFCOM:"+ОписаниеОшибки()); Возврат Результат; КонецПопытки; Если НЕ Ответ Тогда ОбъектДрайвераАвторизатора.ПолучитьОшибку(Ошибка); Иначе СлипЧек = Неопределено; Результат = ПолучитьСтрокиСлипЧека(СлипЧек); Если Результат Тогда //ПечатьТекста(СлипЧек); Иначе Сообщить("Произошла ошибка. Аварийная отмена операции..."); АварийнаяОтменаОперации(СуммаВРублях, СсылочныйНомер); КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции |
Сверка итогов
Напоследок приведем функцию сверки итогов, ее необходимо выполнять по окончанию каждого рабочего дня. В этом случае деньги за текущий день будут перечислены на следующий день. Если же не выполнять сверку итогов, то деньги будут перечислены через два или три дня.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | &НаКлиенте Функция СверкаИтогов() Результат = Истина; Ошибка = Неопределено; Ответ = ОбъектДрайвераАвторизатора.ИтогиДняПоКартам(); Если НЕ Ответ Тогда ОбъектДрайвераАвторизатора.ПолучитьОшибку(Ошибка); Результат = Ложь; Иначе СлипЧек = Неопределено; Результат = ПолучитьСтрокиСлипЧека(СлипЧек); Если Результат Тогда //ПечатьТекста(СлипЧек); КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции |
На этом все, надеюсь эта статья поможет Вам реализовать эквайринг от Сбербанка в Вашей конфигурации, буду рад любым комментариям и замечаниям. И еще раз напомню о том, что в данной теме нужно быть предельно внимательным и осторожным.
Загрузка...
А как реализовать автоматическое выполнение сверки итогов в ут 11.3 при закрытии смены
После регистрации данной библиотеки в 1С 8.3.9.2033 УТ 11.1.10.173 при оплате картой номер должен считываться автоматически т.е его не надо будет в 1С прописывать в ручную.
а как сделать чтобы при закрытии смены печатался z-отчет по экварингу автоматически?
нашли ответ? если да покажите)
Можно ли получить сверку по проведенным платежам ИЗ ТЕРМИНАЛА не проводя сверку итогов? Т.е. не закрывая смену?
Понятно, что можно вести учет по закрытым чекам в программе… а в терминале?
Формировать чеки используя библиотеку SBRF.DLL.
Результаты операций хранить в регистре. Сверку проводить по данным терминальной смены.
// Подключение внешней компоненты
Драйвер = Новый COMОбъект(«SBRFSRV.Server»);
// начинаем оплату
Драйвер.Clear();
Драйвер.SParam(«Amount»,мСумма);
РезКод = Драйвер.NFun(4000); // оплата
Если РезКод = 0 тогда
РезКод = Драйвер.NFun(6001); // Транзакция в подвешенном состоянии
Если РезКод = 0 тогда
//РезКод = Драйвер.NFun(6001); // завершили транзакцию подтверждением
Результат = Истина;
Иначе
Сообщить(«Ошибка подтверждения транзакции. Необходимо обратиться в банк!»);
КонецЕсли;
// получим необходимые нам параметры
Если Результат тогда
МассивСтрокСлипЧека = СБ_ПолучитьСтрокиСлипЧека(Драйвер.GParamString(«Cheque1251»),МассивСтрокСлипЧека,Объект.Параметры.ШиринаЧека) ;
КодRRN = Драйвер.GParamString(«RRN»);
КодАвторизации = Драйвер.GParamString(«AuthCode»);
НомерТерминала = Драйвер.GParamString(«TermNum»);
КонецЕсли;
Иначе
Сообщить(ПолучитьОписаниеОшибки(Объект.КодыВсехОшибок,РезКод));
КонецЕсли;
ЗаписатьЛогОперации();
Добрый день! Подскажите пожалуйста:
1. Что изменится в коде приведенном в статье, если на эквайринг терминале прописано несколько Юридических лиц. Кажется это делается сотрудниками Сбербанка через Отделы и в 7ой версии SBRFCOM, вроде как, появилась возможность передавать параметр Department — т.е. id фирмы в терминале.
2. Где вы узнали все методы и параметры SBRFCOM? Просто взяли готовое в «Библиотеке подключаемого оборудования»? Нигде не могу найти описание методов и параметров..
Добрый день.
Документацию по SBRFCOM предоставляют сотрудники Сбербанка, там есть и описание и примеры (правда для 1С примеры какие-то устаревшие были).
Ответ на первый вопрос, я думаю, можно найти как раз в документации Сбербанка.
Вопрос так же актуален.
Нужно настроить распределение по секциям, не могу понять где зацепиться в 1с
В документации о параметре Department сказано буквально 2 слова, а именно то, что передается значение от 0 до 255, если 255, то после проведения картой нужно будет выбрать на терминале секцию.
И вот не могу понять куда этот параметр прицепить и как его передать
Конфигурация 1С Розница 2.2.7
Доброго времени суток!
Подскажите, пожалуйста, начиная с какой версии в 1С появилась поддержка интегрированных терминалов? Очень нужно.
Как работать с терминалом при использовании терминального сервера (rdp)?