Первым делом регистрирую свое приложение в Битрикс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].