Интеграция с 1С

На данной странице приводится пример интеграции 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

В строке

СтрокаЗапроса = ("templateId=%1&values[%%CLIENT_NAME%%]=%2&values[%%BIRTHDAY%%]

CLIENT_NAME и BIRTHDAY - названия переменных в шаблоне. Они могут быть другими, чтобы узнать какие у вас переменные - обратитесь к менеджеру Passteam.

В некоторых случаях могут возникать проблемы с передачей спецсимволов при отправке http запроса.

В таких случаях необходимо передавать символы как [ как %5B % как %25 ] как %5D То есть как в чистом http запросе. Например, строка запроса после всех подстановок будет выглядеть так:

cardId=5bea7e305abcfd6b708b4573&values%5B%25BALANCE%25%5D=7500&values%5B%25_CODE%25%5D=3006880536055&values%5B%25NUMBERCARD%25%5D=3006880536055&values%5B%25DISCOUNT%25%5D=5

Листинг регистра накопления БонусныеБаллы

Процедура ПриЗаписи(Отказ, Замещение)
	Попытка
		Для каждого эл Из ЭтотОбъект Цикл
			нОбъект = Эл.ДисконтнаяКарта.ПолучитьОбъект();
			нОбъект.UpdateCard();
		КонецЦикла;
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Схема интеграции

Last updated