Bitrix24 API - разбор демо приложения третьего типа

Вводная

Пользователям CRM Bitrix24 зачастую хочется передавать накапливаемые в этой системе данные на какой-то сторонний ресурс для дальнейшей их обработки. Так, мне, например, понадобилось наладить экспорт закрытых сделок на сайт, который занимается учётом затрат на производство. В данном случае можно поступить двумя способами: во-первых, можно на стороннем сайте сделать кнопку, которая запрашивала бы из битрикса сделки (пока не рассматриваем реализацию); во-вторых, можно заставить битрикс самостоятельно отправлять данные по сделке сразу при её закрытии (по событию). Второй вариант более привлекателен, - всё работает в реальном времени без участия человека (никаких кнопок для передачи данных нажимать не нужно).

Бизнес-процесс

Встал вопрос, как реализовать выгрузку данных из битрикс24 по событию. Первый вариант, который я проверял, это сделать отправку через так называемый "бизнес процесс". На момент написания статьи добраться до бизнес процессов стало довольно сложно: в разделе меню "CRM" пункт "Настройки", на открывшейся странице ссылка "Бизнес-процессы", затем в разделе "Сделка" есть кнопки "Добавить шаблон" и "Список шаблонов".
В редакторе шаблона есть блок "PHP код" из группы "Прочее". Казалось бы вот оно! Но нет. Эта штука не работает. А жаль. Можно было бы вписать в неё что-то типа такого:
if( $curl = curl_init() ) {
    curl_setopt($curl, CURLOPT_URL, 'http://<SomeSite>/integration/index.php');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $post_headers = array('Content-type: application/x-www-form-urlencoded charset=utf-8',
                         'X_ASCCPE_USERNAME: логин',
                         'X_ASCCPE_PASSWORD: пароль',
                         '');
    curl_setopt($curl, CURLOPT_HEADER, $post_headers);
    curl_setopt($curl, CURLOPT_POST, true);
    $data = array('name' => {=Document:TITLE}, 'date' => {=Document:CLOSEDATE}, 'accounting' => 1, 'amount' => {=Document:OPPORTUNITY}, 'cost' => 0);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $out = curl_exec($curl);
    echo $out;
    curl_close($curl);
}
Здесь и далее <SomeSite> означает URL вашего сайта.
И отправлялись бы данные на нужный сайт каждый раз при закрытии сделки. В реальности блок "PHP код" при попытке сохранить выдаёт ошибку "У вас нет прав на изменение PHP кода"

API Bitrix24

Второй вариант организовать выгрузку данных из битрик24 на сторонний сайт - это воспользоваться API Bitrix24. API есть, документация есть:
1) Документция для разработчиков Битрикс24
2) "Разработчик Bitrix Framework" раздел "Маркетплейс Битрикс24"
Вроде всё есть, но вот вникнуть в тему не так-то и просто. В документации нет никаких практических примеров. На форумах люди делятся строго на два лагеря: те кто ничего не понял, как работать с этим API и спрашивают у знатоков (но никто не отвечает); и те, кто постиг это тайное знание и не делится им, а предлагает за деньги выполнить разработку. Я же в данной статье попробую подробно разложить по полочкам создание приложения "третьего типа" - внешние приложения, которые только используют API битрикса, но в его интерфейсе никак не участвуют. Т.е. можно запрашивать, редактировать и добавлять данные битрикса из стороннего сайта или упросить битрикс24 самостоятельно отправлять куда-либо данные при срабатывании определённых событий.
Все эти возможности представлены в демо-приложении, которое можно скачать прямо из документации. Никакого описания, что делает это приложение и как - нет: ни в документации, ни в комментариях к коду. Восполню этот пробел.

Разбор демо-приложения третьего типа

Расположение приложения

В архиве содержится основной файл index.php и ряд вспомогательных файлов. Перед человеком, который первый раз пытается сделать приложение для Битрикс24, сразу возникнет вопрос: где эти файлы нужно расположить. Я пробовал экспериментировать на локальном сайте, но то ли у меня что-то не донастроено, то ли нельзя так сделать на локальном сайте (без внешнего доступа из интернета), - ничего не вышло - авторизация на последнем шаге не срабатывает. Итак, располагаем эти файлы на сайте в интернете. Например, создаём в корне сайта каталог integration и в него извлекаем архив. В результате путь к демо-приложению получится http://<SomeSite>/integration/index.php. Можно работать как с протоколом HTTP, так и с HTTPS. Лучше, конечно, использовать защищённый протокол.

Авторизация

Стороннее для Битрикс24 приложение должно получать (или передавать) данные, которые не должны быть похищены злоумышленниками. Чтобы этого достичь, нужно установить доверие между битриксом и сторонним сайтом. Для этого применяется протокол OAuth 2.0. Суть в том, что каждый запрос будет сопровождаться неким секретным набором символов (access_token). А чтобы злоумышленник не перехватил секретный код, этот код довольно быстро портится и очень строго получается: во время его генерации проверяется, что запрашивающий код сайт известен битриксу и является действительно тем сайтом, за кого себя выдаёт. Чтобы этого достичь, в Битрикс24 нужно создать некий секрет, который должен быть известен только администратору портала Битрикс24, настраивающему интеграцию. Для этого в битриксе создаётся приложение.
Раньше создание приложений было очень затруднено, но с недавних пор сделать это можно прямо в интерфейсе портала Битрикс24: слева в меню в группе "Приложения" нажимаем кнопку "Добавить приложение".
Слева как раз блок "Для личного использования" - нажимаем там "Добавить". Заполняем название, включаем флажок "Приложение использует только API", даём права "CRM", "Пользователи" и "Живая лента", указываем ссылку на своё демо-приложение http://<SomeSite>/integration/index.php
После сохранения сгенерируется нужный нам секрет, состоящий из двух частей: "Код приложения" и "Ключ приложения" (т.е. никакого приложения не создаётся на самом деле, - просто указывается ссылка на него).
Полученные данные нужно занести в настройки демо-приложения (include/config.php). Код приложения вписываем в строку
define('CLIENT_ID', 'local.55fa7d514738b5.63819847');
Ключ приложения в строку
define('CLIENT_SECRET', '9768f9ccc5b198837cab9b7f2f233e1e');
Прописываем свой относительный путь к приложению:
define('PATH', '/integration/index.php');
Прописываем адрес своего сайта (он должен совпадать с тем, что указано в созданном приложении в Битрикс24)
define('REDIRECT_URI', 'http://<SomeSite>' . PATH);
На этом настройки демо-приложения завершены.
Открываем наше приложение (http://<SomeSite>/integration/index.php) в браузере. Должна появиться форма для ввода названия портала Битрикс24 (по форме my.bitris24.ru):
Вводим название своего портала и пробуем авторизоваться. В результате страница отобразит несколько ссылок и данные по текущей авторизации:
На этом настройка и проверка демо-приложения оканчивается

Разбираемся, как это работает

Страница несколько раз передаёт и получает различные данные из Битрикс24.
Всё это можно было бы проделать вручную, вводя длинные URL в браузере (как, например, делает автор статьи "Мой опыт использования Bitrix24 REST API"). Главная цель этих действий получить access_token. Зная этот код, можно взаимодействовать с битриксом через его API. В скрипте демо-приложения index.php с начала файла и до строки 61 как раз и происходит авторизация. Затем в строках 65 - 91 описывается метод обновить истекшую авторизацию. Далее идёт непосредственно функционал демо-страницы, где пользователю показываются несколько ссылок, нажатия которых приводят к выполнению определённых методов API Bitrix24 и, в свою очередь, взаимодействию с вашим порталом Битрикс24.
Все ссылки ведут на ту же страницу, только к URL дописываются параметры GET запроса, который тут же в скрипте обрабатывается в конструкции switch case.
Первая ссылка "Информация о пользователе" выполняет код:
$data = call($_SESSION["query_data"]["domain"], "user.current", array(
    "auth" => $_SESSION["query_data"]["access_token"])
);
Т.е. запрашивает у вашего портала разрешение на выполнение метода API user.current и передаёт access_token, полученный на предыдущем этапе. Это пример получения данных из Битрикс24.
Другая ссылка "Установить обработчик события" призвана привязать к определённому событию в Битрикс24 (в данном случае к добавлению лида) выполнение определённого скрипта на внешнем сайте (в данном случае ссылку на обработчик нужно исправить, чтобы прописать обработчик event.php). Чтобы обработчик с нашими настройками заработал, нужно исправить строку
"HANDLER" => REDIRECT_URI."event.php",
на
"HANDLER" => "http://<SomeSite>/integration/event.php"
В целом обработка клика по данной ссылке (в скрипте index.php) должна выглядеть так:
case 'event.bind': // bind event handler
    $data = call($_SESSION["query_data"]["domain"], "event.bind", array(
        "auth" => $_SESSION["query_data"]["access_token"],
        "EVENT" => "ONCRMLEADADD",
        "HANDLER" => "http://<SomeSite>/integration/event.php"
    ));
break;
После этих исправлений можно нажать ссылку и обработчик привяжется. Т.е. где-то на стороне вашего портала Битрикс24 в "облачном" фоне будет висеть наблюдатель и ждать события - добавление лида. Как только событие произойдёт, выполнится вызов обработчика с вашего сайта (скрипт event.php).
Какие обработчики каких событий уже привязаны к вашему порталу посмотреть в пользовательском интерфейсе нигде нельзя. Но можно добавить к скрипту index.php свою ссылку для обращения к методу API event.get, который отобразит все установленные обработчики. Добавляем ссылку:
<li><a href="<?=PATH?>?test=event.get">Просмотр установленных обработчиков событий</a>
и добавляем в существующий switch обработку, которая запросит метод event.get:
case 'event.get':
    $data = call($_SESSION["query_data"]["domain"], "event.get", array(
        "auth" => $_SESSION["query_data"]["access_token"])
    );
break;
Если потребуется удалить обработку события, то можно к этому демо-приложению добавить ссылку
<li><a href="<?=PATH?>?test=event.unbind">Удаление установленного обработчика события</a>
и обработку (метод event.unbind); только изменить адрес HANDLER на требуемый:
case 'event.unbind':
    $data = call($_SESSION["query_data"]["domain"], "event.unbind", array(
        "auth" => $_SESSION["query_data"]["access_token"],
        'EVENT' => 'ONCRMLEADADD',
        'HANDLER' => REDIRECT_URI . "event.php"
    ));
break;
Для того, чтобы посмотреть, к каким событиям можно подписаться, можно добавить ссылку
<li><a href="<?=PATH?>?test=event.list">Просмотр всех доступных событий</a>
и обработчик (метод events):
case 'event.list':
    $data = call($_SESSION["query_data"]["domain"], "events", array(
        "auth" => $_SESSION["query_data"]["access_token"])
    );
break;
Этих знаний уже достаточно для начала работы с API Bitrix24. В следующей статье я опишу, как сделать выгрузку сделок на внешний сайт при изменении сделки в Битрикс24.
Добавлено 23.10.2016: Вот ссылка на полный код с дополнениями из статьи.

Полезные ссылки

Вопрос выгрузки данных из Битрикс24 периодически возникает на различных ресурсах (например, Тостер). Но материалов по конкретным реализациям крайне мало. Например, есть статья "Использование REST API Bitrix24". На github'е есть некий набор заготовок, но опять же проблема, как и с самим API Bitrix24 - нет описаний, как пользоваться и что есть. Общее представление о работе API Bitrix24 даёт презентация "Маркетплейс Битрикс24".

Комментарии

  1. Спасибо, полезная статья. А подскажите (если знаете) как можно получить поля, при событии OnCrmLeadUpdate которые были обновлены? Почему-то приходит только ID лида и всё.

    ОтветитьУдалить
    Ответы
    1. Получить именно те поля, которые обновились - не получится. Можно получить все данные по id лида (http://dev.1c-bitrix.ru/rest_help/crm/leads/crm_lead_get.php), а уж потом разбирать, что с ними делать.

      Удалить
  2. Спасибо, понятно и доходчиво. Хотелось бы продолжения. Каким образом можно создать для платформы Битрикс24 встроенное динамическое приложение (аналог CRM, например, система учета заявок пользователей), которое могло бы работать с внешними компонентами, такие как IP телефония?

    ОтветитьУдалить
    Ответы
    1. Встроенное приложение для Битрикс24 мне пока не выпадала необходимость делать. Так что про это пока не планирую писать. Но про взаимодействие Битрикс24 с внешней системой ещё планирую написать.

      Удалить
    2. как раз сейчас разрабатываем систему техподдержки на CRM+приложение 1-го типа.

      Удалить
  3. Спасибо! Очень полезная информация, ждем продолжения! Вопрос - как долго проживет скрипт в режиме слушателя хотя бы месяц проживет? Через какое время он отвалится по таймауту? Или например интернет упадет у сервера на пару секунд...

    ОтветитьУдалить
    Ответы
    1. Пока проблем с передачей данных из Битрикс24 во внешний скрипт я не заметил (схема работает где-то полгода). Тут нет скриптов в "режиме слушателя". Со стороны Битрикс24 скрипт выгрузи данных срабатывает по событию. Со стороны стороннего сайта скрипт никак не выполняется, пока к нему не обратится Битрикс24. Хотя теоретически при недоступности соединения, Битрикс24 в момент наступления события не достучится до скрипта на стороннем сайте и данные не будут переданы. Проверки на это я не делал.

      Удалить
  4. Здравствуйте! спасибо за разбор! Может сталкивались? Как сделать, чтобы внешний скрипт php забирал данные на битриксе по cron или например по событию самого же битрикса. Проблема в том, что при авторизации по протоколу oauth при редиректе для получения code,необходимо первый раз ввести ручкам в браузере логини и праоль для доступа к битриксу. То же самое относится и к срабатыванию события от битрикса. Т.е. например сработало событие, был вызван внешний php скрипт, ему нужно еще раз обратитьсяк битрикс и забрать связанные данные из базы битрикса и отправить все по почте, но он этого сделать не может, так как проиходит редирект на bitrix24.net/oauth/authorize/? где нужно ввести логин и пароль вручную.

    ОтветитьУдалить
    Ответы
    1. Вовсе не обязательно вводить что-либо вручную, - всё можно автоматизировать. А ваши личные данные сохранить в настройках. Собственно, так и работает демо-приложение, описанное в этой статье (там вводится только адрес портала Битрикс24, да и тот можно вписать в настройки). Попробуйте пошагово пройтись по этому демо-приложению. Тогда вы сможете его модифицировать и приспособить для запуска через cron

      Удалить
    2. Хотя... проблема действительно есть (http://dev.1c-bitrix.ru/community/blogs/b24_marketplace/8324.php). Хотя, наверняка есть решение, но я пока над этим не задумывался.

      Удалить
  5. и еще вопрос) Вы разбирались как работают приложения второго типа в битрикс24?

    ОтветитьУдалить
    Ответы
    1. Нет, меня пока интересовали только варианты интеграции с внешними системами. Как раз третий тип для этого отлично подошёл.

      Удалить
  6. Где вы нашил эти события и где можно посмотреть какие события вообще есть

    в доке почему то только три события https://dev.1c-bitrix.ru/rest_help/general/events.php

    ОтветитьУдалить
    Ответы
    1. В документации, действительно, мало что есть. В статье (почти в конце) я упоминал метод events, - с его помощью можно получить доступные события. Я сейчас сделал такой запрос и вот, что мне вернулось:
      array (
      'result' =>
      array (
      0 => 'ONAPPUNINSTALL',
      1 => 'ONAPPINSTALL',
      2 => 'ONAPPUPDATE',
      3 => 'ONAPPPAYMENT',
      4 => 'ONAPPTEST',
      5 => 'ONCRMLEADADD',
      6 => 'ONCRMLEADUPDATE',
      7 => 'ONCRMLEADDELETE',
      8 => 'ONCRMDEALADD',
      9 => 'ONCRMDEALUPDATE',
      10 => 'ONCRMDEALDELETE',
      11 => 'ONCRMCOMPANYADD',
      12 => 'ONCRMCOMPANYUPDATE',
      13 => 'ONCRMCOMPANYDELETE',
      14 => 'ONCRMCONTACTADD',
      15 => 'ONCRMCONTACTUPDATE',
      16 => 'ONCRMCONTACTDELETE',
      17 => 'ONCRMQUOTEADD',
      18 => 'ONCRMQUOTEUPDATE',
      19 => 'ONCRMQUOTEDELETE',
      20 => 'ONCRMCURRENCYADD',
      21 => 'ONCRMCURRENCYUPDATE',
      22 => 'ONCRMCURRENCYDELETE',
      23 => 'ONCRMPRODUCTADD',
      24 => 'ONCRMPRODUCTUPDATE',
      25 => 'ONCRMPRODUCTDELETE',
      26 => 'ONCRMACTIVITYADD',
      27 => 'ONCRMACTIVITYUPDATE',
      28 => 'ONCRMACTIVITYDELETE',
      29 => 'ONUSERADD',
      ),
      )

      Удалить
  7. Событие Вызывается
    OnAppUpdate при обновлении версии приложения
    OnAppUninstall при удалении приложения
    OnAppPayment при оплате приложения

    а откуда вы нашли ONCRMLEADADD ? где можно посмотреть полный список и описания?

    ОтветитьУдалить
    Ответы
    1. Выше ответил, как я это нашёл. А когда вызывается то или иное событие в Битрикс24, остаётся догадываться по названию.

      Удалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить
  9. Олег, как проверить работоспособность, установленных обработчиков на добавление пользователя и редактирование ? как узнать что все правильно нрастроено?

    ОтветитьУдалить
    Ответы
    1. Вы прописываете в Битрикс24 путь к вашему скрипту на каком-то сайте, это скрипт будет срабатывать при возникновении соответсвующего события в Битрикс24. В скрипте на время разработки сделайте показ всего полученного (типа print_r($_REQUEST)). А дальше уже исходя из полученных данных можно придумывать, как их применить. Скорее всего, по вашим событиям, вам придёт ID пользователя (которого добавили или отредактировали). А дальше по этому ID можно, например, получить данные пользователя - http://dev.1c-bitrix.ru/rest_help/users/user_get.php

      Удалить
    2. я не силен в этом, можно попросить пример кода от получения ID до получения данных пользователя ?

      Удалить
    3. и в лог записывается полный массив т.е: array (
      'event' => 'ONCRMCONTACTADD',
      'data' =>
      array (
      'FIELDS' =>
      array (
      'ID' => '4',
      ),
      ),
      'auth' =>
      array (
      'access_token' => '3syzektvnssvc3blhep2r2ojs7kffwtt',
      'expires_in' => '3600',
      'scope' => 'crm,user',
      'user_id' => '1',
      'status' => 'L',
      'member_id' => '3a67931130d90d665df2eea3dea3959d',
      'domain' => 'sit.bitrix24.ru',
      'application_token' => 'bd8744b4115fde2cee08e475a9b92e0c',
      ),
      'ts' => '1462996232',
      )


      А толком мне нужен то только ID

      Удалить
    4. И еще, внизу config.php
      1.Совершает запрос с заданными данными по заданному адресу. В ответ ожидается JSON
      2. Вызов метода REST.
      Расскажите пожалуйста как этим пользоваться)

      Удалить
    5. $user_id = $_REQUEST['data']['FIELDS']['ID'];
      $auth = $_REQUEST['auth']['access_token'];
      $domain = $_REQUEST['auth']['domain'];
      $data = call($domain, "user.get", array(
      "auth" => $auth,
      "id" => $deal_id
      ));
      // Разбираем данные пользователя
      if (isset($data['result'])) {
      // Что-то делаем с полученными данными пользователя
      print_r($data['result']);
      }

      Удалить
  10. Возможно ли процесс с созданием lead сделать с помощью curl?

    Задача состоит в том, что на стороннем сайте заполняется форма, далее данные с формы улетают на script.php и с этого скрипта уже идет запрос curl в облако, достаем список пользователей по нужным параметрам и создаем lead.
    Как такое можно реализовать ?

    ОтветитьУдалить
    Ответы
    1. Похоже, то что вам нужно описано в статьях https://www.bitrix24.ru/blogs/howto/new-crm-lead.php и https://dev.1c-bitrix.ru/community/blogs/chaos/crm-sozdanie-lidov-iz-drugikh-servisov.php
      Вам надо через curl обратиться к специальному адресу .bitrix24.ru/crm/configs/import/lead.php и передать три параметра (логин и пароль пользователя из под которого будет создан лид и заголовок лида). Я не тестировал.

      Удалить
  11. Приходит пустой запрос(ответ) с Битрикса, событие привязывается без проблем. Подскажите где искать?

    ОтветитьУдалить
    Ответы
    1. проверяйте, чтобы везде был только https:// или только http://

      Удалить
  12. >В следующей статье я опишу, как сделать выгрузку сделок на внешний сайт при закрытии сделки в Битрикс24.
    Олег, добрый день! Очень жду эту следующую статью, так как именно задача экспорта определённых полей (включая пользовательские) из битрикс при закрытии сделки сейчас актуально для меня, как никогда.

    ОтветитьУдалить
    Ответы
    1. Наконец-то дописал вторую статью - http://ekhlakov.blogspot.ru/2016/10/24.html Только там не при "закрытии" сделки, а при "изменении" сделки. Но легко добавить проверку на стутус закрытия - там же из статьи должно быть понятно как.

      Удалить
    2. Ура, спасибо! Олег, а пользовательские поля между сущностями лид-контакт/компания-сделка реально ли "синхронизировать"? Надо, чтобы CID (Google Analytics) передавался от лида следующим сущностям автоматически из без БП (они сейчас платные).

      Удалить
  13. В следующей статье я опишу, как сделать выгрузку сделок на внешний сайт при закрытии сделки в Битрикс24.

    Здравствуйте.
    А где обещанная статья?

    ОтветитьУдалить
    Ответы
    1. Добавил вторую статью и в конце этой добавил на неё ссылку - http://ekhlakov.blogspot.ru/2016/10/24.html

      Удалить
  14. Скажите, пожалуйста, а можно таким же образом заставить Битрикс24 делать экспорты в Excel по расписанию?

    ОтветитьУдалить
    Ответы
    1. Excel "понимает" CSV формат. А это обычный текстовый файл, в котором данные в строках разделены точкой с запятой. Можно, например, функцию логгирования - logger() из этой статьи доработать таким образом, чтобы нужные данные записывались в файл через точку с запятой, а вместо расширения .log формировать .csv. Готовый файл можно будет обрабатывать Excel'ем.

      Удалить
  15. Здравствуйте Олег.
    Не пробовали с помощью метода batch пакетом добавлять сущности? Например, одновременно добавить 5 товаров или 5 лидов одним запросом?

    Если да, можете показать пример.
    Я делал по примеру в демо 3 типа. Там методом batch обновляется аватара пользователя. Я на его примере хотел добавить 5 товаров одновременно. Но, в ответ приходит ошибка 'ERROR' => 'METHOD NOT FOUND'

    ОтветитьУдалить
    Ответы
    1. Я так не делал. Не помогу: тут надо много экспериментировать, чтобы подобрать нужный формат запроса.

      Удалить
  16. "Хотя... проблема действительно есть (http://dev.1c-bitrix.ru/community/blogs/b24_marketplace/8324.php). Хотя, наверняка есть решение, но я пока над этим не задумывался."

    Не нашли решение авторизации без ввода ручками?

    ОтветитьУдалить
    Ответы
    1. http://afinogen.su/article/polucenie-sessionnogo-tokena-dla-prilozenia-bitrix24 - нашел сам что то. Но внедрить не получается(((

      Удалить
    2. На странице https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=5378&LESSON_PATH=3913.5377.5378 появилось примечание: "С версии главного модуля 16.5.11 доступна возможность разработки приложений для коробочных версий как для облачных. Коробочные продукты начинают поддерживать REST API. Если серверные приложения с явной авторизацией по протоколу OAuth 2.0 для облачного Битрикс24 было разработано ранее, то для использования в коробочных версиях они должны быть доработаны так как возникает вопрос безопасности. Суть необходимых изменений: отправление запроса на авторизацию на отдельный сервер https://oauth.bitrix.info/." Видимо, как раз решение проблемы авторизации.

      Удалить
  17. Добрый день.
    Есть портал в облаке, хочется свое приложение написать. Где посмотреть какой нибудь мануал для новечка, чтобы прямо по шагам объяснили :)

    ОтветитьУдалить
    Ответы
    1. К сожалению, я не знаю такого источника. Если было бы понятное изложение, как же разрабатывать приложения под Битрикс24, то не появлялись бы такие статьи, как эта. А так, придётся по крупицам собирать информацию и бодро шагать по граблям.

      Удалить
  18. Огромное спасибо!
    Кстати в index.php есть ссылка на "?test=deal.list", но case для него отсутствует.

    ОтветитьУдалить
  19. Здравствуйте, помогите, пожалуйста разобраться.
    Установил скрипт на событие ONCRMLEADADD и смотрю, что приходит в переменной $_REQUEST от CRM.
    В некоторых случаях приходит :
    'auth' =>
    array (
    'access_token' => 'tu8cvj74kyn8roia8h7k4qj5x7hty53e',
    'expires_in' => '3600',
    'scope' => 'crm,user,log',
    'domain' => 'my_portal.bitrix24.ru',
    'server_endpoint' => 'https://oauth.bitrix.info/rest/',
    'status' => 'L',
    'client_endpoint' => 'https://my_portal.bitrix24.ru/rest/',
    'member_id' => 'xxxxxxxxxxxxxxxxxxxxx',
    'user_id' => '6',
    'application_token' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    ),

    А иногда:
    'auth' =>
    array (
    'domain' => 'my_portal.bitrix24.ru',
    'client_endpoint' => 'https://my_portal.bitrix24.ru/rest/',
    'server_endpoint' => 'https://oauth.bitrix.info/rest/',
    'member_id' => 'xxxxxxxxxxxxxxxxxxxxx',
    'application_token' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    ),

    Дальше стоит команда:
    $lead_data = call($_REQUEST["auth"]["domain"], "crm.lead.get?id=$lead_id", array(
    "auth" => $_REQUEST["auth"]["access_token"])
    );
    И понятно, что во втором случае, раз $_REQUEST["auth"]["access_token"] нет, то дальше скрипту не с чем работать.

    ОтветитьУдалить
    Ответы
    1. Возможно дело в том, кто является ответственным, вызвавшим это событие. Всё работает нормально, если это я, тот кто настраивал. Но по факту не я пользуюсь CRM.

      Удалить
    2. Не могу сказать, в чём тут может быть проблема. Но я настраивал интеграцию с Битрикс24, когда был авторизован под своей учётной записью, а сами события плодят другие пользователи Битрикс24, - всё равно скрипт (по описанию из http://ekhlakov.blogspot.ru/2016/10/24.html) срабатывал.

      Удалить
    3. Может быть сервер тормозит и проходят отведённые 30 секунд?
      Нужно ли в файле, который вызывается по событию прописывать начало фыйла index.php с процедурой авторизации и обновления авторизации?
      "Затем в строках 65 - 91 описывается метод обновить истекшую авторизацию."

      Удалить
    4. Я посмотрел свой скрипт, который запрашивается при срабатывании события в Битрикс24. Обновления авторизации у меня там нет. В таком варианте скрипта сделки импортируются уже больше года. так что авторизация пока не протухла.

      Удалить
    5. Олег, здравствуйте. Посмотрите, пожалуйста мои поиски проблем в комментариях ниже.

      Удалить
  20. А для чего строка "Укажите ссылку-callback для
    события установки (необязательно)" ?
    http://joxi.ru/D2PyvzdcpwGKGA
    Это может влиять на работу скриптов, вызываемых при событии?

    ОтветитьУдалить
    Ответы
    1. Может быть ещё дело в процессе, каким был установлен обработчик?
      В документации так написано: "event.bind.json", а в примерах здесь: "event.bind".
      За что отвечает ".json" ?

      Удалить
    2. Я выяснил вот что:
      Поскольку функция call возвращает ошибку:
      'error' => 'NO_AUTH_FOUND',
      'error_description' => 'Wrong authorization data',
      То это связано с этим методом: http://bxapi.ru/src/?module_id=rest&name=CRestUtil%3A%3AcheckAuth
      который возвращает эту ошибку если ExecuteModuleEventEx($eventHandler, array($query, $scope, &$res)) == null
      Открываю описание http://bxapi.ru/src/?module_id=main&name=ExecuteModuleEventEx
      и вижу такой код:
      if(
      isset($arEvent["TO_MODULE_ID"])
      && $arEvent["TO_MODULE_ID"]<>""
      && $arEvent["TO_MODULE_ID"]<>"main"
      )
      {
      if(!CModule::IncludeModule($arEvent["TO_MODULE_ID"]))
      return null;
      }
      //остальной код
      }

      Смотрю дальше: https://dev.1c-bitrix.ru/api_help/main/reference/cmodule/includemodule.php
      написано:
      "Проверяет установлен ли модуль и если установлен, то подключает его (точнее подключает файл /bitrix/modules/ID модуля/include.php). Возвращает "true", если модуль установлен, иначе - "false". Статический метод."

      Что-то стало ясно, но абсолютно не представляю, как решить мою проблему, потому что ни разу не работал со всякими модулями и классами. Почему, если в условиях выше первый if сработал, а второй нет? Это как понимать, ID модуля есть, а сам модуль не установлен?

      Удалить
    3. Скорее всего, "Укажите ссылку-callback для
      события установки (необязательно)" - это для указания скрипта, который будет вызван из Битрикс24, когда будет срабатывание события установки обработчика (event.bind). Это не влияет на работу скриптов, вызываемых при событии.
      Почему в примере документации указано event.bind.json - не знаю. Возможно, для одного метода работают несколько форматов передаваемых данных - JSON и encoded_url
      По поводу того, что вы выясняли про подключение модуля по module_id: возможно, у вас вызывается какой-то модуль, для которго вы не разрешили права доступа (в настройках Битрикс24 - [Приложения / Мои приложения / Изменить / Права доступа])

      Удалить
  21. Олег а как с вами связаться?

    ОтветитьУдалить
  22. загрузил приложение на сервер, вбил нужные данные, в итоге появляется ошибка:

    Fatal error: Uncaught Error: Call to undefined function curl_init() in /home/bitrix/www/bx.app/include/config.php:70 Stack trace: #0 /home/bitrix/www/bx.app/index.php(47): query('GET', 'https://d22.bit...', Array) #1 {main} thrown in /home/bitrix/www/bx.app/include/config.php on line 70

    ОтветитьУдалить
    Ответы
    1. Вероятно не установлен curl (http://php.net/manual/ru/curl.installation.php). На сервер должен быть установлен пакет типа php-curl

      Удалить
    2. Да нет, установлен curl...

      Удалить
  23. Добрый день!
    После нажатия на кнопку Авторизоваться сообщает код 500 Internal Server Error, подскажите как это исправить. Я полагаю что это связано с тем что у меня домен с https а в конфиге автора http стоит. Что сделать?

    ОтветитьУдалить
    Ответы
    1. В логах сервера вот это показывает Bad header: HTTP 302 Found, referer: далее урл

      Удалить
    2. Вероятнее всего, проблема действительно с смешанных редиректах HTTP/HTTPS. Сервер не пропускает редирект с защищённого на незащищённый ресурс. Попробуйте везде реализовать HTTPS

      Удалить
  24. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  25. Добрый день.

    Спасибо за понятную статью! Все сделал как Вы описали, все работает, кроме одного - unbind. Есть подозрение что он не работает.

    Еще изначально смутил и сам case, который идентичен bind и тоже дергает event.php зачем-то. И по факту, после того как я жму на "Удаление установленного обработчика события" и потом жму "Просмотреть" - я вижу что он все еще висит.

    ОтветитьУдалить
    Ответы
    1. Посмотрел сейчас ещё раз код. По виду всё должно работать. unbind работает так: 1) отправляет запрос в Битрикс24 функцией call(); 2) в эту функцию в параметре EVENT указываем код события, отслеживание которого хотим убрать на стороне Битрикс24 (тут вам надо перепроверить правильность написания вашего события); 3) в параметре HANDLER указываем "обратный" адрес - на это адрес Битрикс24 отправит результат выполнения этой операции unbind (в тестовом примере обработчик - event.php - просто пишет в лог ответ, который пришёл от Битрикс24) - тут также надо проверить правильность пути к вашему принимающему ответ скрипту. Если запись в логе добавляется - значит ответ пришёл. Ну а см ответ даст понять, что же в результате сделал Битрикс24 (если пришлёт ошибку, значит что-то пошло не так и Битрикс24 не смог удалить событие - должен указать причину, чтобы вы смогли разобраться)

      Удалить
  26. Этот комментарий был удален автором.

    ОтветитьУдалить
  27. Добрый день. Вы знаете, Ваши слова об отсутствии документации актуальны и через 6 лет после написания этой статьи. Удивительно стабильное раздолбайство. Теперь для упрощения ситуации с мануалами решили перевесить саппорт на интеграторов. Известно ли вам что либо, о работе REST API c Битрикс Управление сайтом ? О котором они заявляют на сайте https://disk.yandex.ru/i/1P3z23D-qnL_WA

    ОтветитьУдалить
    Ответы
    1. В ядре битрикса сделали некий каркас для создания REST API. Мне не приходилось пока с этим работать. Весьма примерно знаю. Там только базовые вещи есть, типа авторизации, разграничения доступа, запросы на получение данных из инфоблоков. А дальше - всё в руках разработчика, - пилить собственные классы с собственными методами API.

      Удалить

Отправить комментарий

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация