Посмотреть список готовых сценариев
|
---|
Готовые сценарии разбиты по категориям:
|
Не всякая доработка или интеграция является тиражным продуктом, предназначенным для широкого круга пользователей. Битрикс24 позволяет решать как вопросы заказной или внутренней разработки для конкретного портала, так и опубликовать готовое решение в каталоге Битрикс24.Маркет для всех пользователей Битрикс24.
В зависимости от стоящей перед вами задачи нужно выбрать подходящий инструмент. В случае с тиражным публичным продуктом потребуется решить не только технические, но и ряд организационных вопросов, связанных с публикацией. Для заказной и внутренней "одноразовой" разработки существуют инструменты, упрощающие вопросы интеграции. Безопасность таких интеграций обеспечивается ограниченным контекстом их использования.
Мне нужно разработать дополнительный функционал для конкретного проекта (интеграцию с внутренней системой ERP, чатбота для моей компании, выгрузку данных из CRM в нашу бухгалтерию и т.д.)
Мне нужно опубликовать тиражный продукт в каталоге Битрикс24.Маркет (интеграцию с внешним облачным сервисом рассылок, расширенные отчеты по задачам Битрикс24, интеграцию с облачной телефонией и т.д.)
В рамках конкретного проекта есть два варианта расширения функциональных возможностей Битрикс24 на основе REST API - это локальные приложения и пользовательские вебхуки.
Локальные приложения лучше подходят для тех задач, которые требуют создания пользовательского интерфейса:
Локальные приложения поддерживают все возможности REST API и вызывают REST по протоколу авторизации OAuth 2.0, но устанавливаются только на конкретном Битрикс24, без публикации в каталоге решений. Для добавления локального приложения требуется административный доступ.
Быстрый старт локального приложения.
Вебхуки идеально подходят:
Использование вебхуков проще для технической реализации, поскольку не требует реализации протокола OAuth 2.0. Каждый пользователь может добавлять вебхуки "для себя" и REST API, вызываемый в рамках таких вебхуков, будет ограничиваться правами конкретного пользователя-владельца.
Быстрый старт с использованием вебхуков.
Начиная с версии модуля REST 20.5.0, доступен новый раздел Разработчикам (Приложения > Разработчикам), в котором собраны удобные инструменты для облегчения работы по интеграции и доработке вашего Битрикс24:
Доступны следующие инструменты:
Далее рассмотрим подробнее каждый из этих инструментов.
На этой вкладке представлены готовые сценарии для интеграции и доработки с примерами кода и предустановленными параметрами на базе вебхуков и локальных приложений.
Посмотреть список готовых сценариев
|
---|
Готовые сценарии разбиты по категориям:
|
В настройках каждого из сценариев есть генератор REST-запросов 1, с помощью которого можно подобрать нужные значения параметров для дальнейшего использования во внешних системах:
В генераторе запросов можно выбрать метод REST API, прочитать описание метода, скачать готовый пример кода (в примере уже есть необходимые параметры для выполнения запросов), добавить свои параметры. Здесь же можно выполнить сам запрос и получить результат, проверив работу вебхука.
Настройка прав доступа 2 позволяет разрешить выполнение запросов только определенным инструментам Битрикс24.
После сохранения созданные приложения и вебхуки будут отображаться во вкладке Интеграции.
Все созданные интеграции (вебхуки и приложения) портала Битрикс24 выводятся единым списком на странице :
В этом списке выводится следующая информация об интеграциях:
Показ нужных полей можно настроить, кликнув по значку [dw]шестеренки[/dw][di] [/di] в левом верхнем углу списка.
Также из этого списка можно перейти к редактированию настроек интеграции (или удалить её).
Подробнее о секретном коде в URL
|
---|
URL состоит из:
|
В этом разделе выводится общее число ежедневных REST-запросов вашего Битрикс24, а также можно просмотреть детальную статистику по каждому вебхуку, внешней интеграции или приложению:
Локальными являются приложения, которые описываются и добавляются непосредственно на конкретный Битрикс24. Администратор портала решает, какие права дать такому приложению и как оно будет называться в интерфейсе. Именно в этом суть термина «локальный». При этом технологии, на которых разработано конкретное приложение, вполне могут быть серверными.
Существует два вида таких приложений:
Вы можете воспользоваться готовыми примерами каждого типа для создания основы своего приложения, чтобы в дальнейшем усложнять его функционал.
Статичное приложение. Пример обращается к REST API и показывает ФИО текущего пользователя.
Серверное приложение с базовым интерфейсом внутри Битрикс24. Выводится в виде дополнительной страницы, на которой показывает ФИО текущего пользователя. Пример использует упрощенный вариант использования OAuth 2.0.
Серверное приложение без интерфейса внутри Битрикс24. Умеет получать авторизацию пользователя Битрикс24 и с её помощью обращаться к REST API, получая ФИО текущего пользователя (находясь при этом вне Битрикс24). Пример состоит из одного PHP-файла, который вы должны разместить на своем веб-сервере.
Серверное приложение, реализующее чат-бота. Создает чат-бота внутри вашего Битрикс24, который умеет отвечать пользователям. Пример состоит из одного PHP-файла, который вы должны разместить на своем веб-сервере.
Архив с примером содержит один файл и представляет собой готовое приложение, обращающееся к REST API и показывающее ФИО текущего пользователя.
Установить локальное приложение можно либо из раздела [ds]Разработчикам[/ds][di] Начиная с версии модуля REST 20.5.0, доступен новый раздел Разработчикам (Приложения > Разработчикам), в котором собраны удобные инструменты для облегчения работы по интеграции и доработке вашего Битрикс24.
Подробнее...[/di] (Приложения > Разработчикам, вкладка «Готовые сценарии» > Другое > Локальное приложение), либо перейдя по цепочке: Приложения 1 – Разработчикам 2 – Другое 3 – Локальное приложение 4:
В открывшейся форме заполните базовые поля, загрузите архив и укажите необходимые права (для нашего примера нужны права на управление пользователями):
После сохранения новое приложение будет показано [dw]в списке интеграций[/dw][di] [/di] (Приложения > Разработчикам > Интеграции) в вашем Битрикс24.
Найдите «ФИО» в левом меню или в меню «Ещё» в разделе [dw]Приложения[/dw][di][/di] и запустите. Запущенное приложение [dw]выведет ФИО[/dw][di][/di] текущего пользователя, получая его по REST API через JS-библиотеку. Поскольку статичное локальное приложение работает в интерфейсе Битрикс24, то JS SDK автоматически получает и использует авторизацию текущего пользователя, который открыл приложение, и действует исключительно только в рамках [dw]прав этого пользователя[/dw][di]В курсе Администратор сервиса Битрикс24 было рассказано, от чего зависят права пользователя, приведены примеры прав пользователя, а также рассмотрены минимальные настройки прав для типовых ролей сотрудников.
[/di].
Приложение использует упрощенный вариант использования OAuth 2.0, выводится в виде дополнительной страницы, на которой показывает ФИО текущего пользователя. Архив примера состоит из SDK CRest, модификации SDK CRest для упрощенного варианта использования OAuth 2.0 и PHP-файла index.php с кодом примера. Файлы из архива с примером вы должны разместить на своем веб-сервере до установки в Битрикс24.
Установить локальное приложение можно либо из раздела [ds]Разработчикам[/ds][di] Начиная с версии модуля REST 20.5.0, доступен новый раздел Разработчикам (Приложения > Разработчикам), в котором собраны удобные инструменты для облегчения работы по интеграции и доработке вашего Битрикс24.
Подробнее...[/di] (Приложения > Разработчикам, вкладка «Готовые сценарии» > Другое > Локальное приложение), либо перейдя по цепочке: Приложения 1 – Разработчикам 2 – Другое 3 – Локальное приложение 4:
В открывшейся форме заполните базовые поля и укажите необходимые для приложения права (для нашего примера нужны права на управление пользователями), указав [dw]Путь вашего обработчика[/dw][di][/di] (это означает, что ваше приложение уже должно быть физически доступно по URL по протоколу HTTPS до того, как вы станете добавлять его в ваш Битрикс24)
После сохранения новое приложение будет показано [dw]в списке интеграций[/dw][di] [/di] (Приложения > Разработчикам > Интеграции) в вашем Битрикс24.
Найдите приложение "ФИО" в левом меню или в меню "Ещё" в разделе [dw]Приложения[/dw][di][/di] и запустите. Запущенное [dw]приложение выведет[/dw][di][/di] отладочную информацию о передаваемых авторизационных данных текущего пользователя, а также ФИО текущего пользователя, получая его по REST API с использованием этих авторизационных данных. Поскольку это приложение работает в интерфейсе Битрикс24 и использует авторизацию текущего пользователя, который открыл приложение, то оно действует исключительно только в рамках прав этого пользователя.
Пример состоит из SDK CRest и PHP-файла с примером, которые вы должны разместить на своем веб-сервере до добавления приложения в свой Битрикс24. Приложение умеет получать авторизацию пользователя Битрикс24 и используя ее, находясь при этом вне Битрикс24, обращаться к REST API, получая ФИО пользователя, установившего его.
Установить локальное приложение можно либо из раздела [ds]Разработчикам[/ds][di] Начиная с версии модуля REST 20.5.0, доступен новый раздел Разработчикам (Приложения > Разработчикам), в котором собраны удобные инструменты для облегчения работы по интеграции и доработке вашего Битрикс24.
Подробнее...[/di] (Приложения > Разработчикам, вкладка «Готовые сценарии» > Другое > Локальное приложение), либо перейдя по цепочке: Приложения 1 – Разработчикам 2 – Другое 3 – Локальное приложение 4:
В открывшейся форме заполните базовые поля и укажите необходимые для приложения права (для нашего примера нужны права на управление пользователями), указав Путь вашего обработчика (это означает, что ваше приложение уже должно быть физически доступно по URL по протоколу HTTPS до того, как вы станете добавлять его в ваш Битрикс24)
Необходимо включить опцию Приложение использует только API – именно она указывает Битрикс24, что ваше приложение не будет показывать пользовательский интерфейс внутри Битрикс24. В этом случае, как вы увидите, в форме будут скрыты поля, в которых обычно указывается название пункта меню для вызова приложения из Битрикс24. Приложения, у которых включена опция "Приложение использует только API", либо предоставляют пользовательский интерфейс по какому-то своему URL, либо вообще не предоставляют пользовательский интерфейс.
Обратите также внимание на то, что мы заполнили поле Путь для первоначальной установки, указав install.php из архива с примером. Этот URL вызывается только один раз при сохранении формы локального приложения. Именно этот URL служит обработчиком события ONAPPINSTALL, в котором мы и сохраняем токены пользователя, установившего приложение.
После сохранения вы останетесь в форме добавления, но Битрикс24 вам сразу покажет ключи авторизации для протокола OAuth 2.0, которые вам потребуются внутри кода приложения:
Поскольку приложение без интерфейса работает "вне" Битрикс24, то оно должно реализовывать полный протокол авторизации OAuth 2.0. Откройте из примера файл settings.php и заполните константы с кодом приложения C_REST_CLIENT_ID и секретным ключом C_REST_CLIENT_SECRET, полученными при сохранении формы.
Загрузите измененный пример на свой сервер.
В Битрикс24 можно перейти в список «Интеграции» (Приложения > Разработчикам > Интеграции) и убедиться в появлении нового приложения в списке локальных приложений в вашем Битрикс24:
Откройте файл index.php из примера в браузере по вашему URL:
Запущенное приложение выведет ФИО установившего приложение пользователя, получая его по REST API с использованием авторизационных данных, сохраненных при создании приложения, а также автоматически продлевая токены (если при запросе окажется, что они недействительны).
Пример состоит из SDK CRest и кода обработки входящих событий, которые вы должны разместить на своем веб-сервере до добавления приложения в свой Битрикс24. Приложение создает чат-бота внутри вашего Битрикс24, который умеет отвечать пользователям.
Чат-бот для мессенджера Битрикс24 не является отдельным "типом" приложений. Фактически, чат-бот может быть частью любого серверного приложения, которое просто будет реализовывать логику чат-бота (или даже нескольких сразу), используя соответствующие возможности REST API. При этом, REST для чат-бота в некоторых случаях позволяет обойтись без разработки полной схемы авторизации по протоколу OAuth 2.0, как того требует общий случай серверных приложений без пользовательского интерфейса внутри Битрикс24.
Установить локальное приложение можно либо из раздела [ds]Разработчикам[/ds][di] Начиная с версии модуля REST 20.5.0, доступен новый раздел Разработчикам (Приложения > Разработчикам), в котором собраны удобные инструменты для облегчения работы по интеграции и доработке вашего Битрикс24.
Подробнее...[/di] (Приложения > Разработчикам, вкладка «Готовые сценарии» > Другое > Локальное приложение), либо перейдя по цепочке: Приложения 1 – Разработчикам 2 – Другое 3 – Локальное приложение 4:
В открывшейся форме заполните базовые поля и укажите необходимые для приложения права (для нашего примера требуются права на создание и управление чат-ботами), указав Путь вашего обработчика (это означает, что ваше приложение уже должно быть физически доступно по URL по протоколу HTTPS до того, как вы станете добавлять его в ваш Битрикс24):
Необходимо включить опцию Приложение использует только API - именно она указывает Битрикс24, что ваше приложение не будет показывать пользовательский интерфейс внутри Битрикс24, ведь нашим единственным интерфейсом в данном случае будет обмен сообщениями через чат-бота.
В этом случае, как вы увидите, в форме будут скрыты поля, в которых обычно указывается название пункта меню для вызова приложения из Битрикс24. Приложения, у которых включена опция "Приложение использует только API", либо предоставляют пользовательский интерфейс по какому-то своему URL, либо вообще не предоставляют пользовательский интерфейс.
Обратите также внимание на то, что мы заполнили поле Путь для первоначальной установки. Этот URL вызывается только один раз при сохранении формы локального приложения. Именно этот URL служит обработчиком события ONAPPINSTALL, в котором мы и добавляем чат-бота в наш Битрикс24. Если вы захотите добавить чат-бота заново, вам нужно будет из списка приложений переустановить приложение или удалить и заново добавить локальное приложение.
Если вы переустанавливаете приложение из списка приложений: будет вызвано событие ONAPPINSTALL и в файле install.php выполнится код получения из списка ботов бота с кодом, который указывался при создании бота.
Если вы удалите приложение: все боты, созданные этим приложением, автоматически удаляются, соответственно, при создании приложения зарегистрируется новый бот.
После сохранения приложения с чат-ботом вы можете через поиск найти бота по имени "Bot Example":
После сохранения новое приложение будет показано [dw]в списке интеграций[/dw][di] [/di] (Приложения > Разработчикам > Интеграции) в вашем Битрикс24.
Можно написать сообщение чат-боту, кликнув по его названию в общем чате. Это действие откроет индивидуальный чат с чат-ботом. В нашем примере чат-бот просто будет повторять любой текст, который отправит ему пользователь:
Краткое описание механизма вебхуков: через пользовательский интерфейс Битрикс24 можно получить и зафиксировать ключ авторизации. Этот ключ в дальнейшем можно использовать для вызова методов REST, и при этом данный ключ не ограничивается по сроку действия (в отличие от токенов авторизации протокола OAuth 2.0).
Это делает вебхуки исключительно простым и удобным механизмом для работы с REST, но при этом надо понимать, что эта простота имеет и свои недостатки:
Но несмотря на эти ограничения, для подавляющего большинства задач интеграции в рамках конкретного проекта вебхуки представляются идеальным вариантом работы с REST API.
Входящий вебхук используется для работы с данными вашего Битрикс24 через API.
Создать входящий вебхук можно из раздела [ds]Разработчикам[/ds][di]
Начиная с версии модуля REST 20.5.0, доступен новый раздел Разработчикам (Приложения > Разработчикам), в котором собраны удобные инструменты для облегчения работы по интеграции и доработке вашего Битрикс24.
Подробнее...[/di] (Приложения > Разработчикам, вкладка "Готовые сценарии" > Другое > Входящий вебхук).
В открывшейся форме:
В генераторе запросов будет представлен образец URL, который нужно использовать при отправке данных из сторонней системы в Битрикс24
URL состоит из:
Создание входящих вебхуков до версии модуля REST 20.5.0
|
---|
|
Исходящий вебхук используется для получения информации о событиях, происходящих в вашем Битрикс24.
Создать исходящий вебхук можно из раздела [ds]Разработчикам[/ds][di]
Начиная с версии модуля REST 20.5.0, доступен новый раздел Разработчикам (Приложения > Разработчикам), в котором собраны удобные инструменты для облегчения работы по интеграции и доработке вашего Битрикс24.
Подробнее...[/di] (Приложения > Разработчикам, вкладка "Готовые сценарии" > Другое > Исходящий вебхук).
В открывшейся форме:
При создании исходящего вебхука будет выведен токен в виде строки из случайных знаков. Этот код позволит внутри обработчика проверить, действительно ли обработчик вызван вашим Битрикс24.
Пример кода обработчика для события ONCRMDEALUPDATE
<? 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] => ххх ) )
Вы можете создавать тиражные решения для Битрикс24 для нашего каталога приложений и сделать их доступными для установки неограниченному кругу пользователей и, более того, вы можете делать их платными, продавая их функционал по модели подписки.
Необходимость публикации в каталоге накладывает на приложения ряд дополнительных технических и организационных требований:
Иными словами, в отличие от разработки локальных приложений для конкретного проекта или заказчика, когда отношения между разработчиком и пользователем регулируются их двусторонними договоренностями, публикация тиражных решений в каталоге Приложений24 регулируется правилами Битрикс24, с которыми вам потребуется внимательно ознакомиться.
Чтобы продолжить рассказывать о разработке и публикации приложений считаем, что вы уже обладаете доступом в партнерский кабинет 1С-Битрикс, а потому ответим последовательно на основные вопросы:
Чтобы стать технологическим партнером 1С-Битрикс, достаточно заполнить анкету: указать общую информацию, а также данные для дальнейшей авторизации в партнерском кабинете.
Обратите внимание на поле Код партнера – это префикс, который будет подставляться в дальнейшем в символьный код, идентифицирующий ваши решения в нашем каталоге. Если взять в качестве примера решение по интеграции со Stripe (https://www.bitrix24.ru/apps/?app=integrations24ru.stripe), то integrations24ru является как раз этим кодом партнера (разработчика решения), а stripe является кодом конкретного решения, который вы укажите в дальнейшем при заполнении формы регистрации решения.
Поэтому желательно, чтобы код партнера был связан с названием вашей компании или продукта. Поменять его потом не получится, отнеситесь к его формированию вдумчиво и ответственно.
Вы можете воспользоваться готовыми примерами приложений каждого типа для создания основы своего приложения, чтобы в дальнейшем усложнять его функционал.
Статичное приложение. Пример – это готовое приложение, обращающееся к REST API и показывающее ФИО текущего пользователя. Как создать и установить такое приложение в своем Битрикс24?
Серверное приложение с базовым интерфейсом внутри Битрикс24. Пример использует упрощенный вариант использования OAuth 2.0, выводится в виде дополнительной страницы, на которой показывает ФИО текущего пользователя.
Серверное приложение встраиваемое в стандартный интерфейс Битрикс24. Умеет добавлять пункт в контекстное меню списка контактов и списка компаний, использует упрощенный вариант использования OAuth 2.0, выводится в виде слайдера, в котором показывает ФИО текущего пользователя. Пример состоит из двух PHP-файлов, которые вы должны разместить на своем веб-сервере.
Серверное приложение без интерфейса внутри Битрикс24. Умеет получать авторизацию пользователя Битрикс24 и используя ее, находясь при этом вне Битрикс24, обращаться к REST API, получая ФИО текущего пользователя. Пример состоит из одного PHP-файла, который вы должны разместить на своем веб-сервере.
Архив с примером содержит один файл и представляет собой готовое приложение, обращающееся к REST API и показывающее ФИО текущего пользователя.
Для создания решения, которое в дальнейшем может быть опубликовано в каталоге Битрикс24.Маркет, необходимо в кабинете разработчика решений открыть [dw]Добавить приложение[/dw][di][/di], далее выбрать регион публикации. В открывшейся форме необходимо [dw]выбрать или добавить[/dw][di] [/di] версию приложения:
Ознакомьтесь с правилами публикации (Регламенты проверки модератором). Это необходимо для понимания требований, которые накладываются на тиражные решения.
В отличие от локальных статичных приложений, тиражные решения состоят из версий. Каждая версия в дальнейшем подается на модерацию. (При модерации версии проверяется и карточка приложения). На этапе разработки и тестирования модерация не нужна, вы сами занимаетесь разработкой и доведением своего решения до полнофункционального состояния, включая [dw]тестовые установки[/dw][di][/di] на своих Битрикс24, и только потом подаете решение на модерацию.
После добавления версии приложения необходимо заполнить название (1) код приложения (2), категории (3), описание приложения (4), ценовую политику (5) и протестировать (6):
Описание обязательных полей (Нажмите на плюсик)
|
---|
Смысл части обязательных полей понятен из названия, поясним то, что может вызвать затруднения. В отличие от локальных приложений, у каждого тиражного решения необходимо задать уникальный символьный код. Код состоит из двух частей: вашего уникального символьного кода партнера (указывается в партнерской карточке) и части, которую вы присваиваете конкретному создаваемому приложению (2 на рис. выше).
Примечание: с самого начала задавайте вменяемые значения кода. Именно этот символьный код в дальнейшем будет присутствовать в публичном адресе вашего решения в каталоге Приложения24 и заменить его в дальнейшем уже не получится.
Для простоты стоит указать, что приложение бесплатное (5). Перед подачей на модерацию вы сможете поменять этот и другие описательные параметры своего приложения. Заполните описание решения на необходимых языках (4) и заполните обязательные поля с описаниями, а также прикрепите логотип решения и хотя бы один скриншот. На этапе разработки не обязательно вносить реальные и подробные описания, а также реальные скриншоты приложения. Но в дальнейшем, когда вы решите подавать готовое отлаженное решение на модерацию для публикации в каталоге, эти поля необходимо будет заполнить актуальной и полной информацией. Можно сразу привязать его к нужной категории решений (3). Эти категории служат для навигации пользователей по [dw]каталогу решений[/dw][di][/di]. |
Сохраните карточку приложения, заполнив все необходимые поля. Первый шаг сделан - фактически, вы подготовили описательную часть вашего будущего приложения. Теперь необходимо сформировать ту часть, которая отвечает за техническую реализацию.
Архив с примером содержит SDK CRest, модификации SDK CRest для упрощенного варианта использования OAuth 2.0. Представляет собой готовое приложение, обращающееся к REST API и показывающее ФИО текущего пользователя. Другой пример такого приложения описан в уроке REST для sms.
Для создания решения, которое в дальнейшем может быть опубликовано в каталоге Битрикс24.Маркет необходимо в кабинете разработчика решений открыть [dw]Добавить приложение[/dw][di][/di], далее выбрать регион публикации. В открывшейся форме необходимо [dw]выбрать или добавить[/dw][di] [/di] версию приложения:
Заполните доступные разделы системы (1) для данного примера значением "Пользователи". Ознакомьтесь с правилами публикации (2). Это необходимо для понимая требований, которые накладываются на тиражные решения.
В отличие от локальных приложений, тиражные решения состоят из версий. Каждая версия в дальнейшем подается на модерацию. (При модерации версии проверяется и карточка приложения). На этапе разработки и тестирования модерация не нужна, вы сами занимаетесь разработкой и доведением своего решения до полнофункционального состояния, включая [dw]тестовые установки[/dw][di][/di] на своих Битрикс24, и только потом подаете решение на модерацию.
После добавления версии приложения необходимо заполнить название (1) код приложения (2), категории (3), описание приложения (4), ценовую политику (5) и протестировать (6):
Описание обязательных полей (Нажмите на плюсик)
|
---|
Смысл части обязательных полей понятен из названия, поясним то, что может вызвать затруднения. В отличие от локальных приложений, у каждого тиражного решения необходимо задать уникальный символьный код. Код состоит из двух частей: вашего уникального символьного кода партнера (указывается в партнерской карточке) и части, которую вы присваиваете конкретному создаваемому приложению (2 на рис. выше).
Примечание: с самого начала задавайте вменяемые значения кода. Именно этот символьный код в дальнейшем будет присутствовать в публичном адресе вашего решения в каталоге Приложения24 и заменить его в дальнейшем уже не получится.
Для простоты стоит указать, что приложение бесплатное (5). Перед подачей на модерацию вы сможете поменять этот и другие описательные параметры своего приложения. Заполните описание решения на необходимых языках (4) и заполните обязательные поля с описаниями, а также прикрепить логотип решения и хотя бы один скриншот. На этапе разработки не обязательно вносить реальные и подробные описания, а также реальные скриншоты приложения. Но в дальнейшем, когда вы решите подавать готовое отлаженное решение на модерацию для публикации в каталоге, эти поля необходимо будет заполнить актуальной и полной информацией. Можно сразу привязать его к нужной категории решений (3). Эти категории служат для навигации пользователей по [dw]каталогу решений[/dw][di][/di]. |
Сохраните карточку приложения, заполнив все необходимые поля. Первый шаг сделан - фактически, вы подготовили описательную часть вашего будущего приложения. Теперь необходимо сформировать ту часть, которая отвечает за техническую реализацию.
Для тестирования приложения, необходимо открыть [dw]Тестировать в версии приложения[/dw][di][/di] или [dw]Протестировать в приложении[/dw][di][/di]:
После установки приложения Битрикс24 сразу откроет его интерфейс. Вы также сможете переходить в приложение из соответствующего пункта левого меню или меню Еще в разделе Приложения. Запущенное [dw]приложение выведет[/dw][di] [/di] отладочную информацию о передаваемых авторизационных данных текущего пользователя, а также ФИО текущего пользователя, получая его по REST API с использованием этих авторизационных данных. Поскольку это приложение работает в интерфейсе Битрикс24 и использует авторизацию текущего пользователя, который открыл приложение, то оно действует исключительно только в рамках прав этого пользователя.
Битрикс24 умеет отправлять SMS не только из бизнес-процессов и роботов CRM, но и из карточки CRM (которая доступна везде, включая бесплатный тариф без бизнес-процессов). Для решения этой задачи есть соответствующий специальный REST для служб сообщений. В первую очередь его используют для интеграции с SMS, но вообще это универсальный механизм и в дальнейшем его можно использовать для отправки сообщений в произвольные источники.
Авторам интеграций с SMS-провайдерами рекомендуется перевести свои приложения на новый REST, чтобы у пользователей не было проблем с установкой на бесплатном тарифе. И, несмотря на прозрачность вызовов существующих провайдеров для бизнес-процессов и роботов CRM, лучше работать с методами REST для службы сообщений. Тем более, что только эти методы позволят не только отправлять SMS, но и сообщать Битрикс24 о статусе отправленных сообщений. Этот статус пользователи видят прямо в карточке CRM (а в будущем увидят и в отчетах инструментов CRM-маркетинга).
Рассмотрим практический пример того, как можно быстро сделать интеграцию с SMS-провайдером.
Чтобы стать технологическим партнером 1С-Битрикс, достаточно заполнить анкету: указать общую информацию, а также данные для дальнейшей авторизации в партнерском кабинете.
Обратите внимание на поле Код партнера - это префикс, который будет подставляться в дальнейшем в символьный код, идентифицирующий ваши решения в нашем каталоге. Если взять в качестве примера решение по интеграции со Stripe https://www.bitrix24.ru/apps/?app=integrations24ru.stripe, то integrations24ru является как раз этим кодом партнера (разработчика решения), а код stripe является кодом конкретного решения, который вы укажите в дальнейшем при заполнении формы регистрации решения.
Поэтому желательно, чтобы код партнера был связан с названием вашей компании или продукта. Поменять его потом не получится, отнеситесь к его формированию вдумчиво и ответственно.
После заполнения анкеты вы сразу получите доступ в кабинет разработчика решений. Для создания решения, которое в дальнейшем может быть опубликовано в каталоге Битрикс24.Маркет, необходимо открыть [dw]Добавить приложение[/dw][di][/di], далее выбрать регион публикации. В открывшейся форме необходимо [dw]выбрать или добавить[/dw][di] [/di] версию приложения:
Заполните доступные разделы системы (1) для данного примера значением "Сервис сообщений". Битрикс24 в этом случае будет сам вызывать наш провайдер из нужных точек в интерфейсе: из бизнес-процессов, из роботов CRM, из карточки CRM и так далее. Ознакомьтесь с правилами публикации (2). Это необходимо для понимая требований, которые накладываются на тиражные решения.
В отличие от локальных приложений, тиражные решения состоят из версий. Каждая версия в дальнейшем подается на модерацию. (При модерации версии проверяется и карточка приложения). На этапе разработки и тестирования модерация не нужна, вы сами занимаетесь разработкой и доведением своего решения до полнофункционального состояния, включая [dw]тестовые установки[/dw][di][/di] на своих Битрикс24, и только потом подаете решение на модерацию.
После добавления версии приложения необходимо заполнить название (1) код приложения (2), категории (3), описание приложения (4), ценовую политику (5) и протестировать (6):
Описание обязательных полей (Нажмите на плюсик)
|
---|
Смысл части обязательных полей понятен из названия, поясним то, что может вызвать затруднения. В отличие от локальных приложений, у каждого тиражного решения необходимо задать уникальный символьный код. Код состоит из двух частей: вашего уникального символьного кода партнера (указывается в партнерской карточке) и части, которую вы присваиваете конкретному создаваемому приложению (2 на рис. выше).
Примечание: с самого начала задавайте вменяемые значения кода. Именно этот символьный код в дальнейшем будет присутствовать в публичном адресе вашего решения в каталоге Битрикс24.Маркет и заменить его в дальнейшем уже не получится.
Для простоты стоит указать, что приложение бесплатное (5). Перед подачей на модерацию вы сможете поменять этот и другие описательные параметры своего приложения. Заполните описание решения на необходимых языках (4) и заполните обязательные поля с описаниями, а также прикрепить логотип решения и хотя бы один скриншот. На этапе разработки не обязательно вносить реальные и подробные описания, а также реальные скриншоты приложения. Но в дальнейшем, когда вы решите подавать готовое отлаженное решение на модерацию для публикации в каталоге, эти поля необходимо будет заполнить актуальной и полной информацией. Можно сразу привязать его к нужной категории решений (3). Эти категории служат для навигации пользователей по [dw]каталогу решений[/dw][di][/di]. |
Про URL приложения
|
---|
Прежде, чем заполнять форму новой версии, обратимся к архиву с примером. В архиве - несколько файлов, которые в целом показывают возможную архитектуру интеграции с SMS-провайдером. Распакуйте этот архив на своем веб-сервере, который доступен из WWW и на котором установлен нормальный SSL. (Без SSL не приходится говорить ни о каком тиражном решении для каталога Битрикс24.Маркет.) Допустим, скрипты примера доступны по адресу https://mydomain.ru/sms/. В этом случае:
|
Сохраните карточку приложения, заполнив все необходимые поля. Первый шаг сделан - фактически, вы подготовили описательную часть вашего будущего приложения. Теперь необходимо сформировать ту часть, которая отвечает за техническую реализацию.
Приложение регистрирует в конкретном Битрикс24 некий обработчик. Когда пользователь (или автоматический процесс) на стороне Битрикс24 хочет отправить SMS, он дергает этот обработчик и передает в него текст и номер телефона получателя. Обработчик (зная параметры вызова API SMS-оператора) отправляет SMS. Вот такая простая схема:
В нашем примере, скрипт install.php запросит у пользователя параметры для подключения API SMS-оператора и сохраняет их на своей стороне в привязке к конкретному Битрикс24. В таблице БД, например. Этот же скрипт регистрирует так называемый "провайдер сообщений" в Битрикс24, обращаясь к соответствующему методу REST. Фактически, это и будет регистрацией обработчика, который реализуется в примере в файле handler.php по адресу https://mydomain.ru/sms/handler.php. Если регистрация прошла успешно, install.php должен завершить установку.
В дальнейшем приложение ожидает, когда Битрикс24 обратится к нему:
Обращение произойдет, если пользователь, допустим, решит отправить SMS из карточки CRM. В этом случае, handler.php получит целую кучу данных в массиве $_REQUEST
:
requestArray ( [module_id] => crm [bindings] => Array ( [0] => Array ( [OWNER_TYPE_ID] => 1 [OWNER_ID] => 5783 ) ) [properties] => Array ( [phone_number] => +9172012345 [message_text] => тест ) [type] => SMS [code] => fastsms [message_id] => e35864edce3eaad987d32f8955c1177b [message_to] => +9172012345 [message_body] => тест [ts] => 1513177809 [auth] => Array ( [access_token] => x4o81wfl4g57qur2u8sjrlcha76zn0tj [expires_in] => 3600 [scope] => messageservice [domain] => restapi.bitrix24.ru [server_endpoint] => https://oauth.bitrix.info/rest/ [status] => F [client_endpoint] => https://restapi.bitrix24.ru/rest/ [member_id] => da45a03b265edd8787f8a258d793cc5d [user_id] => 1 [application_token] => 127acc1c34feccc4da8fbf5020856f12 ) )
Нас интересует:
Обработчик, получив данные о сообщении, должен:
Можно и не запоминать, но тогда приложение не сможет во всей полноте реализовать хорошие пользовательские сценарии. Так как статус доставки SMS-сообщения становится известным только через некоторое время (иногда это могут быть часы), мы не сможем прямо из handler.php тут же сообщить в Битрикс24 о результате доставки. Приложению придется делать это отдельно, и для этого в архиве примера есть файл statuses.php. Подразумевается, что какой-то менеджер заданий обращается к этому файлу с некой периодичностью и этот скрипт «смотрит» на очередь отправленных SMS и по каждому из них пытается узнать статус доставки, обращаясь к API SMS-провайдера:
О результатах он сообщает в Битрикс24, и удаляет из очереди обработанные сообщения.
Для тестирования приложения, необходимо открыть [dw]Тестировать в версии приложения[/dw][di][/di] или [dw]Протестировать в приложении[/dw][di][/di]:
После нажатия "Установить" откроется указанный Битрикс24 на странице установки приложения. [dw]Установите приложение[/dw][di][/di].
При установке в интерфейсе Битрикс24 будет вызван install.php, который выведет интерфейс для ввода некого ключа API. В зависимости от конкретного SMS-провайдера параметры авторизации будут отличаться, так что в своем приложении интерфейс вам нужно будет подзаточить под конкретный случай.
Нажмите “Save”, приложение будет считаться установленным (о техническом завершении - ниже), и Битрикс24 автоматически откроет уже основной интерфейс приложения index.php. В архиве примера этот интерфейс не сильно отличается от интерфейса установки и должен «подхватывать» сохраненные параметры авторизации SMS-провайдера. Но, поскольку это просто «заготовка» для приложения, а не работающая интеграция с конкретным провайдером, то мы увидим просто форму для ввода ключа.
Начнем с install.php. Когда Битрикс24 показывает во фрейме скрипт приложения (это касается как скрипта установки, так и основного скрипта приложения), то он передает в массив $_REQUEST
все необходимые для OAuth 2.0 параметры авторизации. Следовательно, мы их можем схватить и сохранить на стороне приложения для дальнейшего использования. Именно это и происходит в коде при формировании hidden-полей:
<form id="sms-settings"> <input type="hidden" name="save" value="Y"> <input type="hidden" name="access_token" value="<?=$_REQUEST['AUTH_ID'];?>"> <input type="hidden" name="refresh_token" value="<?=$_REQUEST['REFRESH_ID'];?>"> <input type="hidden" name="domain" value="<?=$_REQUEST['DOMAIN'];?>"> <input type="hidden" name="member_id" value="<?=$_REQUEST['member_id'];?>"> <div class="form-group"> <label for="sms_token">API-key FastSMS</label> <input type="text" class="form-control" name="sms_token" id="sms_token" placeholder="FastSMS API token"> </div> <button type="submit" class="btn btn-primary btn-lg btn-save">Save</button> </form>
Далее, мы делаем обработчик onsubmit, который позволит перехватить нажатие на кнопку "Save".
$('#sms-settings').submit(function(e){ e.preventDefault(); // 1. сохраняем данные авторизации на стороне приложения, чтобы в // дальнейшем использовать их для отправки смс // 2. прописываем обработчик для провайдера var params = { CODE: 'fastsms', TYPE: 'SMS', HANDLER: 'https://mydomain.ru/sms/handler.php', NAME: 'Provider FastSms', DESCRIPTION: 'Description sms provider' }; BX24.callMethod( 'messageservice.sender.add', params, function(result) { if(result.error()) { alert("Error: " + result.error()); } else { // Обработчик для провайдера прописан успешно // 3. заканчиваем процедуру установки на стороне Битрикс24 BX24.installFinish(); } } ); });
В этом обработчике можно прописать свой механизм сохранения нужных параметров. А далее зарегистрируйте тот самый обработчик, обращаясь для этого к методу messageservice.sender.add. Если регистрация прошла успешно, мы вызываем метод installFinish, который сообщает Битрикс24 об успешном завершении установки.
В index.php все то же самое, та же форма настроек, та же обработка события onsubmit, в которой вам придется писать свой код сохранения настроек и параметров авторизации. Но тут уже нет никакого installFinish, потому что приложение уже установлено:
$('#sms-settings').submit(function(e){ e.preventDefault(); // сохраняем данные авторизации на стороне приложения, чтобы в // дальнейшем использовать их для отправки смс });
Код в handler.php. В примере просто сохраняется то, что нам передает Битрикс24 в лог:
CRest::setLog($_REQUEST, 'handler'); print_r($_REQUEST);
Но вы можете здесь обращаться к API провайдера SMS, инициируя отправку SMS теми средствами, которые вам предоставит оператор. Пример содержимого массива $_REQUEST
есть выше.
Самое сложое находится в файле statuses.php. Подразумевается, что этот файл будет вызываться с некой периодичностью и он должен уметь обращаться к некой очереди, которую вы должны сделать самостоятельно. И получая из этой очереди информацию об отправленных SMS-сообщениях, он должен дергать API SMS-провайдера, получать от него статус доставки и передавать его обратно в Битрикс24. Для этого придется в очереди запоминать как ID-сообщения, который присылает Битрикс24, так и соответствующий ему ID-сообщения на стороне SMS-оператора. Посмотрим на код:
require_once(__DIR__ . '/crest.php'); /** * message_id полученный в handler.php */ $messageId = '520108d3dabbe6e98586549f467cab8d'; /** * sms status: delivered, undelivered, failed */ $status = 'delivered'; $result = CRest::call( 'messageservice.message.status.update', [ 'CODE' => 'fastsms', 'message_id' => $messageId, 'status' => $status, ] ); echo "<pre>"; print_r($result); echo "</pre>"; if (isset($result['error'])) { // что-то пошло не так, анализируем ошибку и реагируем на нее }
Представим, что на каждом шаге цикла обработки очереди мы получили из очереди $messageId
, потом вытащили оттуда же название домена Битрикс24 и токены, которые передадим в getSettingData/setSettingData переопределив методы для работы с несколькими Битрикс24. Домен и access_token нам нужны, чтобы обратиться к REST Битрикс24. Это простой HTTP-запрос, в котором указывается домен Битрикс, название нужного метода (в нашем случае это метод messageservice.message.status.update для обновления статуса доставки), параметры метода и токен авторизации access_token.
Для автоматического продления токенов необходимо заполнить константы: C_REST_CLIENT_ID (1) и C_REST_CLIENT_SECRET (2). Значения для [dw]этих констант[/dw][di]Такая пара ключей действует на всех Битрикс24, на которых потом будет устанавливаться ваше приложение.[/di] вам нужно взять из карточки приложения:
Используйте функцию CRest::call(). Она получает название нужного метода REST, параметры для этого метода и токены авторизации из методов getSettingData/setSettingData.
Используйте стандартную заготовку в виде архива примера, адаптируйте к реальному оператору SMS и публикуйте решения в каталоге Битрикс24.Маркет.
Архив с примером содержит SDK CRest и два файла, которые представлят собой готовое приложение. Приложение обращается к REST API, встраивает всплывающие диалоги в списки контактов и компаний CRM и выводит данные объекта CRM, выбранного пользователем.
Для создания решения, которое в дальнейшем может быть опубликовано в каталоге Битрикс24.Маркет, необходимо в кабинете разработчика решений открыть [dw]Добавить приложение[/dw][di][/di], далее выбрать регион публикации. В открывшейся форме необходимо [dw]выбрать или добавить[/dw][di] [/di] версию приложения:
Заполните доступные разделы системы (1) для данного примера значениями "CRM", "Пользователи", "Встраиваемые приложения". Ознакомьтесь с правилами публикации (2). Это необходимо для понимая требований, которые накладываются на тиражные решения.
В отличие от локальных приложений, тиражные решения состоят из версий. Каждая версия в дальнейшем подается на модерацию. (При модерации версии проверяется и карточка приложения). На этапе разработки и тестирования модерация не нужна, вы сами занимаетесь разработкой и доведением своего решения до полнофункционального состояния, включая [dw]тестовые установки[/dw][di][/di] на своих Битрикс24, и только потом подаете решение на модерацию.
После добавления версии приложения необходимо заполнить название (1) код приложения (2), категории (3), описание приложения (4), ценовую политику (5) и протестировать (6):
Описание обязательных полей (Нажмите на плюсик)
|
---|
Смысл части обязательных полей понятен из названия, поясним то, что может вызвать затруднения. В отличие от локальных приложений, у каждого тиражного решения необходимо задать уникальный символьный код. Код состоит из двух частей: вашего уникального символьного кода партнера (указывается в партнерской карточке) и части, которую вы присваиваете конкретному создаваемому приложению (2 на рис. выше).
Примечание: с самого начала задавайте вменяемые значения кода. Именно этот символьный код в дальнейшем будет присутствовать в публичном адресе вашего решения в каталоге Битрикс24.Маркет и заменить его в дальнейшем уже не получится.
Для простоты стоит указать, что приложение бесплатное (5). Перед подачей на модерацию вы сможете поменять этот и другие описательные параметры своего приложения. Заполните описание решения на необходимых языках (4) и заполните обязательные поля с описаниями, а также прикрепить логотип решения и хотя бы один скриншот. На этапе разработки не обязательно вносить реальные и подробные описания, а также реальные скриншоты приложения. Но в дальнейшем, когда вы решите подавать готовое отлаженное решение на модерацию для публикации в каталоге, эти поля необходимо будет заполнить актуальной и полной информацией. Можно сразу привязать его к нужной категории решений (3). Эти категории служат для навигации пользователей по [dw]каталогу решений[/dw][di][/di]. |
Сохраните карточку приложения, заполнив все необходимые поля. Первый шаг сделан - фактически, вы подготовили описательную часть вашего будущего приложения. Теперь необходимо сформировать ту часть, которая отвечает за техническую реализацию.
Для тестирования приложения, необходимо открыть [dw]Тестировать в версии приложения[/dw][di][/di] или [dw]Протестировать в приложении[/dw][di][/di]:
Укажите адрес вашего тестового Битрикс24 (1) и нажмите кнопку "Установить" (2). После установки приложения Битрикс24 выдаст сообщение "Приложение не найдено". Это нормальная ситуация, поскольку у нашего примера включена опция "Использовать только API" и оно ещё не опубликовано в публичном каталоге. Когда ваше приложение будет доступно в каталоге Битрикс24.Маркет, то Битрикс24 после установки будет оставлять пользователя на странице с описанием приложения.
Перейдите в список контактов или компаний. В контекстном меню любого контакта или компании в подменю "Приложения" теперь доступен пункт [dw]"Public embedded form"[/dw][di][/di], при нажатии на который откроется слайдер с приложением.
Приложение [dw]выведет отладочную информацию[/dw][di][/di] о передаваемых авторизационных данных текущего пользователя, а также данные контакта (или компании, если его вызвать из списка компаний CRM), получая их по REST API с использованием этих авторизационных данных. Поскольку это приложение работает в интерфейсе Битрикс24 и использует авторизацию текущего пользователя, который открыл приложение, то оно действует исключительно только в рамках прав этого пользователя.
Пример состоит из SDK CRest и PHP-файла с примером, которые вы должны разместить на своем веб-сервере до добавления приложения в свой Битрикс24. Приложение умеет получать авторизацию пользователя Битрикс24 и используя ее, находясь при этом вне Битрикс24, обращаться к REST API, получая ФИО пользователя, установившего приложение.
Для создания решения, которое в дальнейшем может быть опубликовано в каталоге Битрикс24.Маркет, необходимо в кабинете разработчика решений открыть [dw]Добавить приложение[/dw][di][/di], далее выбрать регион публикации. В открывшейся форме [dw]выбрать или добавить[/dw][di] [/di] версию приложения:
Заполните доступные разделы системы (1) для данного примера значениями "Пользователи". Ознакомьтесь с правилами публикации (2). Это необходимо для понимания требований, которые накладываются на тиражные решения.
В отличие от локальных приложений, тиражные решения состоят из версий. Каждая версия в дальнейшем подается на модерацию. (При модерации версии проверяется и карточка приложения). На этапе разработки и тестирования модерация не нужна, вы сами занимаетесь разработкой и доведением своего решения до полнофункционального состояния, включая [dw]тестовые установки[/dw][di][/di] на своих Битрикс24, и только потом подаете решение на модерацию.
После добавления версии приложения необходимо заполнить название (1) код приложения (2), категории (3), описание приложения (4), ценовую политику (5) и протестировать (6):
Описание обязательных полей (Нажмите на плюсик)
|
---|
Смысл части обязательных полей понятен из названия, поясним то, что может вызвать затруднения. В отличие от локальных приложений, у каждого тиражного решения необходимо задать уникальный символьный код. Код состоит из двух частей: вашего уникального символьного кода партнера (указывается в партнерской карточке) и части, которую вы присваиваете конкретному создаваемому приложению (2 на рис. выше).
Примечание: с самого начала задавайте вменяемые значения кода. Именно этот символьный код в дальнейшем будет присутствовать в публичном адресе вашего решения в каталоге Битрикс24.Маркет и заменить его в дальнейшем уже не получится.
Для простоты стоит указать, что приложение бесплатное (5). Перед подачей на модерацию вы сможете поменять этот и другие описательные параметры своего приложения. Заполните описание решения на необходимых языках (4) и заполните обязательные поля с описаниями, а также прикрепить логотип решения и хотя бы один скриншот. На этапе разработки не обязательно вносить реальные и подробные описания, а также реальные скриншоты приложения. Но в дальнейшем, когда вы решите подавать готовое отлаженное решение на модерацию для публикации в каталоге, эти поля необходимо будет заполнить актуальной и полной информацией. Можно сразу привязать его к нужной категории решений (3). Эти категории служат для навигации пользователей по [dw]каталогу решений[/dw][di][/di]. |
Сохраните карточку приложения, заполнив все необходимые поля. Первый шаг сделан - фактически, вы подготовили описательную часть вашего будущего приложения. Теперь необходимо сформировать ту часть, которая отвечает за техническую реализацию.
Для тестирования приложения, необходимо открыть [dw]Тестировать в версии приложения[/dw][di][/di] или [dw]Протестировать в приложении[/dw][di][/di]:
Нажмите на ссылку и введите адрес такого Битрикс24, вы будете перенаправлены на процедуру установки, которая полностью воспроизводит последовательность действий пользователей, устанавливающих уже опубликованные решения:
Для автоматического продления токенов необходимо заполнить в файле settings.php константы: C_REST_CLIENT_ID (1) и C_REST_CLIENT_SECRET (2). Значения для [dw]этих констант[/dw][di]Такая пара ключей действует на всех Битрикс24, на которых потом будет устанавливаться ваше приложение.[/di] вам нужно взять из карточки приложения:
Откройте index.php примера в браузере по вашему URL: приложение выведет Фамилию Имя текущего пользователя, получив его по REST API с использованием авторизационных данных, полученных при установке приложения.
Для создания решения, которое в дальнейшем может быть опубликовано в каталоге Битрикс24.Маркет, необходимо в кабинете разработчика решений открыть [dw]Добавить приложение[/dw][di][/di], далее выбрать регион публикации. В открывшейся форме [dw]выбрать или добавить[/dw][di] [/di] версию приложения:
После добавления версии приложения необходимо заполнить название (1) код приложения (2), категории (3), описание приложения (4), ценовую политику (5) и протестировать (6):
Смысл части обязательных полей понятен из названия, поясним то, что может вызвать затруднения.
В отличие от локальных приложений, у каждого тиражного решения необходимо задать уникальный символьный код. Код состоит из двух частей: вашего уникального символьного кода партнера (указывается в партнерской карточке) и части, которую вы присваиваете конкретному создаваемому приложению (2 на рис. выше).
Для простоты стоит указать, что приложение бесплатное (5). Перед подачей на модерацию вы сможете поменять этот и другие описательные параметры своего приложения.
Для некоторых стран или регионов в Битрикс24.Маркет существует возможность публикации платных приложений по модели подписки Битрикс24. Маркет Плюс.
Можно сразу привязать свое решение к нужной категории решений (3). Эти категории служат для навигации пользователей по [dw]каталогу решений[/dw][di][/di].
Нажмите на блок с одним из языков в Описание приложения (4) и заполните обязательные поля с описаниями, а также прикрепите логотип решения и хотя бы один скриншот. На этапе разработки не обязательно вносить реальные и подробные описания, а также реальные скриншоты приложения. Но в дальнейшем, когда вы решите подавать готовое отлаженное решение на модерацию для публикации в каталоге, эти поля необходимо будет заполнить актуальной и полной информацией.
Ознакомьтесь с правилами публикации. Это необходимо для понимая требований, которые накладываются на тиражные решения.
Сохраните карточку приложения, заполнив все необходимые поля. Первый шаг сделан - фактически, вы подготовили описательную часть вашего будущего приложения. Теперь необходимо сформировать ту часть, которая отвечает за техническую реализацию.
В отличие от локальных приложений, тиражные решения состоят из версий. Каждая версия в дальнейшем подается на модерацию. (При модерации версии проверяется и карточка приложения). На этапе разработки и тестирования модерация не нужна, вы сами занимаетесь разработкой и доведением своего решения до полнофункционального состояния, включая тестовые установки на своих Битрикс24, и только потом подаете решение на модерацию.
При создании нового решения нам необходимо [dw]создать[/dw][di][/di](2) первую версию приложения. В открывшейся форме заполните базовые поля и укажите необходимые для приложения права. (Нужно выбирать только права на те модули Битрикс24, которые фактически используются вашим решением). Далее загрузите архив с приложением, или укажите URL внешнего приложения:
После сохранения вы увидите сообщение Изменения сохранены, а закрыв слайдер с версией, увидите заполненное версией решение.
Когда ваша версия будет полностью готова к публикации, то есть будет находиться на рабочем сервере, вы сами удостоверитесь в её работоспособности, проверите описания и материалы на соответствие регламентам Приложений24 и т.д., необходимо подать ее на модерацию.
Для этого откройте страницу Мои приложения и в списке решений в столбце Статус нажмите на модерацию. Откроется слайдер с проверкой приложения перед отправкой на модерацию, если нет замечаний нажмите "Отправить", иначе необходимо исправить все замечания перед отправкой решения на модерацию. Ваше решение попадет в соответствующую очередь и будет рассмотрено модераторами. Если они найдут какие-то недочеты или несоответствие правилам, они свяжутся с вами через механизм "Обсуждений".
Не всякое обновление функционала вашего решения требует "обновления" с точки зрения каталога Битрикс24.Маркет. В частности, если у вас серверное решение, находящееся на вашем сервере, то во многих случаях вы можете обновлять его функционал прозрачно для пользователя на своей стороне.
Исключение составляют случаи, когда либо вы опубликовали статичное приложение и теперь хотите обновить его функционал, либо если новый функционал вашего серверного приложения требует новых прав на инструменты Битрикс24 (чтобы пользователь подтвердил в явном виде, что он дает приложению доступ к этим инструментам).
Для обновления существующего решения, найдите его в разделе Мои приложения кабинета разработчика решений. В открывшемся решении необходимо открыть [dw]История версий[/dw][di][/di]. В списке версий решения нажать "Добавить" для добавления новой версии приложения. В открывшейся форме заполнить обязательные поля:
Фактически, обновление с точки зрения Битрикс24 - это новая версия приложения. Следовательно, вам нужно опубликовать новую версию, а пользователям в дальнейшем ее установить на своих Битрикс24.
В описании версии необходимо указать те изменения, которые были сделаны по отношению к предыдущей версии. Это важно и пользователям, которые должны понимать, зачем им ставить обновленную версию, и модераторам, чтобы знать, что именно им нужно проверить в новой версии.
После сохранения вы увидите сообщение Изменения сохранены, а закрыв слайдер с версией, увидите заполненное версией решение.
Когда ваша версия будет полностью готова к публикации: будет находиться на рабочем сервере, вы сами удостоверитесь в её работоспособности, проверите описания и материалы на соответствие регламентам Приложений24 и т.д.), необходимо подать её на модерацию.
Для этого откройте страницу Мои приложения и в списке решений в столбце Статус нажмите на модерацию. Откроется слайдер с проверкой приложения перед отправкой на модерацию, если нет замечаний нажмите "Отправить", иначе необходимо исправить все замечания перед отправкой решения на модерацию. Ваше решение попадет в соответствующую очередь и будет рассмотрено модераторами. Если они найдут какие-то недочеты или несоответствие правилам, они свяжутся с вами через механизм "Обсуждений".
Когда версия будет промодерирована, она станет доступна для существующих пользователей в виде обновления, о чем Битрикс24 будет сообщать им в интерфейсе вашего приложения. У пользователей есть выбор, устанавливать обновление или нет.
Если ваше решение не реализует никакого интерфейса внутри Битрикс24, то может возникнуть ситуация, что администратор Битрикс24 не зайдет в раздел Приложения и не получит информацию о том, что для решения доступны обновления. Мы рекомендуем заранее подумать о том, как вы сможете информировать пользователей ваших приложений об обновлениях и подталкивать их к установке новых версий.
Теперь, после того, как вы ознакомились с понятием вебхуков, локальных и публичных тиражных решений, и попробовали примеры из соответствующих разделов "Быстрого старта" можно углубиться в понимание аспектов разработки решений и интеграций для Битрикс24.
Все приложения для Битрикс24 можно разделить на 2 типа:
Встройки и обработку событий невозможно сделать через статичное приложение (на html/js). Связано это с тем, что во встройки и в события передается POST-запрос от Битрикс24 с набором параметров, и веб-сервер, открывая статичный html, никак его не сможет обработать.
Если оно размещается на стороннем сервере, то имя хоста приложения должно содержать точку. Для разработки и тестирования приложение может размещаться в локальной сети, но, например, localhost для этих целей не подойдет, лучше указать прямой IP. (Локальный адрес будет открываться в iframе на странице приложения на портале. Браузерное ограничение – общение между порталом и содержимым фрейма реализовано через postMessage. Замечено, что некоторые версии браузеров некорректно обрабатывают сообщения, если они исходят от localhost.)
На стадии разработки и тестирования нет необходимости иметь сервер, подписанный реальным SSL сертификатом. Вполне достаточно самоподписанного сертификата, если добавить его в исключения браузера.
При этом серверные приложения могут как реализовывать пользовательский интерфейс внутри Битрикс24, так и работать с Битрикс24 только на уровне обмена данными с использованием REST API.
Приложение имеет два варианта добавления пользовательского интерфейса в Битрикс24.
Этот вариант состоит в том, что если у вашего приложения не включена опция "Использовать только API", то внутри Битрикс24, на котором установлено приложение, будет добавлена отдельная страница, на которой в IFRAME будет выводиться index.html статичного приложения или открываться URL вашего серверного приложения.
Из IFRAME нельзя получить доступ к родительскому окну. Это большой плюс с точки зрения безопасности, но минус с точки зрения усложнения разработки. Снять ограничения работы в IFRAME помогает JavaScript-библиотека функций. Например:
Помимо основного независимого интерфейса самого приложения на отдельной странице, ваше приложение может добавлять функционал в специальные отведенные области стандартного интерфейса: карточки объектов CRM, различные списки элементов и т.д.
Для этого установите обработчик места встраивания при помощи placement.bind. Одно приложение может установить произвольное число обработчиков, даже для одного и того же места встраивания (например, если вам нужно добавить несколько разных операций в контекстное меню лида в CRM).
Обработчик ограничен условиями:
Метод при установке обработчика определяет места встраивания приложения. При разработке контекстных приложений учитывайте, что у каждого места встраивания могут быть свои особенности отображения и свой js-интерфейс. Например, места встраивания CRM_*_LIST_MENU представляют собой слайдеры, открывающиеся из контекстного меню соответствующих сущностей CRM, а CALL_CARD будет представлять собой переключатель приложений в виде табов в карточке звонка.
Текущий доступный список мест для встраивания описан в справочнике по REST API.
Пример вызова:
http://portal.bitrix24.com/rest/placement.bind/?access_token=sode3flffcmv500fuagrprhllx3soi72 &PLACEMENT=CRM_CONTACT_LIST_MENU &HANDLER=http%3A%2F%2Fwww.applicationhost.com%2Fplacement%2F &TITLE=Тестовое приложение HTTP/1.1 200 OK { "result": true }
В конце установки приложения используйте функцию BX24.installFinish. Она сигнализирует об окончании работы инсталлятора или настройщика приложения.
Результат вызова - в контекстном меню списка контактов появляется пункт меню Приложения с подпунктом Тестовое приложение.
В примере выше при клике по пункту приложения будет открыт слайдер с приложением. В слайдере будет отображен фрейм, в который будет загружено приложение по заданному адресу обработчика. Работа в этом фрейме мало чем отличается от работы приложения на отдельной странице (базовый вариант добавления интерфейса), за несколькими небольшими исключениями:
Вот что получится для простейшего обработчика с кодом:
echo '<pre>'; print_r($_REQUEST); echo '</pre>';
При встраивании в меню приложению не предоставляется никакого дополнительного интерфейса. Это неудивительно, учитывая, что слайдер перекрывает интерфейс под собой и не дает никак с ним работать, пока приложение открыто.
JS методы встраивания приложений доступны и при встраивании в интерфейс и на обычной странице приложения с фреймом. В этом случае места встраивания передаются как DEFAULT, а параметры контекста вызова - как GET-параметры страницы.
Для открытия приложение используйте метод BX24.openApplication, для закрытия - BX24.closeApplication
Зарегистрируйте тип поля.
Создайте пользовательское поле вручную, либо через API. Например, для Лидов CRM используется crm.lead.userfield.add.
Когда открывается форма, допустим, карточка лида в CRM, в которой выводится поле нашего пользовательского типа, то в карточке, фактически, выводится фрейм с приложением. В этот фрейм передаются все данные о поле, значении и режиме работы. Для приложения все выглядит так, как если бы оно было открыто в месте встройки с идентификатором USERFIELD_TYPE.
Вот пример POST-данных, пришедших в фрейм:
Array ( [DOMAIN] => sometestportal.bitrix24.com [PROTOCOL] => 1 [LANG] => ru [APP_SID] => 14d2c95b446cb049375e4a045dc2a177 [AUTH_ID] => xomlj71xez3p4q8bqsb5icqjcgjetf0p [AUTH_EXPIRES] => 3600 [REFRESH_ID] => 51556ja184k22cqot442w0lp1quxg0p2 [member_id] => 6f61b5484aff6f8aa3fef768153d0226 [status] => L [PLACEMENT] => USERFIELD_TYPE [PLACEMENT_OPTIONS] => {"MODE":"view","ENTITY_ID":"CRM_LEAD","FIELD_NAME":"UF_CRM_1511508634350","ENTITY_VALUE_ID":"2","VALUE":["\u0435\u0445\u0430\u043b \u0433\u0440\u0435\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0443","\u0432\u0438\u0434\u0438\u0442 \u0433\u0440\u0435\u043a\u0430 \u0432 \u0440\u0435\u043a\u0435 \u0440\u0430\u043a","c\u0443\u043d\u0443\u043b \u0433\u0440\u0435\u043a\u0430 \u0440\u0443\u043a\u0443 \u0432 \u0440\u0435\u043a\u0443","\u0440\u0430\u043a \u0437\u0430 \u0440\u0443\u043a\u0443 \u0433\u0440\u0435\u043a\u0430 \u0446\u0430\u043f"],"MULTIPLE":"Y","MANDATORY":"N","XML_ID":null} )
Детально разберём json-строку PLACEMENT_OPTIONS:
Array ( [MODE] => view [ENTITY_ID] => CRM_LEAD [FIELD_NAME] => UF_CRM_1511508634350 [ENTITY_VALUE_ID] => 2 [VALUE] => Array ( [0] => ехал грека через реку [1] => видит грека в реке рак [2] => cунул грека руку в реку [3] => рак за руку грека цап ) [MULTIPLE] => Y [MANDATORY] => N [XML_ID] => )
Ключи:
|
Для поля также доступен js-интерфейс получения и установки значения:
Вызов метода:
BX24.placement.call('getValue', function(value){console.log(value)});
Результат выполнения метода:
["ехал грека через реку", "видит грека в реке рак", "cунул грека руку в реку", "рак за руку греку цап"]
Вызов метода:
BX24.placement.call('setValue', ["ехал грека через реку", "видит грека в реке рак", "cунул грека руку в реку", "рак за руку греку цап"], function(){console.log('value set')});
Результат выполнения метода:
value set
Нужно учитывать, что js-интерфейс служит исключительно для передачи данных в форму. Пока форма тем или иным способом не будет сохранена пользователем, значение в базу не попадет.
Демо-приложение, которое регистрирует обычное текстовое поле со своим интерфейсом ввода и вывода. Скачать
При разработке локальных или публичных тиражных решений для облачного Битрикс24 возможно разработать интеграцию практически любого уровня сложности, учитывая требования ваших клиентов.
И если ваше тиражное приложение стало популярным, вы можете не волноваться, хватит ли вам мощностей для его работы.
REST API позволяет сделать очень многое, т.к. имеет более 30 мест встройки и в ближайшее время, с выходом функционала Базы знаний, их станет более 100.
Рассмотрим новую встройку REST_APP_URI. Она отличается тем, что не имеет ни кнопки в Битрикс24, ни фрейма среди контента Битрикс24, как, например, [dw]Пользовательские типы полей[/dw][di]Когда открывается форма, допустим, карточка лида в CRM, в которой выводится поле нашего пользовательского типа, то в карточке, фактически, выводится фрейм с приложением. В этот фрейм передаются все данные о поле, значении и режиме работы. Для приложения все выглядит так, как если бы оно было открыто в месте встройки с идентификатором USERFIELD_TYPE.
Подробнее...[/di] в карточках CRM.
Как работать с этой встройкой?
Регистрируется она, как и любая другая, методом [dw]placement.bind[/dw][di] [/di]. Вы указываете путь до своего обработчика и можете использовать её на портале. Для использования разместите в любом месте портала ссылку на эту встройку. Ссылка выглядит так: /marketplace/view/#appCode#/
где #appCode#
- это код вашего приложения. Приложение может быть как локальным, так и тиражным решением.
Главный плюс этой встройки в том, что код уникален для всех порталов. В отличие от других видов встроек, когда у каждой свой ID и поэтому сложно использовать пути для них.
В примере на рисунке выше использованы ВВ-коды для добавления ссылки в пост Живой ленты. Выглядеть это будет так:
И если вы нажмете на uri в этом посте, то откроется слайдер с вашим обработчиком:
Обратите внимание на PLACEMENT_OPTIONS
. В его значении указано test=y
. Это как раз тот [dw]test=y[/dw][di][/di], который при указании встройки мы добавили в параметры ссылки.
Это и является ключевой особенностью этой встройки - что благодаря использованию GET-параметра params
можно передавать во встройку любые параметры, не ограничиваясь ничем, кроме правил формирования URL.
Такая особенность позволяет применять эту встройку во множестве вариантов.
Например, вы можете добавить комментарий (в Живую ленту, в чат, в задачу) со ссылкой, в которой будет ID задачи. И при нажатии на ссылку пользователю откроется слайдер с контекстом задачи. Или же можно подготовить ссылку для добавления в новых лидах, в рассылке ботами, в других местах.
Скорее всего, вы найдете и множество других полезных применений для встройки REST_APP_URI.
Битрикс24 существует как в виде облачного сервиса, так и в виде коробочных установок на стороне клиента.
Преимущество приложений на REST в том, что они могут работать и там, и там одинаковым образом, особенно, если при разработке приложения заранее учитывать некоторые нюансы, которые могут возникнуть.
В облачном Битрикс24 всегда доступен REST "самой последней версии". Однако бывает, что обновления для коробочной версии выходят через некоторое время после появления в облаке, в связи с тем, что коробочный Битрикс24 содержит дополнительный функционал, на тестирование совместимости с которым требуется дополнительное время.
Более того, в случае с конкретной коробочной установкой нет гарантии, что владелец установил последние доступные обновления и в целом установил нужные для приложения модули Битрикс24 (например, никто не мешает в коробочном Битрикс24 совсем отключить модуль телефонии). А значит, при установке приложения нет уверенности в доступности конкретных методов REST.
Поэтому рекомендация номер 1 - в скрипте установки своего решения проверяйте перечень доступных методов и событий, обращаясь к методам methods и events, и информируйте пользователя о том, что ему нужно поставить обновления на Битрикс24
Если ваше приложение возобновляет токены авторизации при помощи refresh_token, то есть два варианта: получать новую пару токенов, делая запрос к
xxx.bitrix24.xxx/oauth/token/?grant_type=authorization_code...либо к серверу авторизации
oauth.bitrix.info/oauth/token/?grant_type=authorization_code...В случае облачного Битрикс24 одинаково хорошо сработают оба варианта, поскольку облачный Битрикс24 просто будет "прокидывать" ваш запрос к реальному серверу авторизации, однако коробочный Битрикс24 этого может и не сделать.
Поэтому рекомендация номер 2 - для обновления токенов всегда обращайтесь только напрямую к серверу авторизации. Это будет работать и для облака, и для коробки.
Обращаясь к REST-методам, ваше приложение выполняет запрос к конкретному Битрикс24. Однако события REST в любом случае проходят в ваше приложение не напрямую из конкретного Битрикс24, а через очередь событий, которая находится в облаке, даже если речь идет о коробочном Битрикс24.
Возможна ситуация, когда владелец коробочного Битрикс24 по каким-то соображениям закрыл сетевой доступ к серверу очереди событий. В этом случае, события просто не будут работать. Если вы внедряете решение, общаясь с клиентом, то нужно рекомендовать внести адрес сервера очередей в белый список.
То же самое касается и сервера авторизации. Если сетевой доступ к нему закрыт, то REST работать в коробочном Битрикс24 не будет, поскольку коробочный Битрикс24 не сможет валидировать токен, с которым к нему обращается ваше приложение.
Есть альтернативный вариант, когда вы специально для конкретного клиента на стороне его коробочного Битрикс24 подключите свой механизм авторизации и событий. Подробнее о таком способе было рассказано в докладе Максима Сидоренко:
Работа приложений в коробочном Битрикс24, закрытом от внешней сети.
Политика безопасности компаний может иметь самые разные ограничения для внутренних и внешних сетевых ресурсов, из-за чего приложения на REST для Битрикс24 не всегда могут "достучатся" до коробочного Битрикс24 или внешних облачных сервисов. Тем не менее, существует решение, которое позволяет разрабатывать приложения на стандартном REST API для Битрикс24 даже в таких случаях.
В работе Rest-приложения есть три момента, когда происходит обращение из портала во вне:
1 - Валидатор авторизации
2 - Провайдер авторизации
3 - Провайдер событий
Рассмотрим способы, которые позволят избежать обращений к внешним ресурсам.
Создадим свой обработчик событий
<?php namespace Demo\AuthProvider; class AuthSimple { const AUTH_TYPE = 'demo_simple'; const AUTH_PARAM_NAME = 'secret_word'; const AUTH_PARAM_VALUE = 'MySuperSecurePassword123456'; public static function onRestCheckAuth(array $query, $scope, &$res) { if(array_key_exists(static::AUTH_PARAM_NAME, $query)) { $res = array('error' => 'INVALID_CREDENTIALS', 'error_description' => 'Invalid request credentials'); return false; } return null; } }
На вход валидатор получает все полные данные запроса приложения. Если в запросе нет параметра secret_word
, то он отвечает return null
, то есть: "не мой запрос". Если этот параметр в запросе присутствует, то обработчик проверяет запрос по значению. Если значение существует, но не соответствует сохранённому, то в ответ сообщается: "да, запрос мой, но неверное значение". Если значение верное, то он сообщает ID пользователя, список доступных скоупов, указывает, какие параметры нужно удалить, прежде чем отдавать запрос разработчику, и сообщает идентификатор типа авторизации, так как некоторые методы имеют ограничение по типам авторизации.
После этого обработчиком вызывается метод модуля REST, который авторизует на данном хите пользователя. Если всё прошло хорошо, то возвращается true.
Отнаследуем оригинальный класс провайдера событий и укажем что он реализует интерфейс провайдера событий. В своём классе мы переопределим только одну функцию send, которая и занимается отправкой. В данном примере покажем, как в случае необходимости вызвать внешний обработчик мы вместо обращения к внешней очереди событий, будем выполнять прямой http-запрос обработчика ($http->post(...)
)
<?php namespace Demo\AuthProvider; use Bitrix\Rest\Event\ProviderInterface; use Bitrix\Rest\Event\ProviderOAuth; use Bitrix\Rest\Event\Sender; class EventProvider extends ProviderOAuth implements ProviderInterface { public static function onEventManagerInitialize() { Sender::setProvider(static::instance()); } public function send(array $queryData) { $http = new \Bitrix\Main\Web\HttpClient(); foreach($queryData as $key => $item) { if($this->checkItem($item)) { $http->post($item['query']['QUERY_URL'], $item['query']['QUERY_DATA']); unset($queryData[$key]); } } if(count($queryData) > 0) { parent::send(array_values($queryData)); } } protected function checkItem(array $item) { return AuthProvider::instance()->checkClient($item['client_id']); } }
В обработчике проверяется весь массив вызова событий на предмет того, наше ли это приложение и наш ли обработчик. Если это не наше приложение, то запрос будет переадресован родительскому классу, если наше, то на этом же хите будет совершён post запрос к приложению. Затем зарегистрируем новый провайдер событий в качестве основного и вызовем событие.
Самая сложная часть.
Принцип прежний: отнаследуется оригинальный класс провайдера и создастся свой класс провайдера, реализующий нужный нам альтернативный интерфейс провайдера авторизации.
<?php namespace Demo\AuthProvider; use Bitrix\Main\Context; use Bitrix\Main\NotImplementedException; use Bitrix\Main\ObjectNotFoundException; use Bitrix\Main\Security\Random; use Bitrix\Rest\Application; use Bitrix\Rest\AppTable; use Bitrix\Rest\AuthProviderInterface; use Bitrix\Rest\OAuth\Provider; use Bitrix\Rest\RestException; class AuthProvider extends Provider implements AuthProviderInterface { const TOKEN_TTL = 3600; const TOKEN_PREFIX = 'demo.'; protected $applicationList = array(); /** * @var AuthProvider */ protected static $instance = null; /** * @var AuthStorageInterface */ protected $storage; /** * @return AuthProvider */ public static function instance() { if(static::$instance === null) { static::$instance = new static(); } return static::$instance; } public static function onApplicationManagerInitialize() { Application::setAuthProvider(static::instance()); } public function get($clientId, $scope, $additionalParams, $userId) { if(!$this->checkClient($clientId)) { return parent::get($clientId, $scope, $additionalParams, $userId); } if($userId > 0) { $applicationData = AppTable::getByClientId($clientId); if($applicationData) { $authResult = array( 'access_token' => $this->generateToken(), 'user_id' => $userId, 'client_id' => $clientId, 'expires' => time() + static::TOKEN_TTL, 'expires_in' => static::TOKEN_TTL, 'scope' => $applicationData['SCOPE'], 'domain' => Context::getCurrent()->getServer()->getHttpHost(), 'status' => AppTable::STATUS_LOCAL, 'client_endpoint' => \CRestUtil::getEndpoint(), 'member_id' => \CRestUtil::getMemberId(), ); $this->store($authResult); return $authResult; } else { $authResult = array('error' => RestException::ERROR_OAUTH, 'Application not installed'); } return $authResult; } return false; } public function authorizeClient($clientId, $userId, $state = '') { if(!$this->checkClient($clientId)) { return parent::authorizeClient($clientId, $userId, $state); } throw new NotImplementedException('Full OAuth authorization is not implemented in this demo'); } public function checkClient($clientId) { return in_array($clientId, $this->applicationList); } protected function store(array $authResult) { $this->getStorage()->store($authResult); } public function checkToken($token) { return substr($token, 0, strlen(static::TOKEN_PREFIX)) === static::TOKEN_PREFIX; } protected function generateToken() { return static::TOKEN_PREFIX.Random::getString(32); } /** * @return AuthStorageInterface * @throws ObjectNotFoundException */ public function getStorage() { if($this->storage === null) { throw new ObjectNotFoundException('No token storage set. Use '.__CLASS__.'::instance()->setStorage().'); } return $this->storage; } /** * @param AuthStorageInterface $storage * @return AuthProvider */ public function setStorage(AuthStorageInterface $storage) { $this->storage = $storage; return $this; } /** * @param string $clientId * @return AuthProvider */ public function addApplication($clientId) { $this->applicationList[] = $clientId; return $this; } }
Основной метод - метод get, который служит для выдачи авторизации приложению. Метод получает на вход приложение, которое "затребовало" авторизацию и проверяет, является ли это приложение тем самым, которое мы хотим "пустить в обход" стандартного механизма авторизации. Далее получаются данные о приложении и формируется структура, схожая со структурой, которую получают все приложения от стандартного OAuth-сервера Битрикс24. В массиве:
Далее эти данные сохраняются на портале. Далее сформированная структура возвращается.
Дополнительные методы
|
---|
Метод сохранения куда либо. protected function store(array $authResult) { $this->getStorage()->store($authResult); } Метод генерации токена. Берётся строка случайных 32-х символов, снабжается префиксом. protected function generateToken() { return static::TOKEN_PREFIX.Random::getString(32); } Метод проверки токена. Проверяется наличие префикса. public function checkToken($token) { return substr($token, 0, strlen(static::TOKEN_PREFIX)) === static::TOKEN_PREFIX; } Метод проверки клиента (приложения), где проверяется, что приложение входит в некий разрешённый список. public function checkClient($clientId) { return in_array($clientId, $this->applicationList); } |
Далее регистрируем наш провайдер в качестве текущего провайдера авторизации:
\Bitrix\Rest\Application::setAuthProvider( Demo\AuthProvider\AuthProvider::instance() );
Если теперь совершить запрос с этим авторизационным токеном и вызвать метод \Bitrix\Rest\AppInfo, то мы получим данные приложения в текущем Битрикс24:
Делаем свой валидатор авторизации.
<?php namespace Demo\AuthProvider; use Bitrix\Rest\OAuth\Auth; class AuthFull extends Auth { protected static function check($accessToken) { if(!AuthProvider::instance()->checkToken($accessToken)) { return parent::check($accessToken); } $authResult = AuthProvider::instance()->getStorage()->restore($accessToken); if($authResult === false) { $authResult = array('error' => 'invalid_token', 'error_description' => 'Token expired or invalid'); } return $authResult; } }
В валидаторе достаточно отнаследоваться от оригинального валидатора авторизации и переопределить у него функцию check, которая и занимается проверкой accessToken
. Если проверка прошла, то происходит восстановление приложения из хранилища. Затем регистрируем обработчик события, выполнив код на портале один раз:
\Bitrix\Main\EventHandler::getInstance() ->registerEventHadler( "rest", "onRestCheckAuth", "demo.authprovider", "\\Demo\\AuthProvider\\AuthFull", "onRestCheckAuth", 90 );
Последний параметр - сортировка. Необходимо встроиться до того, как сработает оригинальный обработчик.
Если теперь совершить запрос с этим авторизационным токеном и вызвать метод \Bitrix\Rest\AppInfo
, то можно получить данные приложения на этом портале.
Осталось только дополнить провайдер событий, чтобы передавать приложению авторизационные данные в обработчики событий:
if($item['additional']['sendAuth']) { $item['query']['QUERY_DATA']['auth'] = AuthProvider::instance()->get( $item['client_id'], '', $item['auth'], $item['auth'][AuthFull::PARAM_LOCAL_USER] ); }
Полный код провайдера событий
|
---|
<?php namespace Demo\AuthProvider; class AuthSimple { const AUTH_TYPE = 'demo_simple'; const AUTH_PARAM_NAME = 'secret_word'; const AUTH_PARAM_VALUE = 'MySuperSecurePassword123456'; public static function onRestCheckAuth(array $query, $scope, &$res) { if(array_key_exists(static::AUTH_PARAM_NAME, $query)) { if($query[static::AUTH_PARAM_NAME] === static::AUTH_PARAM_VALUE) { $error = false; $res = array( 'user_id' => 1, 'scope' => implode(',', \CRestUtil::getScopeList()), 'parameters_clear' => array(static::AUTH_PARAM_NAME), 'auth_type' => static::AUTH_TYPE, ); if(!\CRestUtil::makeAuth($res)) { $res = array('error' => 'authorization_error', 'error_description' => 'Unable to authorize user'); $error = true; } return !$error; } $res = array('error' => 'INVALID_CREDENTIALS', 'error_description' => 'Invalid request credentials'); return false; } return null; } } |
В результате обработчик получит полную структуру данных, которые ему требуются для работы.
Небольшое замечание по поводу производительности. Код, добавленный в провайдер событий в нашем примере выше, выполняется непосредственно в обработчике события. В коде есть post запрос к стороннему серверу. Следовательно, если сторонний сервер "тормозит", то будет "тормозить" и весь портал. Если производится какая-то массовая операция, например: импорт данных в CRM, то этот код серьёзно может замедлить работу портала.
Обойти эту проблему производительности можно двумя способами:
При создании собственных приложений для коробочных редакций возникает потребность в добавлении новых методов для них в REST API.
Порядок действий:
return array( 'имя_scope' => array( 'имя_метода' => array( 'callback' => обработчик_метода, 'options' => array(), ), 'имя_метода' => array( 'callback' => обработчик_метода, 'options' => array(), ), ) );
Имя scope - произвольное. Если регистрируется собственный scope, то он будет доступен в списке разрешений для локальных приложений. Для добавления методов в существующий scope, укажите имя метода. Если добавляются методы, доступные всем приложениям, то вместо имени указывается константа \CRestUtil::GLOBAL_SCOPE
.
Имя метода также произвольное, допускается использование как верхнего, так и нижнего регистра. Но рекомендуется придерживаться нижнего регистра. Традиционное именование - имя_scope.имя_сущности.действие.
Обработчик метода - стандартный PHP псевдо-тип callback. Анонимные функции пока не поддерживаются.
Если требуется указать HTTP-статус ошибки, то воспользуйтесь классом \Bitrix\Rest\RestException
. Если при этом ранее ядром было сгенерировано старое исключение ($APPLICATION->ThrowException()), то оно перезапишет ошибку в ответе.
Пример:
class RestTest { public static function OnRestServiceBuildDescription() { return array( 'sigurdtest' => array( 'sigurdtest.test' => array( 'callback' => array(__CLASS__, 'test'), 'options' => array(), ), ) ); } public static function test($query, $n, \CRestServer $server) { if($query['error']) { throw new \Bitrix\Rest\RestException( 'Message', 'ERROR_CODE', \CRestServer::STATUS_PAYMENT_REQUIRED ); } return array('yourquery' => $query, 'myresponse' => 'My own response'); } } AddEventHandler('rest', 'OnRestServiceBuildDescription', array('\RestTest', 'OnRestServiceBuildDescription'));
http://cp.sigurd.bx/rest/sigurdtest.test?auth=qcdfzzjtp8hvcbjl42eg93wuw5n0mvsb&test=222 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { "result": { "myresponse": "My own response", "yourquery": { "test": "222" } } } http://cp.sigurd.bx/rest/sigurdtest.test.xml?auth=qcdfzzjtp8hvcbjl42eg93wuw5n0mvsb&error=1 HTTP/1.1 402 Payment Required Content-Type: text/xml; charset=utf-8 <?xml version="1.0" ?> <response> <error>ERROR_CODE</error> <error_description>Message</error_description> </response>
Для этого используйте событие onFindMethodDescription, вызываемое перед отдачей ошибки METHOD_NOT_FOUND
. Оно позволяет подставить описание метода "на лету".
\Bitrix\Main\Loader::includeModule('rest'); class ApiTest extends \IRestService { public static function OnRestServiceBuildDescription() { return array( 'apitest' => array( 'api.test.list' => array( 'callback' => array(__CLASS__, 'getList'), 'options' => array(), ), ) ); } public static function getList($query, $nav, \CRestServer $server) { $navData = static::getNavData($nav, true); $res = \Bitrix\Main\UserTable::getList( [ 'filter' => $query['filter']?:[], 'select' => $query['select']?:['*'], 'order' => $query['order']?:['ID' => 'ASC'], 'limit' => $navData['limit'], 'offset' => $navData['offset'], 'count_total' => true, ] ); $result = array(); while($user = $res->fetch()) { $result[] = $user; } return static::setNavData( $result, array( "count" => $res->getCount(), "offset" => $navData['offset'] ) ); } } AddEventHandler('rest', 'OnRestServiceBuildDescription', array('\ApiTest', 'OnRestServiceBuildDescription'));
На примере ORM-класса работы с пользователями показывается как зарегистрировать свой метод для работы с таблицами пользователей. Если вам необходимо сделать постраничную навигацию для методов не ORM-классов, например, для getNavData(), то вторым параметром передайте: false ($navData = static::getNavData($nav, false);)
, тогда вернётся навигация соответствующая методам старого ядра.
Пример запроса:
/rest/api.test.list?order[ID]=ASC&filter[<ID]=1000&select[]=ID&select[]=NAME&start=200
OAuth - открытый протокол авторизации, который позволяет предоставить третьей стороне ограниченный доступ к защищенным ресурсам пользователя без необходимости передавать ей (третьей стороне) логин и пароль.
Как работает протокол
Протокол очень распространён, используется огромным количеством сервисов по всему миру, поскольку позволяет приложению получить доступ к API от имени конкретного пользователя конкретного портала.
Для OAuth-сервера авторизация - это указание на то, что пользователь дал доступ приложению. Приложение предоставляет свой секрет. Портал это всё объединяет и выдаёт приложению соответствующий тип доступа.
Протокол состоит из двух шагов:
access_token
- параметр, который собственно требуется для доступа к авторизации и refresh_token
- токен, который требуется для продления авторизации. refresh_token
и выданный вместе с ним access_token
становятся недействительными. Для доступа к REST API следует использовать новый полученный access_token
, а для продления доступа - новый refresh_token
.code
составляет всего 30 секунд, то есть, он должен быть использован сразу после получения.
Общий порядок работы с OAuth
В качестве сервера данных и держателя пользовательской авторизации выступает конкретный Битрикс24. В качестве держателя авторизации приложения служит сервер авторизации, доступный по адресу https://oauth.bitrix.info/.
Полный сценарий OAuth-авторизации проходит в несколько шагов:
Авторизация пользователя в Битрикс24.
Приложение запрашивает у пользователя адрес Битрикс24 и переадресует его на специально сформированный URL, например, такой:
https://portal.bitrix24.com/oauth/authorize/?
client_id=app.573ad8a0346747.09223434
&state=JJHgsdgfkdaslg7lbadsfg
Параметры:
По данной ссылке пользователю будет выведена форма авторизации. После авторизации (либо при наличии авторизованной сессии), если приложение с переданным client_id установлено на портале, портал вернет пользователя на redirect_uri приложения. Если же приложение на портал не установлено, пользователю будет выведено соответствующее сообщение об ошибке.
Итогом успешной пользовательской авторизации должен стать возврат пользователя на зарегистрированный адрес приложения с дополнительными параметрами:
https://www.applicationhost.com/application/?
code=avmocpghblyi01m3h42bljvqtyd19sw1
&state=JJHgsdgfkdaslg7lbadsfg
&domain=portal.bitrix24.com
&member_id=a223c6b3710f85df22e9377d6c4f7553
&scope=crm%2Centity%2Cim%2Ctask
&server_domain=oauth.bitrix.info
Параметры:
Авторизация приложения
Получив тем или иным способом первый авторизационный код code, приложение должно совершить второй шаг OAuth-авторизации и сделать скрытый от пользователя запрос вида:
https://oauth.bitrix.info/oauth/token/?
grant_type=authorization_code
&client_id=app.573ad8a0346747.09223434
&client_secret=LJSl0lNB76B5YY6u0YVQ3AW0DrVADcRTwVr4y99PXU1BWQybWK
&code=avmocpghblyi01m3h42bljvqtyd19sw1
Параметры (все - обязательны):
В ответ на такой запрос приложение получит json следующего содержания:
GET /oauth/token/ HTTP/1.1 200 OK Content-Type: application/json { "access_token": "s1morf609228iwyjjpvfv6wsvuja4p8u", "client_endpoint": "https://portal.bitrix24.com/rest/", "domain": "oauth.bitrix.info", "expires_in": 3600, "member_id": "a223c6b3710f85df22e9377d6c4f7553", "refresh_token": "4f9k4jpmg13usmybzuqknt2v9fh0q6rl", "scope": "app", "server_endpoint": "https://oauth.bitrix.info/rest/", "status": "T" }
Значимые параметры:
Также на этом этапе приложение может получить ошибку авторизации, если, например, истек пробный или оплаченный период.
{ "error": "PAYMENT_REQUIRED", "error_description": "Payment required" }
Простейшим сценарием для получения доступа к REST API является работа приложения в интерфейсе Битрикс24. В этом случае все необходимые авторизационные данные выдаются приложению при открытии, а также доступна возможность использования js-библиотеки для совершения вызовов к API.
Приложение получает следующий массив POST-данных:
array ( 'DOMAIN' => 'portal.bitrix24.com', // домен портала 'PROTOCOL' => '1', // протокол обращения: 0 - http, 1 - https 'LANG' => 'ru', // текущий язык, на котором пользователь просматривает портал 'APP_SID' => 'dd8cec11e347088fe87c44870a9f1dba', // служебный параметр для связи js-библиотеки с окружением приложения 'AUTH_ID' => 'ahodg4h37n89vo17gbkgq0x1l825nnb5', // основной авторизационный токен, требуемый для доступа к REST API 'AUTH_EXPIRES' => '3600', // время жизни авторизационного токена 'REFRESH_ID' => '2lg086mxijlpvwh0h7r4nl19udm4try5', // дополнительный авторизационный токен, служащий для продления сохраненной авторизации 'member_id' => 'a223c6b3710f85df22e9377d6c4f7553', // уникальный идентификатор портала, не зависящий от доменного имени 'status' => 'P', // статус приложения на портале. значение поля служит чисто для информации, чтобы получить доверенное значение, используйте метод oauth.bitrix.info/rest/app.info )
При помощи значения параметра AUTH_ID можно сразу совершать запросы к API.
И как написано выше, приложения в интерфейсе могут совершать запросы к API на стороне клиента, то есть браузера пользователя, подключив js-библиотеку и используя методы BX24.callMethod и BX24.callBatch. В этом случае работа с авторизацией будет происходить автоматически.
Таким образом, становится доступным простой сценарий получения авторизационных токенов пользователя при установке приложения. Как вы знаете (это было продемонстрировано в соответствующем примере раздела "Быстрый старт"), у публичного тиражного решения существует возможность задать отдельный скрипт установки, который будет показываться пользователю, устанавливающему ваше решение, во фрейме один раз - в момент установки решения. И в этот фрейм Битрикс24 передает те же самые данные в POST-запросе, что и в обычном случае. Следовательно, вы можете так разработать скрипт установки, чтобы сохранять токены (что самое важное - refresh_token в том числе) на стороне своего приложения, чтобы в дальнейшем реализовать сценарий автоматического возобновления токенов.
Для приложений, не имеющих страницы в интерфейсе Битрикс24 (параметр Использует только API в форме редактирования приложения в партнерском кабинете или на портале), доступен вот такой способ авторизации. В форме редактирования версии (или в форме редактирования локального приложения на портале) можно указать значение параметра Ссылка-callback для события установки. Если указать в этом поле ссылку на обработчик на стороне приложения, то при установке приложения обработчик получит POST-запрос со следующими данными (application/x-www-form-urlencoded
):
array( 'event' => 'ONAPPINSTALL', 'data' => array( 'VERSION' => '1', 'LANGUAGE_ID' => 'ru', ), 'ts' => '1466439714', 'auth' => array( 'access_token' => 's6p6eclrvim6da22ft9ch94ekreb52lv', 'expires_in' => '3600', 'scope' => 'entity,im', 'domain' => 'portal.bitrix24.com', 'server_endpoint' => 'https://oauth.bitrix.info/rest/', 'status' => 'F', 'client_endpoint' => 'https://portal.bitrix24.ru/rest/', 'member_id' => 'a223c6b3710f85df22e9377d6c4f7553', 'refresh_token' => '4s386p3q0tr8dy89xvmt96234v3dljg8', 'application_token' => '51856fefc120afa4b628cc82d3935cce', ), )
Поля запроса содержат информацию о событии (event), данные события (data), а также, авторизационные данные для доступа к REST API (auth) от имени пользователя, установившего приложение.
Значимые параметры:
Смотри События
Сохранив на своей стороне значение токена продления авторизации refresh_token, приложение может в дальнейшем использовать его для получения доступа к REST API уже без участия пользователя. Время жизни refresh_token - 28 дней или до первого использования.
В любой момент до истечения refresh_token приложение может совершить следующий запрос:
https://oauth.bitrix.info/oauth/token/?
grant_type=refresh_token
&client_id=app.573ad8a0346747.09223434
&client_secret=LJSl0lNB76B5YY6u0YVQ3AW0DrVADcRTwVr4y99PXU1BWQybWK
&refresh_token=nfhxkzk3gvrg375wl7u7xex9awz6o3k8
Параметры (все - обязательные):
В ответ приложение получит json следующего вида:
GET /oauth/token/ HTTP/1.1 200 OK Content-Type: application/json { "access_token": "ydtj8pho532wydb5ixk78ol7uqlb7sch", "client_endpoint": "http://portal.bitrix24.com/rest/", "domain": "oauth.bitrix.info", "expires_in": 3600, "member_id": "a223c6b3710f85df22e9377d6c4f7553", "refresh_token": "3s6lr4kr3cv2od4v853gvrchb875bwxb", "scope": "app", "server_endpoint": "http://oauth.bitrix.info/rest/", "status": "T" }
Значимые параметры:
Также на этом этапе приложение может получить ошибку авторизации, если, например, истек пробный или оплаченный период, или приложение было удалено с портала.
{ "error": "PAYMENT_REQUIRED", "error_description": "Payment required" }
Если сценарий вашего приложения требует постоянного фонового обмена данными с Битрикс24 без участия пользователя, то необходимо продумать хранение refresh-токенов и механизм их использования. Как уже было указано выше, refresh_token сохраняет свою актуальность в течение 28 дней. Это значит, что если ваше приложение по каким-то причинам не обращается к Битрикс24 чаще "само по себе" для реализации функционала приложения, то вам достаточно раз в 28 дней обращаться к серверу авторизации, только чтобы обновить сохраненные токены.
Мы сталкивались со случаями, когда разработчики приложений "на всякий случай" перед каждым обращением к REST сначала "дергали" сервер авторизации для обновления токена. Это неправильный сценарий, создающий лишнюю нагрузку. Тоже самое касается сценариев с автоматическим "обновлением токенов" раз в час, или раз в сутки - это лишнее.
Если вы сохраняете пару токенов - access_token и refresh_token - на стороне приложения, то вы просто делаете запрос к REST, указав сохраненный access_token (предположим, что вы, сохранив access_token, не сохранили дату и время его "протухания"). Если токен уже неактуален, в ответ вы получите соответствующую ошибку. Вот в этот момент надо сделать запрос с сохраненным refresh_token на сервер авторизации для получения нового access_token, и получив в ответ оба новых токена - сохранить их на стороне приложения, а затем выполнить свой REST запрос с новым access_token
Например, если ваше решение интегрирует Битрикс24 с внешней телефонией и вы пользуетесь методами telephony.externalcall.register и telephony.externalcall.finish, которые добавляют в том числе лиды в CRM, но при этом не обращаетесь явно к методам CRM вроде crm.lead.add и crm.activity.add, то SCOPE telephony вам нужен, а вот SCOPE crm - нет.
|
Интерактивность в приложениях доступна с версии 18.5.500 модуля Push & Pull.
Благодаря подключению к RT-серверам вы сможете:
Если вы создаёте своего клиента, то ознакомьтесь со Схемой работы с Push & Pull server. Если вам нужно только добавить интерактивность в существующее приложение, то почитайте про Работу с Push & Pull в рамках браузера
Рассмотрим как работать со штатным Push & Pull клиентом в рамках приложения. Пример страницы для приложения с веб-интерфейсом:
<!DOCTYPE html> <html> <head> <title>Bitri24 application with Push & Pull</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="//api.bitrix24.com/api/v1/"></script> <script src="//api.bitrix24.com/api/v1/pull/"></script> </head> <body> <script> window.appPullClient = new BX.PullClient({ restApplication: 'myApplication_test.bitrix24.ru', restClient: BX24, userId: 1 }); window.appPullClient.subscribe({ moduleId: 'application', callback: function (data) { console.warn(data); // {command: '...', params: {...}, extra: {...}} }.bind(this) }); window.appPullClient.start(); </script> </body> </html>
При инициализации BX.PullClient необходимо указать следующие параметры:
Если веб-страницу у вас создаёт "1С-Битрикс: Управление сайтом" и вашу редакцию входит модуль Push & Pull, рекомендуется вместо подключения:
<script src="//api.bitrix24.com/api/v1/pull/"></script>
[dw]подключать встроенную библиотеку[/dw][di]Минимальная версия модуля pull 18.5.500[/di] через:
\Bitrix\Main\UI\Extension::load("pull.client");
Подключение PullClient позволит front-end вашего приложения получать события из канала, которые туда будет отправлять back-end вашего же приложения при помощи метода pull.application.event.add.
Если вам необходимо написать свой собственный клиент, то читайте дальше. Если вам не нужен новый клиент, а нужно просто добавить функционал интерактивности в уже существующее приложение, то читайте это.
С помощью подключения к RT-серверам создаётся действительно интерактивное приложение: меняется состояние приложения, мгновенно обновляется интерфейс без необходимости ajax запросов. Прочитать про технологию вы можете в курсе Администратор. Модули.
Для работы с сервисом есть два способа подключения: [ds]Long polling и websocket[/ds][di]Когда пользователь входит на сайт, его браузер, настольное или мобильное приложение устанавливают и держат постоянное соединение с Push-сервером.
Обычно это делается с помощью WebSocket , который используют 95% современных браузеров. А если технология WebSocket не поддерживается браузером, то используется Long Polling — постоянный долгий опрос.
Подробнее ...[/di].
Основным методом подключения рекомендуется использовать websocket. Long polling используется только для устройств у которых нет поддержки websocket, или если при подключении к websocket у клиента часто возникают проблемы.
Для получения данных о сервере и адресах подключения используйте REST команду pull.application.config.get
Для подключения к серверу, возьмите в настройках сервера (поле server) адрес подключения нужного типа (например, websocket_secure) и [dw]добавьте[/dw][di]Каналы перечисляются в GET параметре CHANNEL_ID.[/di] к нему все доступные каналы через /. В случае, если на портале используется облачный push-сервер, к URL'у для подключения к серверу необходимо добавить параметр clientId.
Пример подключения для websocket для коробочного push-сервера:
wss://rt.bitrix24.com/sub/?CHANNEL_ID=46a437d2336d4a88e4e9b3cd956ecf45:6221e0eb48981fce67cf4756e82e8102.7910bb25e660bf211fdec15e33c5e25e4c3b644a/fb9f7e13dc3d595c5aefe1a0216c27a2.2887eebc6ae160713a732893462dce9d8e23a7b0
Пример подключения для websocket для облачного push-сервера:
wss://rtc-cloud-ms1.bitrix.info/subws/?CHANNEL_ID=beb502091dfc9b93d7fd648aa4ec332e%3A7cc478c89de71ec78bf4820d3d814a3e.4f5466742ca1e59e263fee732a7dbe002889ba91%2F1ab4f7a440cea35a1abccd5c2566c688.b33914ef342e5cd21e4fbcf4ac92acd2e9ea3755&clientId=fcda45d0859442735f07b8bb5825ded1
Время работы каждого канала ограничено 12 часами. Необходимо отслеживать время окончания и делать повторный запрос к pull.application.config.get когда у одного из каналов завершилось время работы.
Для доступа к истории в канала к указанному выше адресу добавьте специальные get-метки: &tag=
и &time=
(для версии сервера 2 и ниже) или &mid=
(для версии 3 и выше). Все необходимые данные для get-меток вы получите при разборе каждой команды из канала. После подключения с данными метками, вам будут одноразово доступны сообщения, которые для текущей сессии не были доступны.
Для сервера версии 3 и ниже при поступлении команд, приходит текст вида:
#!NGINXNMS!#{"id":320146,"mid":"14526134350000000000320146","channel":"6221e0eb48981fce67cf4756e82e8102","tag":"672","time":"Thu, 29 Jun 2017 09:50:16 GMT","text":{...},"extra":{...}}}#!NGINXNME!# #!NGINXNMS!#{"id":320147,"mid":"14526134350000000000320147","channel":"6221e0eb48981fce67cf4756e82e8102","tag":"673","time":"Thu, 29 Jun 2017 09:50:17 GMT","text":{...},"extra":{...}}}#!NGINXNME!#
Для работы с командой, необходимо получить её содержимое и преобразовать в JSON. Текст команды располагается между управляющими фразами #!NGINXNMS!#
и #!NGINXNME!#
.
Начиная с версии сервера 4, используйте добавление GET-параметра &format=json
при подключении и при поступлении команд, он будет вам отдан в формате JSON:
[ {"id":320146,"mid":"14526134350000000000320146","channel":"6221e0eb48981fce67cf4756e82e8102","tag":"672","time":"Thu, 29 Jun 2017 09:50:16 GMT","text":{...},"extra":{...}}}, {"id":320147,"mid":"14526134350000000000320147","channel":"6221e0eb48981fce67cf4756e82e8102","tag":"673","time":"Thu, 29 Jun 2017 09:50:17 GMT","text":{...},"extra":{...}}} ]
JSON структура команды имеет следующий унифицированный вид:
{ "id" : 320146, "mid" : "14526134350000000000320146", "channel" : "6221e0eb48981fce67cf4756e82e8102", "tag" : "672", "time" :"Mon, 03 Oct 2017 06:36:01 GMT", "text" : { "module_id" : "main", "command" : "user_online", "params" : { ... }, "extra" : { "server_time": "2017-10-03T08:36:01+02:00", "server_time_unix": 1507012561, "server_time_ago": 0, 'revision': 16, 'revisionMobile': 1, "channel" : "6221e0eb48981fce67cf4756e82e8102" } }
Где:
Во время работы с сервером могут возникать разные ошибки. Во избежания блокировки за подозрительную активность важно правильно их обрабатывать.
Если подключение к серверу приводит к ошибкам, необходимо инкрементально увеличивать время подключения:
При работе с websocket при возникновении ошибок более 4х раз, рекомендуется переходить на работу с Long polling. Очень вероятна ситуации что на компьютере клиента заблокирована работа websocket протокола (код завершения websocket 1006 и 1008).
Полный переход на Long polling, имеет смысл если вы ни разу не смогли подключится по websocket, если ранее были успешные подключения то имеет смысл переключится временно на 10 - 30 минут.Для собственной реализации работы с протоколом Push & Pull предусмотрите обработку управляющих команд.
Команда об истечении времени работы канала.
{ "module_id" : "pull", "command" : "channel_expire", "params" : { "action" : "reconnect", "channel" : { "id" : "46a437d2336d4a88e4e9b3cd956ecf45.7910bb25e660bf211fdec15e33c5e25e4c3b644a", "type": "shared" }, "new_channel": { "id": "fb9f7e13dc3d595c5aefe1a0216c27a2.2887eebc6ae160713a732893462dce9d8e23a7b0", "start": "2017-06-28T09:57:48+02:00", "end": "2017-06-28T21:57:48+02:00", "type": "shared" } } }
Параметры
|
Описание работы с командой
При поступлении команды channel_expire
, в зависимости от значения action, выполните:
action == reconnect
, то данными из new_channel замените информацию о [dw]текущем канале[/dw][di]Информация о каком канале речь есть в channel[/di]. После чего переустановите подключение к серверу заново.action == get_config
, то отключитесь от сервера, запросите новые данные о каналах через REST pull.application.config.get. После чего установите подключение к серверу заново.Команда о изменении настроек сервера
{ "module_id" : "pull", "command" : "config_expire", "params" : {} }
Описание работы с командой
Если поступила команда config_expire или server_restart, то отключитесь от сервера, и через случайный промежуток времени (от 10 до 120 секунд), запросите новые данные о каналах через REST pull.application.config.get. После чего установите подключение к серверу заново.
REST API позволяет устанавливать свои обработчики событий в Битрикс24.
Обработчиком служит URL, который будет вызван после того, как пользователь произведет запрошенное действие в Битрикс24, на котором установлено приложение. Поскольку запросы будут идти с серверов Битрикс, то URL обработчика должен быть доступен для GET/POST запросов извне.
Надо учитывать, что Битрикс24 не вызывает ваши обработчики в реальном времени, а сначала формирует отдельную очередь событий, и в дальнейшем эту очередь обрабатывает. Возможна ситуация, когда обработчик получит вызов только через несколько секунд после реального события в Битрикс24. Если ваши обработчики "отвечают" медленно, то дальнейший их вызов может выполняться с пониженным приоритетом, а следовательно, с более длительными паузами.
Текущие адреса сервера.
Как работают события
Сначала приложение при помощи REST-метода event.bind устанавливает обработчик события. Под обработчиком события подразумевается URL, на который будет передана информация о том, что на портале произошло отслеживаемое событие.
Спустя какое-то время пользователь совершает какое-то действие (создаёт задачу, изменяет задачу и так далее). Битрикс24 автоматически уведомляет об этом приложение.
Подробнее механизм событий описан в справочнике REST
Приложение не в всегда в состоянии принимать события. Оно может скрываться за фаерволлами, жить во внутренней сети и т.д. В этом случае используется механизм офлайн-событий, когда приложение подписывается на события, но не указывает URL обработчика. Вместо этого приложение указывает, чтобы события копились в базе, пока оно само их не заберет.
Механизм офлайн события используется для работы со сторонними информационными системами. Например, текущая интеграция продукта с 1С целиком построена на офлайн событиях.
Отличительная особенность офлайн событий от обычных: если событие ещё не обработано, то его копии не создаются. Например: сделка изменена 5 раз. При использовании обычных событий - вызов обработчика выполнится 5 раз, а офлайн событий - оставит 1 запись в журнале об изменении сделки.
Записи в очереди аккумулируются по данным событий. Например, если в очереди уже ожидает событие ONCRMLEADUPDATE
для лида с ID=10, то следующее обновление лида 10 не добавит новую запись, а только изменит дату существующей.
В общем виде работы схемы очень проста. Офлайн событие попадает в очередь офлайн событий. Потом внешняя система забирает их из очереди и обрабатывает.
Есть две схемы работы этого механизма - простая и усложнённая. В простой схеме приложение просто подписывается на события и по мере надобности забирает "верхнюю" часть очереди. В усложнённой схеме приложение имеет возможность управлять разбором очереди, самостоятельно разделять записи на отработанные и требующие разрешения конфликта и т.д.
Технологический поток 21.05.2021: Преимущества офлайн-событий, или как использовать REST правильно
Для регистрации офлайн события используется метод /rest/event.bind со значением event_type=offline
. В этом случае параметр handler становится не обязательным, а параметр auth_type - бессмысленным.
Пример вызова:
https://myportal.bitrix24.com/rest/event.bind ?auth=0534845a0000cd7a0000cd5d00000001000003bc52a2dde6b58915beb0a09fcc57ed36 // ключ авторизации &event=ONCRMLEADUPDATE // название события &event_type=offline // тип события &auth_connector=OneC // ключ источника HTTP/1.1 200 OK { "result": true }Все основные параметры описаны в документации метода /rest/event.bind. На параметре &auth_connector остановимся немного подробнее.
&auth_connector=OneC
- ключ источника. Этот важный параметр отличает офлайн события от онлайн, т.к. позволяет исключать ложные срабатывания событий.
Что такое ложное срабатывание события
?. Рассмотрим на примере:
Пусть у нас есть Битрикс24 и 1С. В Битрикс24 зарегистрировано 2 события:
Создали компанию. Сработало событие, по которому компания попала в 1С. Затем в 1С компания была изменена посредством Rest и изменения попали в Битрикс24. В теории, должно сработать офлайн событие на обновление компании и снова попасть в 1С, что нелогично.
Для того, чтобы такие события не регистрировались используется параметр &auth_connector. Этот параметр нужно указывать не только при таком Rest запросе при регистрации офлайн события, но так же в любом Rest запросе, который выходит из учетной системы.
Таким образом это обязательный параметр для rest запросов из внешних систем:
Правильно
https://my.bitrix24.ru/rest/crm.company.add?auth=123456&auth_connector-OneC&fields[TITLE]=Test
Неправильно
https://my.bitrix24.ru/rest/crm.company.add?auth=123456&fields[TITLE]=Test
После вызова установки обработчика метод /rest/event.get выдает нам вот такую картину (обычный обработчик события добавлен для сравнения):
https://myportal.bitrix24.com/rest/event.get ?auth=0534845a0000cd7a0000cd5d00000001000003bc52a2dde6b58915beb0a09fcc57ed36 HTTP/1.1 200 OK { "result": [ { "connector_id": "", "event": "ONCRMLEADUPDATE", "offline": 1 }, { "auth_type": "0", "event": "ONCRMLEADUPDATE", "handler": "http://apphost.com/handler/", "offline": 0 } ] }
Для отписки от события используется тот же самый метод /rest/event.unbind, вызываемый с теми же параметрами, что и event.bind.
Далее происходит разбор очереди событий.
Если приложение вызывает метод /rest/event.offline.get, то портал отдаст первые 50 событий, удовлетворяющих фильтру и в заданном порядке сортировки, и сразу вычистит их из базы.
https://myportal.bitrix24.com/rest/event.offline.get ?auth=0534845a0000cd7a0000cd5d00000001000003bc52a2dde6b58915beb0a09fcc57ed36 HTTP/1.1 200 OK { "result": { "events": [ { "EVENT_ADDITIONAL": { "user_id": "1" }, "EVENT_DATA": { "FIELDS": { "ID": 28 } }, "EVENT_NAME": "ONCRMLEADUPDATE", "ID": "40", "MESSAGE_ID": "438d4ec3d329464c4bb9909db4c7a19b", "TIMESTAMP_X": "2018-02-14T14:20:19+02:00" } ], "process_id": null } }
|
Метод event.offline.get поддерживает многопоточный разбор. То есть допускается несколько параллельных запросов к методу (с соблюдением ограничений на количество запросов в единицу времени), и каждый из них получит разные наборы записей.
Основное отличие этой схемы от простой в том, что выбранные записи не удаляются из базы, а помечаются как обрабатываемые. Они продолжают оставаться в базе, пока приложение не оповестит об окончании их обработки. Если за время обработки появятся новые срабатывания события, то они будут добавлены в очередь как обычно, даже если запись о таком событии уже есть среди обрабатываемых. Другой поток обработки сможет получить сообщение об изменении.
Получение записей
Включается эта схема добавлением параметра clear=0
к вызову event.offline.get.
https://myportal.bitrix24.com/rest/event.offline.get ?auth=0534845a0000cd7a0000cd5d00000001000003bc52a2dde6b58915beb0a09fcc57ed36 &clear=0 HTTP/1.1 200 OK { "result": { "events": [ { "EVENT_ADDITIONAL": { "user_id": "1" }, "EVENT_DATA": { "FIELDS": { "ID": 28 } }, "EVENT_NAME": "ONCRMLEADUPDATE", "ID": "45", "MESSAGE_ID": "438d4ec3d329464c4bb9909db4c7a19b", "TIMESTAMP_X": "2018-02-14T14:43:13+02:00" } ], "process_id": "5xcvetmo5zm5li73qxnj8qu72e2qrxw8" } }
Обратите внимание на поле process_id в ответе. После такого вызова записи остаются в базе, но помечаются как обрабатываемые процессом с этим идентификатором. И далее не учитываются ни при каких последующих выборках и при добавлении новых событий.
После того, как записи выбраны, помечены как обрабатываемые и отданы приложению, приложение может какие-то из них удалить, какие-то пометить как ошибочные, какие-то оставить на потом.
Очистка записей
Очистка производится вызовом метода /rest/event.offline.clear, который принимает на вход process_id и массив идентификаторов записей, которые нужно удалить.
https://myportal.bitrix24.com/rest/event.offline.clear ?auth=0534845a0000cd7a0000cd5d00000001000003bc52a2dde6b58915beb0a09fcc57ed36 &process_id=5xcvetmo5zm5li73qxnj8qu72e2qrxw8 HTTP/1.1 200 OK { "result": true }
result.events[].ID
, а не result.events[].EVENT_DATA.FIELDS.ID
.Обработка ошибок
При создании сложных интеграций, для которых и предназначена усложнённая схема, вполне возможна ситуация, когда возникает конфликт данных различных систем. В этом случает требуется человеческий контроль или использование какого-то другого способа разрешения конфликтов. Чтобы при этом не стопорить процесс и не копить ошибки, некоторые записи о событиях можно оставлять в базе с пометкой об их ошибочности. Для этого используется метод /rest/event.offline.error.
https://myportal.bitrix24.com/rest/event.offline.error ?auth=4742845a0000cd7a0000cd5d0000000100000386a97f24a7f515e9ec5e242fed727af4 &process_id=cal3dm2qg31gb3g8uatca6huqjdtdn6u &message_id[]=438d4ec3d329464c4bb9909db4c7a19b HTTP/1.1 200 OK { "result": true }
После выставления флага об ошибке, помеченные записи перестанут отдаваться приложению при вызове event.offline.get. Перестают отдаваться как сама помеченная запись, так и все последующие срабатывания события с этими данными. Иными словами, изменения этой сущности на стороне Битрикс24 перестанут передаваться в приложение, пока приложение не даст разрешение на передачу. Также запись отвяжется от текущего процесса и не будет удалена при вызове event.offline.clear. Если за время обработки были срабатывания события с такими данными, они также передаются приложению, даже если уже были захвачены другим процессом.
Разрешение ошибок
Чтобы снять пометку об ошибке с записи, нужно вычистить ее из базы при помощи event.offline.get с указанием параметра error=1
. И при необходимости, с дополнительным фильтром, если нужно обработать только часть ошибок. Сразу после вызова ошибочные записи будут вычищены из базы (если указать clear=1
), либо помечены как обрабатываемые (если указать clear=0
). В обоих случаях новые события с такими данными снова начнут регистрироваться и отдаваться приложению.
Простое получение состояния очереди
Иногда может потребоваться считать текущую очередь, не внося изменений в ее состояние, как это делает event.offline.get, и не завися от сложной логики пометки ошибочных событий или раскидывания событий по процессам. Для этого сделан простой списочный метод /rest/event.offline.list:
https://myportal.bitrix24.com/rest/event.offline.list ?auth=4742845a0000cd7a0000cd5d0000000100000386a97f24a7f515e9ec5e242fed727af4 HTTP/1.1 200 OK { "result": [ { "ERROR": "0", "EVENT_ADDITIONAL": { "user_id": "1" }, "EVENT_DATA": { "FIELDS": { "ID": 28 } }, "EVENT_NAME": "ONCRMLEADUPDATE", "ID": "60", "MESSAGE_ID": "438d4ec3d329464c4bb9909db4c7a19b", "PROCESS_ID": "", "TIMESTAMP_X": "2018-02-14T15:34:34+02:00" }, { "ERROR": "0", "EVENT_ADDITIONAL": { "user_id": "1" }, "EVENT_DATA": { "FIELDS": { "ID": 27 } }, "EVENT_NAME": "ONCRMLEADUPDATE", "ID": "65", "MESSAGE_ID": "7bf367ea2e4c9b6a8c3adac4a416627c", "PROCESS_ID": "", "TIMESTAMP_X": "2018-02-14T15:34:55+02:00" } ] }
Есть два способа организовать работу с офлайн событиями в режиме реального времени: через обработчики (handler) и через Push&Pull сервер. Оба способа рассмотрим на примере интеграции с 1С.
Для работы через обработчики нужно зарегистрировать онлайн событие на добавление офлайн событий. Простыми словами: есть событие, которое сообщает о том, что в журнале офлайновых событий появились новые записи.
На примере интеграции с 1С это работает так: есть определенное приложение Битрикс24, которое дает токен и там же есть определенная страничка обработчика. Из 1С регистрируется событие на офлайн событие onOfflineEvent и когда появляется новая запись, это обрабатывает handler и он стучится в 1С. 1С понимает, что появились новые данные и выполняет event.offline.get, получает записи и обрабатывает их.
Пример вызова:
https://myportal.bitrix24.com/rest/event.bind ?auth=0534845a0000cd7a0000cd5d00000001000003bc52a2dde6b58915beb0a09fcc57ed36 // ключ авторизации &event=onOfflineEvent // добавление офлайн события &handler==http%3A%2F%2Fwww.my-domain.com%2Fhandler%2F // адрес обработчика
Минус такого способа: внешняя система (например, 1С) должна быть доступна снаружи, иначе обработчик не сможет до неё достучаться.
В случаях, когда безопасность критична, есть другой способ, через Push&Pull сервер.
Реализацию способа рассмотрим на примере интеграции с 1С, т.к. он разработан специально для неё.
Для получения информации о новых офлайн событиях используется открытый канал Push&Pull сервера, который всегда есть в каждом приложении Битрикс24. В таком варианте внешняя система сама подключается к Битрикс24 и ждёт от него сообщений. Как только приходит сообщение о новой записи, внешняя система забирает данные из очереди.
Для того, чтобы 1С могла подключиться, сначала она отправляет запрос методом pull.application.config.get. В результате получается ответ, из которого ей нужны: адрес до Push сервера, clientId (уникальный идентификатор портала на облачном push-сервере) и id открытого канала.
Пример ответа:
https://my.bitrix24.ru/rest/pull.application.config.get { "result":{ "server":{ "version": 4, "long_polling": "http://rt.bitrix24.com/sub/", "long_polling_secure": "https://rt.bitrix24.com/sub/", "clientId": "43253464643", ........... }, "channels":{ "shared":{ "id":"0d875ab13a17a97fc2f5", "start":"2017-06-28T12:04:00+02:00", "end":"2017-06-29T00:04:00+02:00", ........... } "private":{ ........... } } }
И после 1C подключается с этими данными и ожидает сообщения от push сервера:
https://rt.bitrix24.com/sub/ // адрес подключения к push серверу ?CHANNEL_ID=0d875ab13a17a97fc2f5 // идентификатор канала &clientId=43253464643 // идентификатор портала на облачном push сервере
Когда срабатывает какое-то офлайн событие и попадает в очередь, в push передается сообщение в формате json с указанием, что это офлайн событие и параметром connector_id, в котором указано для какой внешней системы предназначено сообщение.
#!NGINXNMS#{ ...... "text":{ "module_id":"rest", "command":"event_offline", "params":[ { "connector_id":"OneC", "count":1 } ], ...... } }
В случае использования коробочного Битрикс24, администратор сети компании должен учитывать в политике безопасности необходимость открытия доступа для входящих/исходящих запросов rest-приложений.
Для Битрикс24 необходимо открыть:
Если разработка приложения ведётся на своем сервере, необходимо открыть:
Пример запроса через curl:
$ curl https://dl.bitrix24.com/webhook/app.json { "nodes": ["195.208.184.200", "89.208.230.2"] }Полученный в ответе список IP-адресов в массиве nodes надо использовать для изменения правил фаервола для входящих коннектов в корпоративной сети или на коробочной ВМ.
Частота опроса вышеуказанного URI - максимум 1 раз в минуту, а лучше сделать раз в 5-10 минут. В механизме масштабирования пула ВМ будет предусмотрено, что за 5-10 минут до того, как с нового адреса начнут приходить веб-хуки, она уже будет присутствовать в списке nodes.
Дополнительные материалы, которые могут помочь вам в разработке ваших решений.
Приложения и интеграции работают с данными Битрикс24, и зачастую этих данных может оказаться очень много - если вы разрабатываете какую-то систему отчетности и аналитики, если вам нужно перенести в Битрикс24 или из Битрикс24 большой объем данных (нужно учитывать, что многие ваши потенциальные клиенты, использующие, в частности, CRM работают с десятками и сотнями тысяч клиентов) - вопрос устойчивой работы обмена данными встает очень остро.
Битрикс24, являясь облачным сервисом, должен обеспечивать работу всех пользовательских порталов независимо от того, какой обмен данными происходит в рамках тех или иных приложений. Поэтому при разработке своих решений, вы должны правильно решать вопросы производительности.
Для избежания блокировки приложения разработчикам рекомендуется:
Если решение создает аномальную нагрузку на портале и уходит в блокировку, то при очередном запросе отдается 503 ошибка или ошибка такого вида: 'error' => 'OVERLOAD_LIMIT'
, 'error_description' => 'REST API is blocked due to overload.'
Для решения проблемы с постраничными выборками с подсчетом количества в выборках данных разделов CRM, USERS и т.д. используется параметр start -1. Подробное решение проблемы описано в документации.
Для решения подобной проблемы в задачах параметр start -1 не работает, вместо него используется $params['COUNT_TOTAL']='N'
При частых выборках одних и тех же данных рекомендуем партнеру кешировать данные на своей стороне.
Разработка REST-приложений. Полезное. Сергей Востриков, Владислав Бажанов, «1С-Битрикс».
Вебинар от 21 мая 2021 г.
Приложения24. Вопросы производительности решений на REST для «Битрикс24».
Вебинар от 22 мая 2017 г.
В этой главе приведены несколько примеров, подходов и идей о том, как разрабатывать для облака.
Мы рассмотрим:
Дополнительно по теме: |
Наша библиотека [dw]CRest[/dw][di]@bitrix/crest — небольшой PHP SDK для использования REST API Битрикс24 в локальных, тиражных приложениях или через вебхуки.[/di] облегчает вхождение в работу с REST API - сама продлевает токены, сохраняет себе токены и т.п. Всё, что нужно сделать на старте - скачать и настроить, как рекомендовано здесь. Это занимает считанные минуты.
Но начинающим разработчикам может быть сложно понять, что происходит, если они столкнутся с неправильной настройкой сервера или какими-то другими проблемами. Мы постарались учесть в нашем [dw]SDK[/dw][di]SDK (от англ. software development kit) — набор средств разработки, который позволяет специалистам по программному обеспечению создавать приложения для определённого пакета программ, программного обеспечения базовых средств разработки, аппаратной платформы, компьютерной системы, игровых консолей, операционных систем и прочих платформ.
Программист, как правило, получает SDK непосредственно от разработчика целевой технологии или системы. Часто SDK распространяется через Интернет. Многие SDK распространяются бесплатно для того, чтобы побудить разработчиков использовать данную технологию или платформу.[/di] базовые ошибки настройки сервера, такие, как работа с URL, достаточность прав в папке, где расположена библиотека. Нужно открыть файл checkserver.php и он вам подскажет, какие донастройки необходимы.
По умолчанию библиотека покрывает только базовые сценарии работы и позволяет работать только с токена админа, который установил эту библиотеку.
Если же в сценарии вашего приложения нужно использовать токены пользователя, который открыл приложение, то вам нужно будет переопределить единственный метод - getSettingData
.
Допустим, вы открываете встройку. В реквесте придут токены текущего пользователя. Отнаследовав класс CRest
и переопределив его, вы начнете использовать новый класс CRestCurrent
и сможете работать с токенами текущего пользователя - того, который в данный момент использует ваше приложение.
Но нужно учитывать, что токены приходят не всегда и не везде. Для решения этой проблемы выпущена функция setDataExt
. Она позволяет в случае, когда у вас используется, например, библиотека под cron и вам жизненно необходимо использовать токен текущего пользователя. Вы можете этот токен где-то у себя сохранить и, когда нужно, через метод $dataExt
подставить в класс CRestCurrent
. Тогда библиотека будет на этом хите использовать токен пользователя, который вы подставили.
После этой небольшой доработки вы можете использовать новый класс, вызывать метод call
и получить, допустим, через user.current
информацию о текущем пользователе на портале и делать все, что необходимо, с его данными.
Этот код можно изучить по ссылке Работа с SDK CRest в контексте пользователя.
Если попытаться использовать наш SDK CRest для тиражных решений, то можно столкнуться с тем, что базовая работа этого класса возможно только с одним порталом. Это сделано умышленно, чтобы на старте разработчикам не нужно было думать о том, как хранить разные токены или донастраивать MySQL.
Но используя небольшие доработки, можно быстро перейти к тиражной разработке.
Пример - мы можем отнаследовать класс CRest
и, [dw]переопределив 2 метода[/dw][di][/di] getSettingData
и setSettingData
, подставлять в наш класс нужные токены данного портала, и забирать их:
Посмотреть код подробнее и почитать его обсуждение можно на портале для разработчиков https://dev.bitrix24.ru/company/personal/user/4066/blog/3251/. Предварительно нужно будет зарегистрироваться.
На рисунке показано, как работает самая нагруженная точка приложения - входящие события от Битрикс24:
И основная проблема в том, что если вы подпишетесь на очень много событий, то одновременно их может прийти слишком большое количество. Если сервер не успевает ответить (например, он завис или подвергся DDoS-атаке), то через 3 секунды вы попадете на красный сервер очередей, в котором собираются медленные приложения с низким приоритетом, и работа вашего приложения ухудшится. Поэтому нужно отвечать быстро и четко.
Немного статистики
|
---|
Мы собрали реальную статистику, какое количество событий может прийти за неделю:
В пиковых нагрузках это количество может увеличиваться в разы. Например, к приложению MAGNATOR пришло 23К событий за 30 минут. Их нужно успешно обработать, и для любого веб-сервиса это может быть значительной нагрузкой. |
Исходя из этой теории, понятно, что основными требованиями к приложению будут:
Поэтому наиболее подходящей кажется облачная архитектура, основанная на микросервисах, которые можно гибко включать или выключать пропорционально нагрузке.
[ 'error' => 'OVERLOAD_LIMIT', 'error_description' => 'REST API is blocked due to overload.' ]Для разблокировки необходимо обратиться в техподдержку.
Для реализации микросервисной архитектуры разработана новая версия SDK CRest
на Python. Она может работать как с тиражными, так и с локальными приложениями.
Как работает данная версия SDK:
Таким образом можно снизить нагрузку для таких критически важных частей, как База данных.
Рассмотрим простой сценарий работы приложения:
Приложение может быть написано на любом удобном языке.
Порядок работы может быть таким:
Как видите, не требуется никаких дополнительных действий. В таблице запросов к Базе данных предусмотрена ячейка Callback`a и возможность отправки событий под определенным пользователем. Если, например, в событии мы сохранили токены, которые пришли с запросом, то мы можем отправить их в таблицу запросов в Битрикс24 и ответ уйдет именно с токеном текущего пользователя, который вам необходим.
Как же уходят запросы к Битрикс24?
Есть функция Менеджер очереди:
[/di].
Она забирает из Базы данных порталы, к которым должны отправляться запросы. После получения списка порталов для каждого из них запускается отдельная функция, именно она и отправляет запросы. Каждая такая функция работает в контексте текущего портала. То есть порядок такой:
Пример - если подписаться на событие Добавление лида, то всё, что придет - ID лида. Можно сделать в приложении запрос в таблицу Базы данных об этом лиде и добавить в ячейку таблицы Callback-функцию, которая будет запускаться после того, как придет дополнительная информация по лиду. Функция обработает информацию, сохранит результат и на следующем шаге можно доработать всё, что необходимо сделать с этим лидом.
Логика и код Менеджера очереди
|
---|
Он выбирает порталы по группировке и создает новые функции:
Код Отправки запросов (скрыты некоторые моменты) Логика такая:
Этот не слишком сложный код работает как отдельный микросервис. Если событий мало, а запросов много, нужно поднять количество функций отправки запросов и всё будет работать быстро. Код доступен на портале для разработчиков по адресу https://dev.bitrix24.ru/workgroups/group/51/ (Нужно будет авторизоваться). Там же подробная инструкция о том, как настроить работу с облаком - добавить функции, какие методы вызывать, на какие триггеры эти функции добавить. Там же прикреплен архив с первой версией этого SDK. |
Выводы о новой SDK CRest Python:
Выводы о работе облачной архитектуры под высокими нагрузками:
Если приложение на портале посылает избыточные REST-запросы, это может привести к слишком высокой нагрузке на ваш Битрикс24, а значит, и работа будет значительно более медленной.
Начиная с версии модуля REST 20.5.0, доступен инструмент Статистика использования REST (Приложения > Разработчикам > [dw]Статистика[/dw][di] [/di]), с помощью которого можно отследить общее число ежедневных REST-запросов вашего портала, а также просмотреть детальную статистику по каждому из приложений, по вебхукам и по событиям.
Для получения более детальной статистики используйте фильтр:
С помощью фильтра можно просмотреть статистику запросов по следующим критериям:
Таким образом, с помощью нового инструмента Статистика использования REST вы можете отследить избыточные REST-запросы и в дальнейшем оптимизировать ваше приложение.
При работе с API очень удобно использовать специально созданное бесплатное приложение, которое выводит документацию в вашем портале Битрикс24.
Установив такое приложение, вы будете постоянно иметь "под рукой" актуальную версию REST API.
Приложение позволяет выполнять код, приведённый в доке, копировать его в панель и видоизменять под ваши задачи.