Callback установки
Выберите инструмент для разработки с AI-агентом:
- используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
- используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации
Приложению без интерфейса тоже нужны токены авторизации. Callback установки — способ их получить: Битрикс24 отправляет токены на ваш обработчик сразу после того, как пользователь установит тиражное приложение.
Когда применять
Вариант подходит приложениям, у которых нет своей страницы в Битрикс24. В карточке такого приложения опцию Добавлять свою страницу и пункт в главном меню не включают. Пункт в левом меню не появится, но приложение может регистрировать виджеты в местах встройки. Обычно логика такого приложения работает в обработчиках событий.
Адрес обработчика указывают в карточке приложения, в поле Ссылка на обработчик события установки. Битрикс24 принимает адрес по протоколу HTTP или HTTPS. Используйте HTTPS: в запросе передаются токены.
Если при установке пользователь должен что-то настроить, callback не подойдет: у него нет интерфейса. Выберите мастер установки для приложения с интерфейсом или мастер настройки для REST-only приложений. Все способы установки сравниваются в обзоре Обзор установки тиражных приложений.
Как работает
Битрикс24 регистрирует адрес из карточки как обработчик события и присылает на него обычный POST-запрос. В PHP поля запроса доступны в $_POST: event, data, ts и объект auth с данными авторизации OAuth 2.0. Обычно в auth есть access-токен, refresh-токен и срок жизни access-токена, но токенов в запросе может не быть.
На один адрес приходят два события:
|
Событие |
Когда приходит |
Что дает приложению |
|
При каждой установке и обновлении приложения без своей страницы в Битрикс24 |
Авторизацию сотрудника, который установил приложение |
|
|
При создании или повторной активации системного пользователя приложения |
Долгоживущую авторизацию системного пользователя приложения |
Различайте события по полю event. Иначе приложение примет второе событие за повторную установку.
Авторизация у событий лежит в разных местах запроса:
ONAPPINSTALL— вauthONAPPUSERREADY— системного пользователя вdata, сотрудника, который установил приложение, вauth
application_token для проверки подлинности есть в auth у обоих событий.
Пример запроса ONAPPINSTALL, data и auth сокращены:
$_POST = [
'event' => 'ONAPPINSTALL',
'event_handler_id' => '17',
'data' => [
// поля события
],
'ts' => '1696527000',
'auth' => [
'access_token' => '***',
'refresh_token' => '***',
'expires_in' => 3600,
'scope' => 'crm,user',
'domain' => 'some-domain.bitrix24.ru',
'client_endpoint' => 'https://some-domain.bitrix24.ru/rest/',
'server_endpoint' => 'https://oauth.bitrix24.tech/rest/',
'member_id' => '***',
'application_token' => '***'
]
];
Полный состав полей описан на страницах событий.
Что вернуть
Верните код 200. Установка от ответа не зависит: у приложения без интерфейса она считается завершенной сразу при добавлении. Токены сохраните на своей стороне. Access-токен живет ограниченное время и обновляется по refresh-токену.
Метод BX24.installFinish() в этом сценарии вызывать не нужно, в отличие от мастера установки. Это метод JS-библиотеки, а она работает только во фрейме интерфейса приложения. Обработчик вызывает сервер Битрикс24, браузер в этом не участвует.
Обработчик доступен по публичному адресу, поэтому запрос на него может прислать кто угодно. Убедитесь, что запрос пришел от Битрикс24:
- сверьте
auth.application_tokenс токеном, сохраненным для этогоmember_id - если сохраненного токена нет или он не совпал, проверьте access-токен методом app.info на сервере авторизации
https://oauth.bitrix24.tech/rest/
Адресу Битрикс24 из запроса доверять нельзя: его задает отправитель, а адрес сервера авторизации известен заранее. Сохраненного токена нет при первой установке, а не совпасть он может после обновления: application_token при обновлении меняется. Токен передайте в параметре auth. В ответе сверьте result.client_id с client_id вашего приложения, а result.install.member_id — с member_id из запроса. Если оба совпали, сохраните новый application_token вместе с member_id. Без access-токена первый запрос проверить нечем — отклоните его.
Фрагмент ответа app.info на сервере авторизации:
{
"result": {
"client_id": "app.000000000000000000000000",
"install": {
"installed": true,
"member_id": "a223c6b3710f85df22e9377d6c4f7553"
}
}
}
Подробнее о проверке — в статьях Безопасность в обработчиках и Упрощенный вариант получения токенов OAuth 2.0.
Пример разбирает событие и сохраняет токены. Проверку подлинности выполняет функция вашего приложения isRequestTrusted():
$event = $_POST['event'] ?? '';
$auth = $_POST['auth'] ?? [];
$data = $_POST['data'] ?? [];
if ($event !== 'ONAPPINSTALL' && $event !== 'ONAPPUSERREADY') {
http_response_code(200);
exit;
}
if (!isRequestTrusted($auth)) {
http_response_code(403);
exit;
}
// у ONAPPINSTALL авторизация лежит в auth, у ONAPPUSERREADY — в data
$tokens = $event === 'ONAPPUSERREADY' ? $data : $auth;
// токенов в запросе может не быть — тогда сохраненные не трогаем
if (!empty($tokens['access_token']) && !empty($tokens['refresh_token'])) {
saveTokens($auth['member_id'], $event, [ // функция вашего хранилища
'access_token' => $tokens['access_token'],
'refresh_token' => $tokens['refresh_token'],
'expires_in' => (int)($tokens['expires_in'] ?? 0),
]);
}
http_response_code(200);
echo 'OK';
Храните авторизации двух событий раздельно. Токены системного пользователя из ONAPPUSERREADY живут дольше и не зависят от сотрудника, который установил приложение.