Для простой интеграции с Битрикс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.

Комментарии (4)


  1. Kanalja
    02.09.2026 13:03

    у битрикса есть своя библиотека CRest для PHP, в ней уже реализован метод CRest::call, с обработкой ошибок и прочим


    1. IvanDB Автор
      02.09.2026 13:03

      В моем варианте все предельно просто и показывает что и как работает в API по деталям. Именно это я и хотел описать, фундаментальную механику, сам принцип.

      Готовые библиотеки от Б24 сложнее и я пока в них не разбирался ещё. Но спасибо что обратили на это внимание.


  1. Anrol
    02.09.2026 13:03

    Для подобных интеграций не обязательно сразу строить OAuth 2.0-схему

    Справедливости ради, Битрикс предоставляет свой класс отправки запросов со встроенным кодом актуализации хэшей OAuth 2.0, он в открытом доступе, довольно прост и его можно самостоятельно переписать при надобности. Но серверное приложение выглядит надежней авторизации по входящему хуку. Тут вы напрасно "пугаете" новоиспеченных.

    После того, как Битрикс стал требовать отдельную плату за пользование вызовами REST API у многих пропал к Битриксу интерес :)


    1. IvanDB Автор
      02.09.2026 13:03

      Вопрос в подходе и в масштабе.

      Хуки это простое решение, OAuth для более серьезного на мой взгляд.
      Если с сайта падают заявки по 2-3 в день для 1 портала мне кажется хука более чем хватит.

      Официальная документация Битрикса тоже говорит что если портал один и скрипт простой, то лучше хук.

      Тут вопрос кому удобнее OAuth развернуть, а кому по простому через хук если там объем данных минимален.

      То что OAuth надежнее хука безусловно так, но мне кажется для простых интеграций хука хватит более чем.