Для простой интеграции с Битрикс24 далеко не всегда требуется полноценная OAuth 2.0-авторизация.
Если задача — из внешнего сервиса (сайт, соц. сеть, портал агрегатор и так далее) создать контакт, проверить существующего клиента и записать лид в CRM, это можно сделать через входящий вебхук Битрикс24 и обычный PHP.
Я использую такую схему в интеграциях, когда внешняя система отправляет данные на наш сервер, а сервер уже решает, что именно нужно создать в CRM.
Общая логика
Схема получается примерно такой:
Внешний сервис → index.php → проверка контакта → создание контакта при необходимости → создание лида → Битрикс24
Во внешнем сервисе, например, может формироваться JSON:
{ "object": { "first_name": "Иван", "last_name": "Иванов", "variables": { "phone": "+7 999 123-45-67" } } }
Он приходит на index.php:
$data = json_decode(file_get_contents('php://input'));
После этого данные можно передавать в отдельные PHP‑файлы, отвечающие за контакты, лиды и работу с REST API.
Например, структура проекта:
index.php
contacts.php
leads.php
Bitrix24API.php
index.php в данном случае выступает точкой входа.
Подключение к REST API Битрикс24
В Битрикс24 создаём входящий вебхук в разделе для разработчиков и получаем URL.


Сначала получаем входящую дату и проверяем контакт в index.php
$webhookUrl — это наш хук.
$data = json_decode(file_get_contents(‘php://input’)) — приняли дату и декодировали в объект.
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); echo('Открытие файла index.php'); echo("<br>"); include("contacts.php"); include("Bitrix24API.php"); include("leads.php"); $webhookUrl = 'https://xxxxxxx.bitrix24.ru/rest/8/9999999999izb08yxvw/'; $bx24 = new Bitrix24API($webhookUrl); // $data = file_get_contents('php://input'); $data = json_decode(file_get_contents('php://input')); $contact_id = check_contact($data -> object -> variables -> phone, $bx24); lead_create ($data, $contact_id, $bx24);
$contact_id — проверяем контакт по номеру телефона на дубли в Б24
lead_create — создаем ЛИД в Б24
Проверка контакта в contacts.php:
function check_contact ($phone, $bx24) { $phone = preg_replace("/[^0-9]/", "", [$phone]); $phone = "7".substr($phone[0], -10); $data_find = [ 'entity_type' => 'CONTACT', 'type' => 'PHONE', 'values' => [$phone], ]; $result = $bx24->callMethod('crm.duplicate.findbycomm', $data_find); return $result["result"]["CONTACT"][0] ?? null; }
Класс для работы с REST API создается в $bx24 который через curl запросы шлет в Б24, сюда же и наш хук подставляется:
class Bitrix24API { private $webhookUrl; public function __construct($webhookUrl) { $this->webhookUrl = $webhookUrl; } public function callMethod($method, $params = []) { $queryUrl = $this->webhookUrl . $method . '.json'; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $queryUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), ]); $result = curl_exec($curl); curl_close($curl); return json_decode($result, true); } }
Это используется для любого REST‑метода Битрикс24 через:
$bx24->callMethod($method, $params);
$method — это что делаем в Б24: записываем ЛИД то есть crm.lead.add будет забрасываться или дубль Контакта проверяем crm.duplicate.findbycomm.
$params — это дата.
Дальше возможны два сценария с Контактом:
Если контакт найден, новый контакт создавать не нужно. Создаём лид в leads.php и сразу связываем его с существующим контактом:
$lead = $bx24->callMethod('crm.lead.add', [ 'fields' => [ 'TITLE' => $data->object->first_name . ' ' . $data->object->last_name, 'NAME' => $data->object->first_name, 'LAST_NAME' => $data->object->last_name, 'CONTACT_ID' => $contact_id, 'PHONE' => [ [ 'VALUE' => $data->object->variables->phone, 'VALUE_TYPE' => 'WORK' ] ] ] ]);
Главная строка здесь:
$bx24->callMethod('crm.lead.add', ...)
Именно REST‑метод crm.lead.add создаёт лид в Битрикс24.
Если контакта нет
Если поиск по телефону ничего не нашёл, сначала создаём контакт:
$contact = $bx24->callMethod('crm.contact.add', [ 'fields' => [ 'NAME' => $data->object->first_name, 'LAST_NAME' => $data->object->last_name, 'PHONE' => [ [ 'VALUE' => $phone, 'VALUE_TYPE' => 'WORK' ] ] ] ]);
Битрикс24 возвращает ID нового контакта:
$contact['result']
После этого создаём лид и передаём этот ID:
$lead = $bx24->callMethod('crm.lead.add', [ 'fields' => [ 'TITLE' => $data->object->first_name . ' ' . $data->object->last_name, 'NAME' => $data->object->first_name, 'LAST_NAME' => $data->object->last_name, 'CONTACT_ID' => $contact['result'] ] ]);
Т.е. через if ($contact_id !== null) в leads.php сначала пробуем создать ЛИД с найденным Контактом — если ID Контакта нашли — создалось, если не нашли — сработал else и сначала создали Контакт, получили его ID и потом создали ЛИД.
Вот так целиком:
function lead_create ($data, $contact_id, $bx24) { $phone = preg_replace("/[^0-9]/", "", [$data -> object -> variables -> phone]); $phone = "7".substr($phone[0], -10); if ($contact_id !== null) { try { $lead = $bx24->callMethod('crm.lead.add', ['fields' => [ 'TITLE' => $data -> object -> first_name." ".$data -> object -> last_name, 'NAME' => $data -> object -> first_name, 'LAST_NAME' => $data -> object -> last_name, 'OPENED' => 'Y', 'ASSIGNED_BY_ID' => 1, 'CONTACT_ID' => $contact_id, 'PHONE' => [ [ 'VALUE' => $data -> object -> variables -> phone, 'VALUE_TYPE' => 'WORK', ], ], ] ] ); if (isset($lead['error'])) { error_log($lead['error']); } } catch (Throwable $e) { error_log($e->getMessage()); echo 'Error adding lead contact: ' . $e->getMessage(); } } else { try { $contact = $bx24->callMethod('crm.contact.add', // создание Контакта ['fields' => [ 'NAME' => $data -> object -> first_name, 'LAST_NAME' => $data -> object -> last_name, 'PHONE' => [ [ 'VALUE' => $phone, 'VALUE_TYPE' => 'WORK', ] ], 'ASSIGNED_BY_ID' => '1' ] ] ); $lead = $bx24->callMethod('crm.lead.add', //создание ЛИДа ['fields' => [ 'TITLE' => $data -> object -> first_name." ".$data -> object -> last_name, 'NAME' => $data -> object -> first_name, 'LAST_NAME' => $data -> object -> last_name, 'OPENED' => 'Y', 'ASSIGNED_BY_ID' => 1, 'CONTACT_ID' => $contact ["result"], 'UF_CRM_171999941952' => $data -> object -> first_name, 'COMMENTS' => $phone ] ] ); } catch (Throwable $e) { error_log($e->getMessage()); echo 'Error adding lead contact: ' . $e->getMessage(); } return $lead; } }
Зачем разделять код на несколько файлов
Можно написать всё внутри одного index.php, но по мере роста интеграции такой файл быстро превращается в плохо поддерживаемый набор запросов.
Поэтому я обычно разделяю ответственность:
index.php
принимает входящий запрос и запускает основную логику.
contacts.php
работает с контактами: поиск, создание и так далее
leads.php
отвечает за создание и изменение лидов.
Bitrix24API.php
содержит универсальный метод отправки REST‑запросов в Битрикс24.
В результате интеграцию намного проще расширять.
Например, позже можно добавить:
создание сделки;
запись комментария в таймлайн;
заполнение пользовательских полей;
изменение ответственного;
постановку задач;
обработку повторных обращений.
Итог
Для подобных интеграций не обязательно сразу строить OAuth 2.0-схему.
Если есть контролируемый сценарий обмена между сервером и конкретным порталом Битрикс24, можно использовать входящий вебхук.
Принцип достаточно простой:
получаем JSON → проверяем контакт → при необходимости создаём контакт → вызываем crm.lead.add → лид появляется в Битрикс24.
А универсальный callMethod() позволяет дальше работать практически с любыми нужными REST‑методами Битрикс24.
Для небольших интеграций это один из самых простых способов начать работать с REST API Битрикс24 на PHP.
Чаще всего что бы заявки собирать с чего то внешнего (сайты, порталы агрегаторы и так далее) в Битрикс24.

