Перейти к содержанию

Лиды из ВКонтакте в Битрикс24: VK Реклама по API и формы сообществ

Два способа получать заявки из ВКонтакте в Битрикс24 без стандартных CRM-форм: подписка на лид-формы VK Рекламы по API и Callback API сообществ.

Стандартное подключение ВКонтакте через CRM-формы Битрикс24 подходит не всегда. Например, когда групп несколько или заявки идут из лид-форм рекламного кабинета. Тогда остаётся код: небольшой PHP-скрипт на своём сервере принимает заявку от ВК и создаёт лид в Битрикс24 через входящий вебхук.

Ниже два способа, которые Максим использовал в 2024 году:

  1. Лид-формы VK Рекламы (ads.vk.com) — подписка на заявки через API рекламного кабинета.
  2. Лид-формы сообществ ВКонтакте — Callback API группы. Подходит, когда к Битрикс24 нужно подключить несколько групп.

В обоих случаях понадобятся:

Как узнать ID источника

В Битрикс24 откройте «Настройки» → «Настройки CRM» → «Справочники» → «Источники». Нажмите правой кнопкой мыши на нужном источнике и выберите «Проверить объект» (инструменты разработчика браузера). ID — в атрибуте value у поля STATUS_ID.

Справочник источников в Битрикс24 и инструменты разработчика браузера: у источника «Веб-сайт» значение STATUS_ID равно WEB

Другой способ — запросить список источников через вебхук методом crm.status.list. Он описан в статье «Получение источника через вебхук в Битрикс24».

Способ 1. VK Реклама по API

Документация VK Рекламы:

Для проверки запросов пригодятся Postman и Webhook.site.

Получите доступ к API

  1. Зайдите в рекламный кабинет VK.
  2. В левом меню выберите «Настройки».
  3. Скопируйте client_id.
  4. Запросите дополнительный доступ к API.
  5. Авторизуйтесь.
  6. Скопируйте client_secret. Он показывается только 10 минут.
  7. Сохраните полученные данные в надёжном месте.

Оформите подписку на заявки через Postman

  1. Получите токен доступа по инструкции из «Быстрого старта».

  2. Создайте запрос с методом POST на адрес https://ads.vk.com/api/v3/subscription.json.

  3. На вкладке Authorization выберите тип Bearer Token и вставьте токен из пункта 1.

  4. На вкладке Headers добавьте ключ Content-Type со значением application/json.

  5. На вкладке Body выберите raw, формат JSON, и вставьте:

    {
      "resource": "LEAD",
      "callback_url": "https://<адрес обработчика>"
    }
  6. Отправьте запрос. После этого появится подписка, и VK будет отправлять обработчику данные заполненных лид-форм. От заполнения формы до прихода данных может пройти до 15 минут.

Запрос в Postman: метод POST на ads.vk.com/api/v3/subscription.json, авторизация Bearer Token

Обработчик: заявка → лид в Битрикс24

Скрипт принимает заявку от VK и создаёт лид методом crm.lead.add. В начале скрипта укажите адрес своего вебхука и ID источника. Разработка — Александр Белокуров.

<?php
if (!isset($_REQUEST)) {
    return;
}
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    echo "Нет таких тут!";
}
else {
    // Возвращаем "ok" серверу
    echo('ok');
    // Получение данных из POST-запроса
    $jsondata = file_get_contents('php://input');

    // Динамические данные
    $url = 'https://<портал>.bitrix24.ru/rest/<id пользователя>/<код вебхука>/'; // Тут вебхук с правами CRM
    $sourceId = 'web'; // Тут ID источника
    $title = 'Новый лид от VK';

    // Убираем сломанную строку
    $cleanedJson = preg_replace('/,\s*"created_at":\s*"[^"]+"\s*/', '', $jsondata);
    // Преобразование JSON в ассоциативный массив
    $data = json_decode($cleanedJson);

    // Записываем переменные
    $name = $data->data->contact_info->first_name;
    $phone = $data->data->contact_info->phone;
    $email = $data->data->contact_info->email;

    // Записываем ответы для комментария
    $comm = '';
    $questionNumber = 1;
    foreach ($data->data->answers as $answer) {
        $comm .= 'Вопрос ' . $questionNumber . ': ' . $answer->answer_text . '<br>';
        $questionNumber++;
    }
    // Убираем последний перенос строки в комментарии
    $comm = preg_replace('/<br>$/', '', $comm);

    // Формируем данные для REST
    $queryUrl = $url . 'crm.lead.add';
    $leadData = array(
        'fields' => array(
            'TITLE' => $title,
            'NAME' => $name,
            'PHONE' => array(array('VALUE' => $phone, 'VALUE_TYPE' => 'WORK')),
            'EMAIL' => array(array('VALUE' => $email, 'VALUE_TYPE' => 'WORK')),
            "COMMENTS" => $comm,
            "STATUS_ID" => "NEW",
            "OPENED" => "Y",
            "SOURCE_ID" => $sourceId,
            "ASSIGNED_BY_ID" => 1,
            // Добавьте другие необходимые поля для лида
        )
    );
    // Преобразование данных в формат JSON
    $jsonData = json_encode($leadData);

    // Отправляем REST
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_POST => 1,
        CURLOPT_HEADER => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $queryUrl,
        CURLOPT_POSTFIELDS => $jsonData,
        CURLOPT_HTTPHEADER => array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($jsonData)
        )
    ));
    $result = curl_exec($curl);
    $error = curl_error($curl);
    curl_close($curl);

    // Логируем результат
    if ($result === false) {
        file_put_contents('errors.txt', PHP_EOL . date("Y-m-d H:i:s") . PHP_EOL . 'Ошибка при выполнении запроса curl: ' . $error, FILE_APPEND);
    } else {
        file_put_contents('logs.txt', PHP_EOL . date("Y-m-d H:i:s") . PHP_EOL . 'Ответ от сервера Bitrix24: ' . $result, FILE_APPEND);
    }
}

Способ 2. Лид-формы сообществ через Callback API

Этот способ нужен, когда к Битрикс24 подключают несколько групп ВКонтакте. Скрипт обработчика ниже — честная сборка из нескольких источников. Настройка занимает минут десять.

Скрипт проверяет секретный ключ, отвечает ВК строкой подтверждения, ищет контакт с тем же телефоном и создаёт лид методом crm.lead.add с ответами формы в комментарии. Настройки — в начале файла: вебхук, ID источника, UTM-метка, строка подтверждения, секретный ключ и номера форм (all — все формы сообщества).

<?php

if (!isset($_REQUEST)) {
    return;
}

//блок настроек
$url = 'https://<портал>.bitrix24.ru/rest/<id пользователя>/<код вебхука>/'; //Вебхук
$sourceId = "WEB"; //ID Источника
$utm_source = "vk"; //UTM Source
$confirmation_token = '<строка подтверждения>'; // Строка, которую должен вернуть сервер
$secret = '<секретный ключ>'; //Секретный ключ
$formId = array("all"); //Если all, то передавать все формы, если цифры, то конкретную 15

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    echo "Нет таких тут!";
}
else{
    $token = ' '; //Ключ доступа сообщества
/*
    $file = 'log.txt'; //Если нужны логи, то раскомментировать
    $current = file_get_contents($file);
    file_put_contents($file, print_r("php://input", true), FILE_APPEND);
*/
    $data = json_decode(file_get_contents('php://input')); //Получаем и декодируем уведомление

    //Проверяем секретный код
    if ($data->secret !== $secret) {
        return;
    }

    //Проверяем, что находится в поле "type"
    switch ($data->type) {
        case 'confirmation': //Если это уведомление для подтверждения адреса...
            echo $confirmation_token; //...отправляем строку для подтверждения
            break;



        //Блок обработки лидформы
        case 'lead_forms_new':
            echo('ok'); //Возвращаем "ok" серверу Callback API
            $lead_id = $data->object->lead_id;
            $vk_id = $data->object->user_id; // ID пользователя, отправившего заявку
            $form_name = $data->object->form_name; // Название формы
            $form_id = $data->object->form_id;
            $adid = $data->object->ad_id; // ID рекламного объявления, с которого пришла заявка

            if((in_array($form_id, $formId)) || (in_array("all", $formId))) {
                if($data->object->answers) {
                    foreach ($data->object->answers as $answer) {
                        $ansvers[$answer->key]["question"] = $answer->question;
                        $ansvers[$answer->key]["answer"] = $answer->answer;
                        $pos = strpos($answer->key, "custom");
                        if ($pos !== false) {
                            $customs[$answer->key]["question"] = $answer->question;
                            $customs[$answer->key]["answer"] = $answer->answer;
                        }
                    }
                }
                $name = $ansvers["first_name"]["answer"]; // Имя
                $secname = $ansvers["patronymic_name"]["answer"]; // Отчество
                $surname = $ansvers["last_name"]["answer"]; // Фамилия
                $email = $ansvers["email"]["answer"]; // Email
                $phone = $ansvers["phone_number"]["answer"]; // Телефон основной
                $birth = $ansvers["birthday"]["answer"]; // День рождения
                $adres = $ansvers["location"]["answer"]; // Адрес
                //$phoneH = $ansvers["custom_1"]["answer"]; // Телефон домашний
                $comments = "<b>" . $ansvers["age"]["question"] . "</b>: " . $ansvers["age"]["answer"] . "; <br />";
                if($customs) {
                    foreach ($customs as $custom) {
                        $comments .= "<b>" . $custom["question"] . "</b>: " . $custom["answer"] . "; <br />";
                    }
                }

                // Запишем данные для Б24
                $vk_id = "id" . $vk_id;

                //Разделение адреса -- ОК
                $exadres = explode(", ", $adres);
                $country = $exadres[0];
                $city = $exadres[1];

                $queryUrl = $url . 'crm.lead.add';

                //Проверим
                $queryUrlC = $url . 'crm.duplicate.findbycomm?';

                $queryDataC = http_build_query(
                    array(
                        'entity_type' => "CONTACT",
                        'type' => "PHONE",
                        'values' => array($phone)
                    )
                );


                $curlC = curl_init();
                curl_setopt_array($curlC, array(
                    CURLOPT_SSL_VERIFYPEER => 0,
                    CURLOPT_POST => 1,
                    CURLOPT_HEADER => 0,
                    CURLOPT_RETURNTRANSFER => 1,
                    CURLOPT_URL => $queryUrlC,
                    CURLOPT_POSTFIELDS => $queryDataC,
                ));

                $resultC = curl_exec($curlC);
                curl_close($curlC);
                $resultC = json_decode($resultC, 1);
                //

                $queryData = http_build_query(array(
                    'fields' => array(
                        "TITLE" => $form_name . " - " . $name,
                        "NAME" => $name,
                        "LAST_NAME" => $surname,
                        "SECOND_NAME" => $secname,
                        "BIRTHDATE" => $birth,
                        "STATUS_ID" => "NEW",
                        "OPENED" => "Y",
                        "SOURCE_ID" => $sourceId,
                        "ASSIGNED_BY_ID" => 1,
                        "COMMENTS" => $comments,
                        "PHONE" => array(array("VALUE" => $phone, "VALUE_TYPE" => "WORK")/*,array("VALUE" => $phoneH, "VALUE_TYPE" => "HOME" )*/),
                        "EMAIL" => array(array("VALUE" => $email, "VALUE_TYPE" => "WORK")),
                        "IM" => array(array("VALUE" => $vk_id, "VALUE_TYPE" => "VK")),
                        "ADDRESS_COUNTRY" => $country,
                        "ADDRESS_CITY" => $city,
                        "UTM_SOURCE" => $utm_source,
                        "UTM_CONTENT" => $adid,
                        'CONTACT_ID' => ($resultC["result"]["CONTACT"][0]) ? $resultC["result"]["CONTACT"][0] : '',
                    ),
                    'params' => array("REGISTER_SONET_EVENT" => "Y")
                ));


                $curl = curl_init();
                curl_setopt_array($curl, array(
                    CURLOPT_SSL_VERIFYPEER => 0,
                    CURLOPT_POST => 1,
                    CURLOPT_HEADER => 0,
                    CURLOPT_RETURNTRANSFER => 1,
                    CURLOPT_URL => $queryUrl,
                    CURLOPT_POSTFIELDS => $queryData,
                ));

                $result = curl_exec($curl);
                curl_close($curl);
                $result = json_decode($result, 1);
            }
            break;
            break;
    }


}
?>

Шаг 1. Данные из Битрикс24

  1. Создайте входящий вебхук с правами на CRM.
  2. Узнайте ID источника, с которым будут создаваться лиды (см. выше).
  3. Внесите адрес вебхука и ID источника в блок настроек скрипта ($url, $sourceId).

Шаг 2. Настройки в сообществе ВКонтакте

  1. Откройте «Настройки» → «Работа с API».
  2. Перейдите на вкладку Callback API.
  3. Придумайте любой секретный ключ и сохраните его.
  4. Скопируйте ключ в скрипт ($secret).
  5. Скопируйте в скрипт значение «Строка, которую должен вернуть сервер» ($confirmation_token) и сохраните скрипт.
  6. Разместите скрипт на сервере и укажите его адрес в поле «Адрес». Адрес должен начинаться с https.
  7. Нажмите «Подтвердить». Если всё сделано правильно, появится зелёное сообщение об успехе.
  8. На вкладке «Типы событий» в самом низу отметьте «Lead forms: Новая заявка».
  9. Отправьте тестовую заявку через форму.

Настройки Callback API сообщества ВКонтакте: цифрами отмечен порядок шагов — «Работа с API», вкладка Callback API, секретный ключ, строка для ответа сервера, адрес, кнопка «Подтвердить», вкладка «Типы событий»

Готово: новые заявки из лид-форм сообщества будут приходить в Битрикс24 лидами.


Поделиться:

Предыдущая статья
Xerox B215 печатает мусор с Mac, а с iPhone — нормально
Следующая статья
Телефония для Битрикс24: оператор, АТС, номер и мессенджеры