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