Часть 1. Авторизация OAuth 2.0 для получения данных из Битрикс 24
Всем привет! В данном уроке я покажу как интегрировать 1С и Битрикс 24. Для интеграции 1С и Битрикс 24 я создам расширение 1С и начну с реализации Авторизации OAuth 2.0.
Как говорится, лучше 1 раз увидеть, чем сто раз услышать. И для вас видео в самом конце статьи, приятного просмотра.
А для остальных статья ниже.
Подробно про авторизацию вы можете почитать по ссылке.
Перед началом курса пройдите регистрацию и создайте свой Битрикс24.
Открою базу 1С:Бухгалтерия в конфигураторе и добавлю расширение, назову его «ИнтеграцияБитрикс24». У расширения отключаю «Защита от опасных действий» и «Безопасный режим».
После этого в расширении создам подсистему «Битрикс24».
Добавляю общий серверный модуль «Core» и вставлю общую картинку из файла. Картинку назначу нашей подсистеме.
Добавлю два перечисления. Названия и их значения вы видите на скриншотах ниже.
Так как в текущей версии платформы (8.3.12) нельзя добавлять константы, то для хранения настроек, я создам регистр сведений. Настройки регистра на скриншотах ниже.
В модуле менеджера регистра сведений напишу функции и процедуры для работы с ним.
Функция ПолучитьСписокНастроект() Экспорт
СписокНастроек = Новый Соответствие;
НаборЗаписей = РегистрыСведений.ns_НастройкиБитрикс24.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
Для каждого ТекущаяЗапись Из НаборЗаписей Цикл
СписокНастроек.Вставить(ТекущаяЗапись.ВидНастройки, ТекущаяЗапись.Значение);
КонецЦикла;
Возврат СписокНастроек;
КонецФункции
Функция ОбязательныеНастройкиЗаполнены(СписокНастроек) Экспорт
Если НЕ ЗначениеЗаполнено(СписокНастроек[Перечисления.ns_ВидыНастроектБ24.НаименованиеБитрикс24]) ИЛИ
НЕ ЗначениеЗаполнено(СписокНастроек[Перечисления.ns_ВидыНастроектБ24.Логин]) ИЛИ
НЕ ЗначениеЗаполнено(СписокНастроек[Перечисления.ns_ВидыНастроектБ24.Пароль]) ИЛИ
НЕ ЗначениеЗаполнено(СписокНастроек[Перечисления.ns_ВидыНастроектБ24.Таймаут]) ИЛИ
НЕ ЗначениеЗаполнено(СписокНастроек[Перечисления.ns_ВидыНастроектБ24.КлючПриложения]) ИЛИ
НЕ ЗначениеЗаполнено(СписокНастроек[Перечисления.ns_ВидыНастроектБ24.КодПриложения]) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Процедура ЗаписатьНастройку(ВидНастройки, ЗначениеНастройки, ПараметрыПодключения = Неопределено) Экспорт
МенеджерЗаписи = РегистрыСведений.ns_НастройкиБитрикс24.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ВидНастройки = ВидНастройки;
МенеджерЗаписи.Значение = ЗначениеНастройки;
МенеджерЗаписи.Записать();
Если НЕ ПараметрыПодключения = Неопределено Тогда
ПараметрыПодключения.Вставить(ВидНастройки, ЗначениеНастройки);
КонецЕсли;
КонецПроцедуры
После я добавлю обработку «Администрирование».
Добавлю форму, на ней добавлю команду «Проверка связи» и размещу ее на форме.
Вернусь в общий модуль «Core» и добавлю код, ниже.
#Область ПодключениеКБитрикс24
Функция ИнициализацияПодключения(ПараметрыПодключения) Экспорт
Попытка
// Получаем Code
Соединение = ПолучитьHTTPСоединение(Перечисления.ns_ВидыHTTPЗапросов.oauth, ПараметрыПодключения);
Если Соединение = Неопределено Тогда
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка, «ИнициализацияПодключения | Ошибка инициализации соединения для получения Code»);
Возврат Неопределено;
КонецЕсли;
ЗапросHTTP = ЗапросHTTP_Authorize(ПараметрыПодключения);
Ответ = Соединение.Получить(ЗапросHTTP);
Если НЕ Ответ.КодСостояния = 302 Тогда
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка, «ИнициализацияПодключения | Ошибка запроса Authorize. Код состояния = » +
Ответ.КодСостояния + Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
Возврат Неопределено;
КонецЕсли;
СписокПараметров = ПолучитьСписокПараметров(Ответ.Заголовки.Получить(«Location»));
Code = СписокПараметров.Получить(«code»);
Cookie = Ответ.Заголовки.Получить(«Set-Cookie»);
Если Code = Неопределено ИЛИ Cookie = Неопределено Тогда
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка, «ИнициализацияПодключения | Не получены Code или Cookie из ответа сервера.»);
Возврат Неопределено;
КонецЕсли;
РегистрыСведений.ns_НастройкиБитрикс24.ЗаписатьНастройку(Перечисления.ns_ВидыНастроектБ24.Cookie, Cookie, ПараметрыПодключения);
// Используя Code получаем access_token и refresh_token
Соединение = ПолучитьHTTPСоединение(Перечисления.ns_ВидыHTTPЗапросов.token, ПараметрыПодключения);
Если Соединение = Неопределено Тогда
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка, «ИнициализацияПодключения | Ошибка инициализации соединения для получения access_token»);
Возврат Неопределено;
КонецЕсли;
ЗапросHTTP = ЗапросHTTP_Token(ПараметрыПодключения, Code, Cookie);
Ответ = Соединение.Получить(ЗапросHTTP);
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеToken = ПрочитатьJSON(Чтение);
РегистрыСведений.ns_НастройкиБитрикс24.ЗаписатьНастройку(Перечисления.ns_ВидыНастроектБ24.AccessToken, ДанныеToken.access_token);
РегистрыСведений.ns_НастройкиБитрикс24.ЗаписатьНастройку(Перечисления.ns_ВидыНастроектБ24.RefreshToken, ДанныеToken.refresh_token);
РегистрыСведений.ns_НастройкиБитрикс24.ЗаписатьНастройку(Перечисления.ns_ВидыНастроектБ24.RefreshTime, ТекущаяДата() + ДанныеToken.expires_in);
Иначе
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка, «ИнициализацияПодключения | Ошибка запроса Token. Код состояния = » +
Ответ.КодСостояния + Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
Возврат Неопределено;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка,,, «ИнициализацияПодключения» + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат Истина;
КонецФункции
#КонецОбласти
#Область РаботаССоединением
Функция ПолучитьHTTPСоединение(ВидЗапросаHTTP, ПараметрыПодключения)
Соединение = Неопределено;
Если РегистрыСведений.ns_НастройкиБитрикс24.ОбязательныеНастройкиЗаполнены(ПараметрыПодключения) Тогда
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
Если ВидЗапросаHTTP = Перечисления.ns_ВидыHTTPЗапросов.oauth Тогда
Соединение = Новый HTTPСоединение(
ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.НаименованиеБитрикс24],,
ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.Логин],
ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.Пароль],,
ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.Таймаут],
SSL);
ИначеЕсли ВидЗапросаHTTP = Перечисления.ns_ВидыHTTPЗапросов.token Тогда
Соединение = Новый HTTPСоединение(
«oauth.bitrix.info»,,,,,
ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.Таймаут],
SSL);
ИначеЕсли ВидЗапросаHTTP = Перечисления.ns_ВидыHTTPЗапросов.rest Тогда
Соединение = Новый HTTPСоединение(
ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.НаименованиеБитрикс24],,,,,
ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.Таймаут],
SSL);
Иначе
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка,,, «ПолучитьHTTPСоединение | Неизвестный вид HTTP запроса.»);
Возврат Неопределено;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка,,, «ПолучитьHTTPСоединение» + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Иначе
ЗаписьЖурналаРегистрации(«Битрикс24», УровеньЖурналаРегистрации.Ошибка,,, «ПолучитьHTTPСоединение | Не заполненны обязательные параметры.»);
Возврат Неопределено;
КонецЕсли;
Возврат Соединение;
КонецФункции
#КонецОбласти
#Область HTTP_Запросы
Функция ЗапросHTTP_Authorize(ПараметрыПодключения)
АдресРесурсаПараметры = Новый Соответствие;
АдресРесурсаПараметры.Вставить(«client_id», ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.КодПриложения]);
ЗапросHTTP = Новый HTTPЗапрос;
ЗапросHTTP.АдресРесурса = СформироватьАдресРесурса(«oauth/authorize», АдресРесурсаПараметры);
Возврат ЗапросHTTP;
КонецФункции
Функция ЗапросHTTP_Token(ПараметрыПодключения, Code, Cookie)
АдресРесурсаПараметры = Новый Соответствие;
АдресРесурсаПараметры.Вставить(«grant_type», «authorization_code»);
АдресРесурсаПараметры.Вставить(«client_id», ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.КодПриложения]);
АдресРесурсаПараметры.Вставить(«client_secret», ПараметрыПодключения[Перечисления.ns_ВидыНастроектБ24.КлючПриложения]);
АдресРесурсаПараметры.Вставить(«code», Code);
ЗапросHTTP = Новый HTTPЗапрос;
ЗапросHTTP.АдресРесурса = СформироватьАдресРесурса(«oauth/token», АдресРесурсаПараметры);
ЗапросHTTP.Заголовки.Вставить(«Cookie», Cookie);
Возврат ЗапросHTTP;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция СформироватьАдресРесурса(АдресРесурса, СписокПараметров)
АдресРесурсаСПараметрами = «»;
Если СписокПараметров.Количество() > 0 Тогда
АдресРесурсаСПараметрами = АдресРесурса + «/?»;
Для каждого ТекущийПараметр Из СписокПараметров Цикл
АдресРесурсаСПараметрами = АдресРесурсаСПараметрами + ТекущийПараметр.Ключ + «=» + ТекущийПараметр.Значение + «&»;
КонецЦикла;
Иначе
Возврат «»;
КонецЕсли;
Возврат Лев(АдресРесурсаСПараметрами, СтрДлина(АдресРесурсаСПараметрами) — 1);
КонецФункции
Функция ПолучитьСписокПараметров(СтрокаПараметров)
СписокПараметров = Новый Соответствие;
Если СтрокаПараметров = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
СтрокаПараметров = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) — СтрНайти(СтрокаПараметров, «?»));
МассивПараметров = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаПараметров, «&»);
Для каждого ТекущийПараметр Из МассивПараметров Цикл
ПараметрДлина = СтрДлина(ТекущийПараметр);
ПозицияРазделителя = СтрНайти(ТекущийПараметр, «=»);
ПараметрКлюч = Лев(ТекущийПараметр, ПозицияРазделителя — 1);
ПараметрЗначение = Прав(ТекущийПараметр, ПараметрДлина — ПозицияРазделителя);
СписокПараметров.Вставить(ПараметрКлюч, ПараметрЗначение);
КонецЦикла;
Возврат СписокПараметров;
КонецФункции
#КонецОбласти
В форме обработки, назначу код на обработчик команды «Проверка связи».
&НаСервереБезКонтекста
Функция ПроверкаСвязиНаСервере()
ПараметрыПодключения = РегистрыСведений.ns_НастройкиБитрикс24.ПолучитьСписокНастроект();
Возврат ns_Core.ИнициализацияПодключения(ПараметрыПодключения);
КонецФункции
&НаКлиенте
Процедура ПроверкаСвязи(Команда)
Результат = ПроверкаСвязиНаСервере();
Если Результат = Неопределено Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Инициализация соединения с Битрикс 24 прошла с ошибками, смотрите журнал регистрации.");
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Инициализация соединения с Битрикс 24 успешна.");
КонецЕсли;
КонецПроцедуры
Для работы с Битрикс 24 из 1С нам необходимо добавить приложение в Битрикс 24.
Для этого переходим в CRM, в левом меню нажимаем «Еще» и переходим в «Приложения».
Далее переходим в «Мои приложения» и добавляем новое.
В настройках приложения указываем «Название приложения». Устанавливаем «Приложение использует только API» и права доступа на CRM.
Указываем произвольную ссылку. Я укажу ссылку на свой сайт.
И сохраняем приложение Битрикс 24.
Возвращаюсь в 1С и включаю пользовательский режим.
В меню у нас появилась вкладка Битрикс 24.
Заходим туда и заполняем настройки для подключения к Битрикс 24.
Теперь можем перейти в обработку Администрирование и выполнить проверку связи.
Если все прошло удачно, то вернувшись в Настройки Битрикс 24, мы увидим токены для последующей работы с CRM.
[/member]
В следующих уроках я покажу, как работать с сущностями Битрикс 24. Получать лидов в 1С или отправлять контакты, создавать связные контакты и передавать фото.
И как всегда полный урок вы можете посмотреть на моем канале Youtube.
Добрый день.
При попытке получения access_token и refresh_token таким способом, как описан в статье, получаю совсем другой ответ.
https://auth2.bitrix24.net/oauth/authorize/?user_lang=ru&client_id=b24.5931c01858d738.56097925&redirect_uri=https%3A%2F%2Fmastermario.bitrix24.ru%2Foauth%2Fautorize%2F%3Fauth_service_id%3DBitrix24Net%26oauth_proxy_params%3DY2xpZW50X2lkPWxvY2FsLjVkYzEzMGE4MzcyM2Q2LjgxMzU5ODEw&scope=auth,profile&response_type=code&mode=page&state=site_id%3Ds1%26backurl%3D%252Foauth%252Fautorize%252F%253Fcheck_key%253Dd52e486778eb13320a8c1ebf3fc0c366%2526client_id%253Dlocal.5dc130a83723d6.81359810%26mode%3Dpage
Подскажите, пожалуйста, что я делаю не так?
Если вам в ответ не приходит token то скорее всего у вас проблемы с авторизацией, либо с правами. Бывали еще случаи не корректной настройки самого битрикса, но это было один раз.
Добрый день.
Пользователям в Битрикс даны права на приложение. При проверке связи всегда после
Code = СписокПараметров.Получить(«code»);
Code = Неопределено
В чем может быть проблема?
При проверке связи в функции ИнициализацияПодключения()
Соединение получено. Ответ.КодСостояния = 302