Информационный поток
Задания вакансии материалы разработки сообщения форума
Рубрики статей и материалов
Яндекс-директ

Передаем контакты из 1с в Битрикс24 через REST API

  • Добавить свою публикацию
  • для этого требуется регистрация

Первым делом регистрирую свое приложение в Битрикс24. Это нужно для получения client_id и client_secret.  Эти коды используются при авторизации.

Изображение

Необходимо дать приложению требуемые права и поставить отметку "Приложение использует только API"

Изображение

 

Ссылка на приложение может быть любая, в дальнейшем это не нужно.

 

Теперь подключаемся к Битрикс24

 

 

Процедура ПодключитьсяКБитрикс()

	Если НЕ (AccessToken = "" ИЛИ RefreshToken = "" ИЛИ RefreshTime = Дата(1, 1, 1)) Тогда
		
		Возврат;
		
	КонецЕсли;

 	
	ssl = Новый ЗащищенноеСоединениеOpenSSL(
                Новый СертификатКлиентаWindows(
                                СпособВыбораСертификатаWindows.Выбирать),
                Новый СертификатыУдостоверяющихЦентровWindows());   
                         
	Соединение = Новый HTTPСоединение(
                            АдресБитрикс24, //"хххххх.bitrix24.ru",
							, // порт
							"user@mail.ru", // пользователь
							"123456", // пароль
							, // прокси
                            5, // таймаут в секундах
                            ssl // защищенное HTTPS соединение
                        );
						
						
	Заголовки = Новый Соответствие;
	
	Запрос = Новый HTTPЗапрос("oauth/authorize/?client_id=" + <strong>client_id</strong>, Заголовки);					
	Ответ = Соединение.Получить(Запрос);
	
	
	// если нас переадрессовали
	Если Ответ.КодСостояния = 302 Тогда
		
		//в Location взять code
		
		Параметры = ПолучитьПараметрыИзGetСтроки(Ответ.Заголовки.Получить("Location"));
		Cookie = Ответ.Заголовки.Получить("Set-Cookie");
		Код = Неопределено;
		
		
		Если Параметры.Свойство("code", Код) Тогда
			
			// используя Код получаем access_token и refresh_token
			
			Соединение = Новый HTTPСоединение(
                            "oauth.bitrix.info",
							, // порт
							, // пользователь
							, // пароль
							, // прокси
                            5, // таймаут в секундах
                            ssl // защищенное HTTPS соединение
                        );
						
			Запрос.АдресРесурса	= "oauth/token" + ПараметрыАвторизацииВСтроке(Код);	
			Запрос.Заголовки.Вставить("Cookie", Cookie);
			
			
			Ответ = Соединение.Получить(Запрос);
			
			
			Если Ответ.КодСостояния <> 200 Тогда
				
				ВызватьИсключение "Ошибка при получении access_token"; 
				
			Иначе
				
				// разобрать полученный json
				json = Ответ.ПолучитьТелоКакСтроку();
				
				
				Чтение = Новый ЧтениеJSON;
				Чтение.УстановитьСтроку(json);
				ОтветСтруктура = ПрочитатьJSON(Чтение);
				
				// сохраняю параметры подключения
				AccessToken  = ОтветСтруктура.access_token;
				RefreshToken = ОтветСтруктура.refresh_token;
				RefreshTime  = ТекущаяДата() + ОтветСтруктура.expires_in;
				
			
			КонецЕсли;
			
			
			
		Иначе
			
			ВызватьИсключение "Ошибка при подключении, нет параметра code";
			
		КонецЕсли;
		
		
	КонецЕсли;

КонецПроцедуры

Функция ПараметрыАвторизацииВСтроке(Код)
	
	// собрать параметры в строку Get запроса
	Возврат "/?" + "grant_type=authorization_code" + "&" + 
		"client_id=" + client_id + "&" + 
		"client_secret=" + client_secret + "&" + 
		"code=" + Код;
		
КонецФункции


 

client_id и client_secret получили при регистрации приложения в Битрикс24.

 

Функция "ПолучитьПараметрыИзGetСтроки" из строки вида адрес?параметр1=значение1&параметр2=значение2 возвращает структуру, где ключ = параметр, а значение = значение

 

Теперь пробуем добавить контакт

 

 

	СтрПараметров =  "fields[NAME]=" + Имя + "&fields[SECOND_NAME]=" + Отчество + "&fields[LAST_NAME]=" + Фамилия +
		"&fields[ADDRESS_CITY]=" + СтруктураПараметров.Город + 
		"&fields[COMMENTS]=" + СтруктураПараметров.Вашвиддеятельности + 
		"&fields[EMAIL][0][VALUE_TYPE]=WORK&fields[EMAIL][0][VALUE]=" + СтруктураПараметров.Email +
		"&fields[ASSIGNED_BY_ID]=" +  ОтветственныйИД + "&fields[TYPE_ID]=CLIENT" +
		"&fields[PHONE][0][VALUE_TYPE]=WORK&fields[PHONE][0][VALUE]=" + СтруктураПараметров.Телефон;
		
	
	Рез = ОтправитьRESTЗапрос("crm.contact.add", СтрПараметров, "");
	
	// смотрим что получилось

	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(Рез);
	
	РезСтр = ПрочитатьJSON(Чтение);

	Если РезСтр.Свойство("result", ИдНовогоКонтакта)  Тогда
		
		Сообщить("Контакт добавлен!");
		
	Иначе
		
		ВызватьИсключение "Ошибка при добавлении нового контакта!";
		
	КонецЕсли;
	

 

 Что делает ОтправитьRESTЗапрос:

 

Функция ОтправитьRESTЗапрос(RESTЗапрос, Параметры, Тело)
 	
	ПроверитьТокен();
	
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL(
                Новый СертификатКлиентаWindows(
                                СпособВыбораСертификатаWindows.Выбирать),
                Новый СертификатыУдостоверяющихЦентровWindows());   
                         
	Соединение = Новый HTTPСоединение(
                            АдресБитрикс24,
							, // порт
							, // пользователь
							, // пароль
							, // прокси
                            5, // таймаут в секундах
                            ssl // защищенное HTTPS соединение
                        );
						
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Cookie", Cookie);
	
	
	
	Если Параметры = "" Тогда
		Запрос = Новый HTTPЗапрос("rest/" + RESTЗапрос + "?auth=" + AccessToken, Заголовки);											
	Иначе
		Запрос = Новый HTTPЗапрос("rest/" + RESTЗапрос + "?auth=" + AccessToken + "&" + Параметры, Заголовки);											
	КонецЕсли;
	
	Запрос.УстановитьТелоИзСтроки(тело);
	
			
			
	Ответ = Соединение.Получить(Запрос);	

	Возврат Ответ.ПолучитьТелоКакСтроку();

КонецФункции

 

 

 Ну и соответственно  процедура ПроверитьТокен:

 

 

Процедура ПроверитьТокен()
 	
	// проверяю токен на валидность
	
	Если RefreshTime = Дата(1, 1, 1) Тогда
		
		ПодключитьсяКБитрикс();
		Возврат;
		
	КонецЕсли;
	
	Если  RefreshTime - 5 < ТекущаяДата() Тогда
		
			ssl = Новый ЗащищенноеСоединениеOpenSSL(
                Новый СертификатКлиентаWindows(
                                СпособВыбораСертификатаWindows.Выбирать),
                Новый СертификатыУдостоверяющихЦентровWindows());   		
		// обновить токен
			Соединение = Новый HTTPСоединение(
                            "oauth.bitrix.info",
							, // порт
							, // пользователь
							, // пароль
							, // прокси
                            5, // таймаут в секундах
                            ssl // защищенное HTTPS соединение
                        );
						
						
			Заголовки = Новый Соответствие;			
			Заголовки.Вставить("Cookie", Cookie);						
			
			Запрос = Новый HTTPЗапрос("oauth/token" + ПараметрыОбновленияВСтроке(), Заголовки);
			
			
			
			
			Ответ = Соединение.Получить(Запрос);
			
			
			Если Ответ.КодСостояния <> 200 Тогда
				
				ВызватьИсключение "Ошибка при получении access_token"; 
				
			Иначе
				
				// разобрать полученный json
				json = Ответ.ПолучитьТелоКакСтроку();
				
				Чтение = Новый ЧтениеJSON;
				Чтение.УстановитьСтроку(json);
				ОтветСтруктура = ПрочитатьJSON(Чтение);
				
				
				// сохраняю параметры подключения
				AccessToken  = ОтветСтруктура.access_token;
				RefreshToken = ОтветСтруктура.refresh_token;
				RefreshTime  = ТекущаяДата() + ОтветСтруктура.expires_in;
			
			КонецЕсли;
		
		
	КонецЕсли;

КонецПроцедуры


Функция ПараметрыОбновленияВСтроке()
	
	Возврат "/?" + "grant_type=refresh_token" + "&" + 
		"client_id=" + client_id + "&" + 
		"client_secret=" + client_secret + "&" + 
		"refresh_token=" + RefreshToken;
	
КонецФункции


 

Что пока не удалось сделать. Пока не удалось передавать пользовательские поля. И при создании контакта ответственным ставится пользователь, под которым залогинились. А не тот, которого указываю в fields[ASSIGNED_BY_ID].

 
0
≡ к списку статей