
Но до недавнего времени существовало в этой идиллии одно небольшое «но», а именно, необходимость в реализации хитрого протокола авторизации OAuth 2.0. Несмотря на то, что этот протокол существует давно и используется многими игроками рынка, он все еще вызывает у разработчиков сложности в реализации «с нуля», а кроме того, имеет неприятное ограничение – если вам необходим постоянный автоматический обмен данными с Битрикс24 без участия пользователя, то из-за требований OAuth вам придется организовывать периодическое обновление авторизационных токенов, чтобы они «не протухли».
А ведь иногда просто надо быстренько связать конкретный Битрикс24 с конкретной внутренней системой, или скажем, отдельно взятой формой обратной связи. Или без лишних заморочек просто запостить в живую ленту портала отчеты из своей складской системы.
Я рад сообщить, что мы внедрили простой механизм интеграций с Битрикс24, который прекрасно подходит для использования in-house. Речь идет о всем известных вебхуках. А даже если и не всем известных, то многим

Это механизм, который позволяет вам использовать практически весь наш богатый REST API, но при этом не заморачиваться с OAuth 2.0.
[spoiler]
Входящие вебхуки
Давайте на конкретном примере разберем, как это работает. Предположим, что у нас есть на сайте форма обратной связи по каким-то непонятным причинам еще не переведенная на прекрасные CRM-формы Битрикс24, и вместо того, чтобы использовать нормальные вещи мы все-таки хотим помучаться и допилить нашу существующую форму так, чтобы результат ее заполнения попадал в виде лида в Битрикс24.
Мы просто идем в раздел Приложения – Вебхуки, нажимаем кнопку «Добавить вебхук»

выбираем тип «Входящий вебхук» (ведь мы хотим из внешнего источника обращаться к Битрикс24, верно?) и видим форму редактирования параметров вебхука.
Указываем понятное нам самим название и описание вебхука, включаем галочку прав к нужному нам модулю Битрикс24. В данном случае нам нужен CRM, поскольку мы собираемся добавлять лиды.

После нажатия на кнопку сохранения мы обнаружим, что в форме появилась дополнительная информация

Как ни удивительно, но это все, что нам нужно.

Разберем предложенный URL:
- Идентификатор пользователя, пользуясь правами которого будет работать вебхук. Очевидно, что вставляется идентификатор пользователя, который вебхук и создал только что.
- Код вебхука. Строго секретно. Не стоит публиковать его в Facebook.
- Метод REST, который вы хотите выполнить, обращаясь к вебхуку. В качестве примера подставляется базовый метод profile, но нам потребуется метод
Что значит «дернуть»? Например, это можно сделать вот так
<?
/**
* Write data to log file.
*
* @param mixed $data
* @param string $title
*
* @return bool
*/
function writeToLog($data, $title = '') {
$log = "\n------------------------\n";
$log .= date("Y.m.d G:i:s") . "\n";
$log .= (strlen($title) > 0 ? $title : 'DEBUG') . "\n";
$log .= print_r($data, 1);
$log .= "\n------------------------\n";
file_put_contents(getcwd() . '/hook.log', $log, FILE_APPEND);
return true;
}
$defaults = array('first_name' => '', 'last_name' => '', 'phone' => '', 'email' => '');
if (array_key_exists('saved', $_REQUEST)) {
$defaults = $_REQUEST;
writeToLog($_REQUEST, 'webform');
$queryUrl = 'https://restapi.bitrix24.ru/rest/1/31uhq2q855fk1foj/crm.lead.add.json';
$queryData = http_build_query(array(
'fields' => array(
"TITLE" => $_REQUEST['first_name'].' '.$_REQUEST['last_name'],
"NAME" => $_REQUEST['first_name'],
"LAST_NAME" => $_REQUEST['last_name'],
"STATUS_ID" => "NEW",
"OPENED" => "Y",
"ASSIGNED_BY_ID" => 1,
"PHONE" => array(array("VALUE" => $_REQUEST['phone'], "VALUE_TYPE" => "WORK" )),
"EMAIL" => array(array("VALUE" => $_REQUEST['email'], "VALUE_TYPE" => "WORK" )),
),
'params' => array("REGISTER_SONET_EVENT" => "Y")
));
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $queryUrl,
CURLOPT_POSTFIELDS => $queryData,
));
$result = curl_exec($curl);
curl_close($curl);
$result = json_decode($result, 1);
writeToLog($result, 'webform result');
if (array_key_exists('error', $result)) echo "Ошибка при сохранении лида: ".$result['error_description']."<br/>";
}
?>
<fo rm method="post" action="">
Имя: <input type="text" name="first_name" size="15" value="<?=$defaults['first_name']?>"><br/>
Фамилия: <input type="text" name="last_name" size="15" value="<?=$defaults['last_name']?>"><br/>
Телефон: <input type="phone" name="phone" value="<?=$defaults['phone']?>"><br/>
E-mail: <input type="email" name="email" value="<?=$defaults['email']?>"><br/>
<input type="hidden" name="saved" value="yes">
<input type="submit" value="Отправить">
</form> |
Поясню важные моменты. Во-первых, не надо делать веб-формы так, как в этом примере – они будут такие же кривые и небезопасные
. Во-вторых, вся интеграция с Битрикс24 сводится к простым шагам: сформировали url в переменной $queryUrl, сформировали параметры для создания лида в переменной $queryData (почитайте ) и после нехитрых подготовительных шагов как раз и «дернули Битрикс24» при помощи функции curl_exec. Полученный в виде JSON результат обработали и вот оно счастье. Ничего больше не нужно. Еще раз про три простых шага:- Получили практически готовый URL из формы добавления вебхука прямо в своем Битрикс24.
- Указали в этом URL нужный метод REST API и сформировали параметры с данными.
- Запросили Битрикс24 по сформированному URL
Исходящие вебхуки
На этом радость не заканчивается, ведь интеграция – штука двусторонняя и иногда хочется наоборот, что делать в своих или внешних системах, когда происходит некое изменение данных в Битрикс24. Ну, например, менеджер по продажам перевел сделку в Битрикс24 в нужный статус и в нашей внутренней ERP должен сформироваться наряд-заказ на запчасти из сделки.
Снова идем в Приложения – Вебхуки, но теперь добавляем «Исходящий вебхук». Форма будет отличаться, поскольку нам уже не нужно генерировать никакой ключ, зато нам нужно указать, при каком событии в Битрикс24 должен вызываться наш обработчик.

Итак, задаем адрес обработчика, пишем сами для себя внятное название и описание для вебхука, и самое важное – указываем событие . После сохранения формы нам покажут код авторизации хука, который позволит внутри обработчика проверить, а правда ли наш обработчик вызвал Битрикс24 или кто-то вызов подделывает? Не самая непробиваемая секьюрность, что и говорить, но все равно пригодится.

В обработчике пишем исключительно простой код – тупо логируем все, что к нам приходит.
<?
print_r($_REQUEST);
writeToLog($_REQUEST, 'incoming');
/**
* Write data to log file.
*
* @param mixed $data
* @param string $title
*
* @return bool
*/
function writeToLog($data, $title = '') {
$log = "\n------------------------\n";
$log .= date("Y.m.d G:i:s") . "\n";
$log .= (strlen($title) > 0 ? $title : 'DEBUG') . "\n";
$log .= print_r($data, 1);
$log .= "\n------------------------\n";
file_put_contents(getcwd() . '/hook.log', $log, FILE_APPEND);
return true;
} |
Если теперь мы откроем любую сделку на редактирование и сохраним изменения, то обнаружим в логе вот такую историю:
2017.01.17 12:58:29 incoming Array ( [event] => ONCRMDEALUPDATE [data] => Array ( [FIELDS] => Array ( [ID] => 662 ) ) [ts] => ххх [auth] => Array ( [domain] => ххх.bitrix24.ru [client_endpoint] => https://ххх.bitrix24.ru/rest/ [server_endpoint] => https://oauth.bitrix.info/rest/ [member_id] => ххх [application_token] => ххх ) ) |
Фактически, мы без всяких сложностей получили информацию об изменении сделки и, зная ее идентификатор, при помощи входящего вебхука, принцип которого я описал выше, можем запросто запросить нужные нам подробности о сделке, вызывая метод .
Киборги заполонили!
Вебхуки представляются нам настолько простыми и полезными для решения оперативных вопросов, что мы включили этот функционал еще и в CRM-роботов!
Идем в настройки CRM, выбираем пункт Автоматизация и там нажимаем в кнопку «Сделки».

Чтобы не придумывать ничего сложного, воспользуемся тем же обработчиком исходящего вебхука, который у нас есть, но вызовем его в явном виде.
Нажмем кнопку «Настроить роботов», и у любого статуса сделки добавим робота, выбрав тип робота «Webhook». В открывшейся форме мы можем выбрать условия срабатывания робота, но самое главное, мы можем указать адрес обработчика и параметры, которые мы хотим в обработчик передать.

Для простоты давайте передадим туда в явном виде стадию сделки

Сохраним все это добро, перейдем в любую сделку и изменим ее стадию на ту, для которой только что сформировали робота. Сработает исходящий вебхук и в логах мы получим данные о сделке, полученные в виде параметров:
2017.01.17 12:58:27 incoming Array ( [status] => Новые [document_id] => Array ( [0] => crm [1] => CCrmDocumentDeal [2] => DEAL_662 ) [auth] => Array ( [domain] => xxx.bitrix24.ru [client_endpoint] => https://xxx.bitrix24.ru/rest/ [server_endpoint] => https://oauth.bitrix.info/rest/ [member_id] => xxx ) ) |
Разве это не прекрасно?
Буду рад обсудить этот функционал в нашем коммьюнити для разработчиков Маркетплейс и Приложений24 (если вы до сих пор к нам не присоединились, то вот ваш шанс )
Может у кого есть SDK по работе с REST API ? Или кто видел на просторах гитхаба?
через вебхуки можно работать с тем же api,
без необходимости реализации авторизации oauth и без левых ООП-оберток.
{{Стадия сделки}}
отдает данные в виде
[status] => Условный
а не
[status] => Условный отказ
т.к. пробел не кодируется и обрывает url запроса.
Как обойти эту проблему?
Получаю ошибку после 255 запроса - QUERY_LIMIT_EXCEEDED
Добавил задержку между запросами в 0.15c - usleep(150000), можно и больше. Полёт нормальный!
Можно ли?
Штатной интеграции, как я понимаю, пока не предусмотрено, там в списке в основном крупные западные CRM-решения
подскажите, пожалуйста, в чем может быть проблема
Когда отправляю методом ajax - лид не создаётся.
Для теста отправляю 1 поле
Подскажите в чём проблема?
Если можно - пример кода - скорее всего какой-то нюанс есть
Спасибо!
Отправьте данные веб-формы ajax-запросом в обработчик php. А уж он пусть посылает данные на webhook.
Попробуйте отправлять ajax-запрос на адрес
$('#form1!!!').submit(function(){ var UName = $('input[name="first_name"]').val(), UEmail = $('input[name="email"]').val(); var reg1=new RegExp("[^0-9]*","g"),reg2=new RegExp("[^0-9-+ ()]","g"); if(UName=="") {alert('Вы не ввели имя');return false;} if(UPhone=="") {alert('Вы не ввели номер телефона');return false;} if(UPhone.search(reg2)!=-1) {alert('Номер телефона может содержать только цифры, символы "+", "-", "(", ")" и пробелы');return false;} if(!UPhone||UPhone.length<7){alert("В вашем телефоне слишком мало цифр!");return false;} if(UEmail=="") {alert('Вы не ввели почту');return false;} $.ajax({ url:"send.php", // Куда отсылаем запрос data:({ // Что отсылаем UName:UName, UEmail:UEmail }), type:'POST', // Каким методом dataType: 'html', // Тип получаемых данных /!*success: function(ResultAjax){ // Действие при успешной обработке //document.location.href = '/info'; alert('Всё гуд!'); }*!/ success: function(e){ alert(e); }, // если запрос удачный выводим то что вернул скрипт php error: function(er){ alert(er); } // если запрос не удался выводим ошибку }); return false; });просто выдает ошибку на эатпе создания вебхука в меилчимпе
"We couldn't verify the URL is working. Please double check and try again. HTTP Code: 400"
Там вставляю вот такой урл - https://*****.bitrix24.ru/rest/1/lneowcr2f0nsri0y/crm.lead.add
Вебхук по идее должен просто отправлять данные нового подписчика
У меня входящий вебхук отправляет данные в лиды.
Я так понимаю нужно из лид'ов забирать данные, через обработчик отправлять к Mailchimp
Подскажите, пожалуйста, как можно избежать ограничения в 50 строк для метода crm.deal.list?
Создал на этом сайте исходящий вебхук по событию lead add и адрес обработчика указал site.ru/event-listener.php
Но при добавлении лида ничего не происходит, аналогично сделал и для обновления лида.
Битрикс24 коробка, SSL сертификат есть.
Попробовал сделать так же обработчик события на другом сайте, но результата это не дало
Подскажите пожалуйста, что я упустил:)
Проблема решилась, когда клиент активировал лицензию:)
Array ( [status] => Новые [document_id] => Array ( [0] => crm [1] => CCrmDocumentDeal [2] => DEAL_662
Спасибо.
Нужно обратиться к сделке за другими параметрами.
Если вписать id вручную - все работает,
а вот получить его из параметров исходящего вебхука не получается. Спасибо
А может кто-то знает, как получить компании у которых нет сделок или счетов за некий период? То есть компании, которые перестали покупать.
Или может такие компании можно без хуков узнать?
Не смог найти об этом ничего.)
Удалили исходящие вебхуки, а битрикс продолжает их слать. С чем это может быть связано?
Ситуация:
Вебхук на изменение данных компании.
На стороннем серваке валидация не проходит = телефон компании уже есть у другого клиента.
Что отдать в битрикс, чтобы уведомить об ошибке?
Как организовать callback для вебхука?
В данном случае этот символ разделяет ссылку на метод и указанные параметры. К примеру в ссылке на создние лида с определёнными параметрами, то вебхук выполнит лишь создание лида без каких-либо параметров (без названия, суммы, телефона и прч.). Хотя если ссылку просто ввести в браузерную строку, то сработает нормально. Как быть-то?! КАК БЫТЬ?!
Нужно в CRM предварительно их создавать?
Предварительно создаешь в CRM, далее указывать таким образом: