Как записать ЛИД в Битрикс24 (заявка с сайта и подобное) через входящий вебхук на PHP

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Для простой интеграции с Битрикс24 далеко не всегда требуется полноценная OAuth 2.0-авторизация.

Если задача — из внешнего сервиса (сайт, соц. сеть, портал агрегатор и т.д.) создать контакт, проверить существующего клиента и записать лид в CRM, это можно сделать через входящий вебхук Битрикс24 и обычный PHP.

Я использую такую схему в интеграциях, когда внешняя система отправляет данные на наш сервер, а сервер уже решает, что именно нужно создать в CRM.

Общая логика

Схема получается примерно такой:

Внешний сервис → index.php → проверка контакта → создание контакта при необходимости → создание лида → Битрикс24

Во внешнем сервисе, например, может формироваться JSON:

{
    "first_name": "Иван",
    "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];


}

Класс для работы с 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,
                    'CURRENCY_ID'    => 'RUB',
                    'OPPORTUNITY'    => 35500,
                    'CONTACT_ID' => $contact_id,
                     'PHONE'          => [
                     [
                        'VALUE'      => $data -> object -> variables -> phone,
                        'VALUE_TYPE' => 'WORK',
                    ],
                    ],
                ]
                ]
            );

            if ($lead->error()) {
                error_log($lead->error());
            } else {
                echo 'Success: ' . print_r($lead->data(), true);
            }
            } 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',
                        ],
                        [
                            'VALUE' => $phone,
                            'VALUE_TYPE' => 'HOME',
                        ]
                    ],
                    '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,
                    'CURRENCY_ID'    => 'USD',
                    'OPPORTUNITY'    => 12500,
                    'CONTACT_ID' => $contact ["result"],
                    'UF_CRM_1712385841952' => $data -> object -> first_name,
                    'COMMENTS' => $phone
                ]
                ]
            );

        if ($comment->error()) {
            error_log($lead->error());
        } else {
            echo 'Success: ' . print_r($comment->data(), true);
        }
        } 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.

Источник: https://habr.com/ru/articles/1077308/


Интересные статьи

Интересные статьи

Центр информационной безопасности и мониторинга инцидентов «1С-Битрикс» добавил в программу «Безопасные интеграции» новый слой проверки подключаемых решений для маркетплейса от сторонних компаний-разр...
Недавно на работе мне пришлось столкнуться с одной задачей. Нужно было срочно озвучить текст для ролика, но рядом ни диктора, ни коллег, которые могли бы помочь. И тогда я задумался: а что если довери...
Мы поддерживаем кастомизацию наших продуктов и всячески помогаем в этом разработчикам: у нас есть курсы, гайды, маркетплейс решений и т.д. При этом мы выступаем за безопасность и правильный подход, за...
Итак после первых плагинов для ВордПресс и джумла пришла пора сделать что-то похожее в Битрикс.Наш путь познания разных движков для сайтов проходит под идеей принести новый функционал, а именно принят...
И еще раз снова привет, дорогой читатель! Здесь мы поговорим о том, как я обошел защиту в компьютерном клубе Arena Arsenal. Все это привело к тому, что я смог спокойно продолжить польз...