На данной странице приводится пример интеграции 1С с Passteam
Описание интеграции
Интеграция 1С и Passteam рассматривается на примере программного продукта 1С:Розница 2.3.1.40.
Карты лояльности представлены справочником ИнформационныеКарты. Необходимо предусмотреть нетиповые реквизиты:
cardId - строка, длина 24. Идентификатор карты в Passteam.
cardlUrl – строка, неограниченной длины. Ссылка на скачивание карты.
installed – булево. Статус установки карты.
Справочник информационные карты
В модуле объекта справочника ИнформационныеКарты, в событии ПередЗаписью добавляем проверку: Если ПустаяСтрока(ЭтотОбъект.cardId) Тогда …
Если данное условие выполняется отправляем запрос CreateCard и после получения ответа необходимо записать cardId и cardUrl в карту лояльности 1С в соответствующие реквизиты.
Если условие не выполняется, то необходимо отправить запрос UpdateCard и после получения ответа записать installed в соответствующий реквизит карты лояльности 1С.
Регистр накопления БонусныеБаллы
Для того, чтобы своевременно обновлять бонусный баланс клиента на карте, необходимо в регистре накопления БонусныеБаллы в событии ПриЗаписи вызывать функцию UpdateCard.
Примеры кода
Листинг справочника ИнформационныеКарты
// Процедура - обработчик события "ПередЗаписью".
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если ВидКарты = Перечисления.ВидыИнформационныхКарт.Штриховая Тогда
КодКарты = "";
КонецЕсли;
Если ТипЗнч(ВладелецКарты) = Тип("СправочникСсылка.Контрагенты")
ИЛИ ТипКарты = Перечисления.ТипыИнформационныхКарт.Регистрационная Тогда
ДатаСледующегоОпроса = Дата("00010101");
КонецЕсли;
Попытка
Если ПустаяСтрока(ЭтотОбъект.cardId) Тогда
CreateCard();
Иначе
updateCard();
КонецЕсли;
Исключение
Сообщить("При создании карты в Passteam возникла ошибка" + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
#КонецОбласти
#КонецЕсли
# Область ИнтеграцияPassteam
Процедура CreateCard()
Соединение = Новый HTTPСоединение("getpass.passteam.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "АВТОРИЗАЦИОННЫЙ ТОКЕН");
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос = Новый HTTPЗапрос("/oapi/v1/createcard", Заголовки);
СтрокаЗапроса = ("templateId=%1&values[%%CLIENT_NAME%%]=%2&values[%%BIRTHDAY%%]=%3&values[%%PHONE%%]=%4&values[%%EMAIL%%]=%5&values[%%BONUS%%]=%6") ;
Если ЗначениеЗаполнено(ЭтотОбъект.ВладелецКарты) Тогда
НомерТелефона = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].НомерТелефона);
АдресЭП = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].АдресЭП);
Если ТипЗнч(ЭтотОбъект.ВладелецКарты) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ДатаРождения = Формат(ЭтотОбъект.ВладелецКарты.ДатаРождения,"ДФ=dd.MM.yyyy");
Иначе
ДатаРождения = "";
КонецЕсли;
Иначе
НомерТелефона = "";
АдресЭП = "";
ДатаРождения = "";
КонецЕсли;
СтрокаЗапроса = СтрШаблон(СтрокаЗапроса,"ИДЕНТИФИКАТОР ШАБЛОНА",ЭтотОбъект.ВладелецКарты,ДатаРождения,НомерТелефона,АдресЭП,0);
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ЧтениеJSON = Новый ЧтениеJSON;
СтрокаДоЧтения = СтрЗаменить(Ответ.ПолучитьТелоКакСтроку(), "%","");
ЧтениеJSON.УстановитьСтроку(СтрокаДоЧтения);
Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
Если Данные.code = 200 Тогда
Сообщить("Карта создана успешно!");
ЭтотОбъект.cardId = Данные.result.cardId;
ЭтотОбъект.CardUrl = Данные.result.cardUrl;
ИначеЕсли Данные.code = 409 Тогда
Сообщить("Данный номер телефона уже привязан к карте");
ИначеЕсли Данные.code = 500 И Данные.message = "Provided field (PHONE) is unique and must be set." Тогда
Сообщить("Для создания карты необходимо указать номер мобильного телефона");
КонецЕсли;
КонецПроцедуры
Процедура UpdateCard() Экспорт
Соединение = Новый HTTPСоединение("getpass.passteam.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "АВТОРИЗАЦИОННЫЙ ТОКЕН");
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос = Новый HTTPЗапрос("/oapi/v1/updatecard", Заголовки);
СтрокаЗапроса = ("cardId=%1&values[%%CLIENT_NAME%%]=%2&values[%%BIRTHDAY%%]=%3&values[%%PHONE%%]=%4&values[%%EMAIL%%]=%5&values[%%BONUS%%]=%6") ;
Если ЗначениеЗаполнено(ЭтотОбъект.ВладелецКарты) Тогда
НомерТелефона = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].НомерТелефона);
АдресЭП = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].АдресЭП);
Если ТипЗнч(ЭтотОбъект.ВладелецКарты) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ДатаРождения = Формат(ЭтотОбъект.ВладелецКарты.ДатаРождения,"ДФ=dd.MM.yyyy");
Иначе
ДатаРождения = "";
КонецЕсли;
Иначе
НомерТелефона = "";
АдресЭП = "";
ДатаРождения = "";
КонецЕсли;
ЗапросБаллов = Новый Запрос;
ЗапросБаллов.Текст =
"ВЫБРАТЬ
| БонусныеБаллыОстатки.НачисленоОстаток КАК НачисленоОстаток
|ИЗ
| РегистрНакопления.БонусныеБаллы.Остатки(&ТекущаяДата, ДисконтнаяКарта = &ДисконтнаяКарта) КАК БонусныеБаллыОстатки";
ЗапросБаллов.УстановитьПараметр("ДисконтнаяКарта", ЭтотОбъект.Ссылка);
ЗапросБаллов.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
РезультатЗапроса = ЗапросБаллов.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() = 0 Тогда
Баллы = 0;
Иначе Баллы = РезультатЗапроса[0].НачисленоОстаток;
КонецЕсли;
СтрокаЗапроса = СтрШаблон(СтрокаЗапроса,ЭтотОбъект.cardId,ЭтотОбъект.ВладелецКарты,ДатаРождения,НомерТелефона,АдресЭП,Баллы);
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ЧтениеJSON = Новый ЧтениеJSON;
СтрокаДоЧтения = СтрЗаменить(Ответ.ПолучитьТелоКакСтроку(), "%","");
ЧтениеJSON.УстановитьСтроку(СтрокаДоЧтения);
Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
Если Данные.code = 200 Тогда
Сообщить("Карта успешно обновлена!");
ЭтотОбъект.installed = Данные.result.card.installed;
ИначеЕсли Данные.code = 409 Тогда
Сообщить("Данный номер телефона уже привязан к карте");
ИначеЕсли Данные.code = 500 И Данные.message = "Provided field (PHONE) is unique and must be set." Тогда
Сообщить("Для создания карты необходимо указать номер мобильного телефона");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
В АВТОРИЗАЦИОННЫЙ ТОКЕН и ИДЕНТИФИКАТОР ШАБЛОНА необходимо подставить соответствующие значения. Если вы не знаете, где их взять, уточните эту информацию у менеджера Passteam
CLIENT_NAME и BIRTHDAY - названия переменных в шаблоне. Они могут быть другими, чтобы узнать какие у вас переменные - обратитесь к менеджеру Passteam.
В некоторых случаях могут возникать проблемы с передачей спецсимволов при отправке http запроса.
В таких случаях необходимо передавать символы как
[ как %5B% как %25] как %5D
То есть как в чистом http запросе.
Например, строка запроса после всех подстановок будет выглядеть так:
Процедура ПриЗаписи(Отказ, Замещение)
Попытка
Для каждого эл Из ЭтотОбъект Цикл
нОбъект = Эл.ДисконтнаяКарта.ПолучитьОбъект();
нОбъект.UpdateCard();
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры