REST API Bitrix24 — главный способ интеграции внешних сервисов с CRM. В этой статье разберём три подхода к авторизации, покажем реальные примеры запросов на PHP и объясним, чем входящие вебхуки отличаются от исходящих.
Три способа авторизации в REST API Bitrix24
1. Входящий вебхук (Incoming webhook)
Самый простой вариант для личного использования или внутренних скриптов. Создаётся в разделе Приложения → Вебхуки → Входящий вебхук.
URL вебхука выглядит так:
https://your-domain.bitrix24.ru/rest/1/ваш_токен/
Достаточно просто добавить метод в конец URL:
$result = file_get_contents(
"https://your-domain.bitrix24.ru/rest/1/TOKEN/crm.contact.list.json"
. "?FILTER[NAME]=Иван&SELECT[]=ID&SELECT[]=NAME&SELECT[]=PHONE"
);
2. OAuth 2.0 (для публичных приложений)
Используется, когда приложение устанавливают разные пользователи. Требует регистрации приложения в Bitrix24 Marketplace и получения client_id и client_secret.
3. Серверный OAuth с refresh token
Для долгоживущих интеграций. Access token истекает через 1 час, поэтому нужно автоматически его обновлять через refresh_token.
function refreshToken(string $refreshToken): array {
$response = file_get_contents(
"https://oauth.bitrix.info/oauth/token/"
. "?grant_type=refresh_token"
. "&client_id=" . CLIENT_ID
. "&client_secret=" . CLIENT_SECRET
. "&refresh_token=" . $refreshToken
);
return json_decode($response, true);
}
Класс-обёртка для удобной работы с API
class B24Api {
private string $webhookUrl;
public function __construct(string $domain, string $userId, string $token) {
$this->webhookUrl = "https://{$domain}/rest/{$userId}/{$token}/";
}
public function call(string $method, array $params = []): array {
$url = $this->webhookUrl . $method . ".json";
$context = stream_context_create([
"http" => [
"method" => "POST",
"header" => "Content-Type: application/x-www-form-urlencoded\r\n",
"content" => http_build_query($params),
"timeout" => 15,
]
]);
$response = file_get_contents($url, false, $context);
if ($response === false) {
throw new \RuntimeException("B24 API request failed: {$method}");
}
$data = json_decode($response, true);
if (!empty($data["error"])) {
throw new \RuntimeException($data["error_description"] ?? $data["error"]);
}
return $data["result"] ?? $data;
}
}
// Использование:
$b24 = new B24Api("company.bitrix24.ru", "1", "your_token");
$contacts = $b24->call("crm.contact.list", [
"filter" => ["TYPE_ID" => "CLIENT"],
"select" => ["ID", "NAME", "PHONE", "EMAIL"],
"start" => 0,
]);
Постраничная выборка (pagination)
Большинство методов возвращают не более 50 записей за раз. Чтобы получить все записи, используйте параметр start:
function getAllItems(B24Api $b24, string $method, array $params = []): array {
$result = [];
$start = 0;
do {
$params["start"] = $start;
$response = $b24->call($method, $params);
$result = array_merge($result, $response);
$start += 50;
} while (count($response) === 50);
return $result;
}
Исходящий вебхук (Outgoing webhook)
Исходящий вебхук — это когда Bitrix24 сам отправляет данные на ваш сервер при наступлении события (новый лид, изменение сделки и т.д.). Настраивается в Приложения → Вебхуки → Исходящий вебхук.
Bitrix24 пришлёт POST-запрос с данными события. Пример обработки:
// your-handler.php
$event = $_POST["event"] ?? "";
$data = $_POST["data"] ?? [];
$auth = $_POST["auth"] ?? [];
if ($event === "ONCRMLEADADD") {
$leadId = $data["FIELDS"]["ID"] ?? null;
// обрабатываем новый лид
file_put_contents("/tmp/b24_lead.log", json_encode($_POST) . "\n", FILE_APPEND);
}
Полезные методы API
| Сущность | Метод | Описание |
|---|---|---|
| Лиды | crm.lead.list / add / update | CRUD для лидов |
| Контакты | crm.contact.list / add / update | CRUD для контактов |
| Сделки | crm.deal.list / add / update | CRUD для сделок |
| Задачи | tasks.task.list / add / update | Управление задачами |
| Пользователи | user.get / user.search | Поиск сотрудников |
| Диск | disk.folder.getchildren | Работа с файлами |
Итог
REST API Bitrix24 достаточно прост в освоении: для начала хватит входящего вебхука и базового класса-обёртки. Главное помнить о постраничной выборке при работе с большими списками и правильно обрабатывать ошибки в ответе API.
