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