Интеграция Contact Form 7 (WordPress) с Bitrix24

Многие владельцы сайтов на CMS WordPress уже задумывались как же связать сайт с CRM системой Битрикс 24? Чтобы ответить на данный вопрос, давайте рассмотрим интеграцию Contact Form 7 и Bitrix24.

Как связать CF7 WordPress и Битрикс24.

И так, давайте более детально рассмотрим автоматическую передачу заявок в CRM Битрикс24 для одной из популярных CMS систем WordPress, а также не менее популярного для неё плагина для создания, получения и обработки лидов с сайта — Contact Form 7. Для этого на понадобится:

  • Хук для перехвата введенных данных из Contact Form 7.
  • Выбор подходящего способа передачи в Битрикс 24
    • С помощью упрощенного Rest API
      • PHP скрипт для интеграции при помощи упрощенного Rest API
      • Объединение хука и PHP скрипта.
    • При помощи входящего вебхука
      • PHP скрипт для интеграции при входящего вебхука
      • Объединение хука и PHP скрипта.
  • Внесение полученного кода в Вашу тему в файл functions.php

Хук для перехвата введенных данных из CF7

Что такое хук? Хук — это технология перехвата вызова функций в сторонних процессах. Соответственно, так как Contact Form 7 — это сторонний плагин, то нам необходим хук для получения обрабатываемых там данных.
В нашем случаи хук для перехвата данных из Contact Form 7 в CMS WordPress будет выглядеть следующим образом:

add_action( 'wpcf7_mail_sent', 'your_wpcf7_mail_sent_function' );
function your_wpcf7_mail_sent_function( $contact_form ) {
   $title = $contact_form->title;
   $posted_data = $contact_form->posted_data;
   //Вместо "Контактная форма 1" необходимо указать название Вашей контактной формы
   if ('Контактная форма 1' == $title ) {
   $submission = WPCF7_Submission::get_instance();
   $posted_data = $submission->get_posted_data();
   //далее мы перехватывает введенные данные в Contact Form 7
   //перехватываем поле [your-name]
   $firstName = $posted_data['your-name'];
   //перехватываем поле [your-message]
   $message = $posted_data['your-message'];
   //в данном примере рассмотрены два поля. Как перехватывать остальные поля
   //читайте ниже.
}

В данном хуке приведены примеры по перехвату только двух полей: Имени и Сообщения.
Если Вам необходимо передавать больше полей или какие-либо отдельно созданные поля, то возникает вопрос где брать название $posted_data?

Для того, чтобы найти названия для $posted_data, Вам необходимо перейти в плагин Contact Form 7 — Контактные формы — «Интересующая контактная форма» — Шаблон/Письмо, где можно найти информацию о том, какие поля используются в Вашей форме.

Название $posted_data для хука Contact Form 7
Название $posted_data для хука Contact Form 7

Выбор подходящего способа передачи в Битрикс 24

Из данных двух способов, я бы рекомендовал использовать интеграцию при помощи входящего вебхука в Битрикс24, так как данный способ более безопасный и более функциональный, чем интеграция при помощи упрощенного Rest API.

  1. С помощью упрощенного Rest API

    Объединение хука и PHP скрипта

    Рассмотрев PHP скрипт упрощенного Rest API для отправки данных в Bitrix24 и Хук для перехвата введенных данных из Contact Form 7 теперь можно перейти к объединению данных двух функций. При этом необходимо будет учесть последовательность функций в коде, которая будет иметь следующий вид:

    1. вызов функции для перехвата данных;
    2. подключение к серверу CRM;
    3. авторизация в CRM;
    4. перехват данных из Contact Form 7;
    5. формирование параметров для создания лида в переменной $postData = array из Contact Form 7;
    6. передача данных из Contact Form 7 в Bitrix24.

    Таким образом мы получим код следующего вида:

// Вызываем функцию для перехвата данных
add_action( 'wpcf7_mail_sent', 'your_wpcf7_mail_sent_function' );
function your_wpcf7_mail_sent_function( $contact_form ) {
   // Подключаемся к серверу CRM
   define('CRM_HOST', '[ваше_название].bitrix24.ru'); // Ваш домен CRM системы
   define('CRM_PORT', '443'); // Порт сервера CRM. Установлен по умолчанию
   define('CRM_PATH', '/crm/configs/import/lead.php'); // Путь к компоненту lead.rest
   // Авторизуемся в CRM под необходимым пользователем:
   // 1. Указываем логин пользователя Вашей CRM по управлению лидами
   define('CRM_LOGIN', 'login');
   // 2. Указываем пароль пользователя Вашей CRM по управлению лидами
   define('CRM_PASSWORD', 'password');
   // Перехватываем данные из Contact Form 7
   $title = $contact_form->title;
   $posted_data = $contact_form->posted_data;
   // Вместо "Контактная форма 1" необходимо указать название вашей контактной формы
   if ('Контактная форма 1' == $title ) {
       $submission = WPCF7_Submission::get_instance();
       $posted_data = $submission->get_posted_data();
       // Далее перехватываем введенные данные в полях Contact Form 7:
       // 1. Перехватываем поле [your-name]
       $firstName = $posted_data['your-name'];
       // 2. Перехватываем поле [your-message]
       $message = $posted_data['your-message']; 
       // Формируем параметры для создания лида в переменной $postData = array
       $postData = array(
          // Устанавливаем название для заголовка лида
          'TITLE' => 'Название лида с сайта',
          'NAME' => $firstName,
          'COMMENTS' => $message,
       );
       // Передаем данные из Contact Form 7 в Bitrix24
       if (defined('CRM_AUTH')) {
          $postData['AUTH'] = CRM_AUTH;
       } else {
          $postData['LOGIN'] = CRM_LOGIN;
          $postData['PASSWORD'] = CRM_PASSWORD;
       }
       $fp = fsockopen("ssl://".CRM_HOST, CRM_PORT, $errno, $errstr, 30);
       if ($fp) {
          $strPostData = '';
          foreach ($postData as $key => $value)
             $strPostData .= ($strPostData == '' ? '' : '&').$key.'='.urlencode($value);
          $str = "POST ".CRM_PATH." HTTP/1.0\r\n";
          $str .= "Host: ".CRM_HOST."\r\n";
          $str .= "Content-Type: application/x-www-form-urlencoded\r\n";
          $str .= "Content-Length: ".strlen($strPostData)."\r\n";
          $str .= "Connection: close\r\n\r\n";
          $str .= $strPostData;
          fwrite($fp, $str);
          $result = '';
          while (!feof($fp))
          {
             $result .= fgets($fp, 128);
          }
          fclose($fp);
          $response = explode("\r\n\r\n", $result);
          $output = '<pre>'.print_r($response[1], 1).'</pre>';
       } else {
          echo 'Connection Failed! '.$errstr.' ('.$errno.')';
       }
    }

При помощи входящего вебхука

PHP скрипт входящего вебхука и принцип его работы был рассмотрен ранее в статье «Автоматическое создание лидов в Битрикс24 при помощи входящего вебхука».

Для того чтобы активировать работу данного скрипта, необходимо создать вебхук в самом Битрикс24 и получить [идентификатор_пользователя] и [код_вебхука]. Как это сделать можно узнать здесь: «Как создать входящий вебхук».

Объединение хука и PHP скрипта

Рассмотрев PHP скрипт входящего вебхука для отправки данных в Bitrix24, хук для перехвата введенных данных из Contact Form 7, активировав входящий вебхук и получив [идентификатор_пользователя] и [код_вебхука], можно перейти к объединению данных двух функций. При этом необходимо будет учесть последовательность функций в коде, которая будет иметь следующий вид:

  1. вызов функции для перехвата данных;
  2. перехват данных из Contact Form 7;
  3. формирование URL в переменной $queryUrl;
  4. формирование параметров для создания лида в переменной $queryData;
  5. обращение к Битрикс24 при помощи функции curl_exec;

Таким образом мы получим код следующего вида:

// Вызываем функцию для перехвата данных
add_action( 'wpcf7_mail_sent', 'your_wpcf7_mail_sent_function' );
function your_wpcf7_mail_sent_function( $contact_form ) {
  // Перехватываем данные из Contact Form 7
  $title = $contact_form->title;
  $posted_data = $contact_form->posted_data;
  //Вместо "Контактная форма 1" необходимо указать название вашей контактной формы
  if ('Контактная форма 1' == $title ) {
    $submission = WPCF7_Submission::get_instance();
    $posted_data = $submission->get_posted_data();
    // Далее перехватываем введенные данные в полях Contact Form 7:
    // 1. Перехватываем поле [your-name]
    $firstName = $posted_data['your-name'];
    // 2. Перехватываем поле [your-message]
    $message = $posted_data['your-message']; 
    
    // Формируем URL в переменной $queryUrl для отправки сообщений в лиды Битрикс24, где
    // указываем [ваше_название], [идентификатор_пользователя] и [код_вебхука]
    $queryUrl = 'https://[ваше_название].bitrix24.ru/rest/[идентификатор_пользователя]/[код_вебхука]/crm.lead.add.json';
    // Формируем параметры для создания лида в переменной $queryData
    $queryData = http_build_query(array(
      'fields' => array(
        // Устанавливаем название для заголовка лида
        'TITLE' => 'Название лида с сайта',
        'NAME' => $firstName,
        'COMMENTS' => $message,
      ),
      'params' => array("REGISTER_SONET_EVENT" => "Y")
    ));
    // Обращаемся к Битрикс24 при помощи функции curl_exec
    $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);
    if (array_key_exists('error', $result)) echo "Ошибка при сохранении лида: ".$result['error_description']."
";
  }
}

Особенности для передачи номера телефона, email или мессенджера

При интеграции CF и Битрикс 24 с помощью входящего вебхука, необходимо учесть особенности передачи номера телефона, email или мессенджера.

Обратите внимание
При выборе интеграции с помощью входящего вебхука (в отличии от упрощенного Rest API), такие параметры как телефон, электронный адрес и мессенджеры имеют множественные значения и другие поля по умолчанию: PHONE, EMAIL, IM. Поэтому для передачи данных значений необходимо передавать их в массиве.
Пример,

'EMAIL' => Array(
    "n0" => Array(
        "VALUE" => "email-1@mail.ru",
        "VALUE_TYPE" => "WORK",
    ),
    "n1" => Array(
        "VALUE" => "email-2@mail.ru",
        "VALUE_TYPE" => "HOME",
    ),
),
'PHONE' => Array(
    "n0" => Array(
        "VALUE" => "+74957778899",
        "VALUE_TYPE" => "WORK",
    ),
    "n1" => Array(
        "VALUE" => "+79151112233",
        "VALUE_TYPE" => "MOBILE",
    ),
),

, где nX — это одно значение (телефона или электронной почты), которое всегда начинается с 0.

Даже если вы передаете всего лишь 1 номер телефона или адрес электронной почты, необходимо указывать его в массиве как n0.

Таким образом, для передачи хотя бы одного телефона и адреса электронной почты, код будет иметь следующий вид:

// формируем URL в переменной $queryUrl
$queryUrl = 'https://[ваше_название].bitrix24.ru/rest/[идентификатор_пользователя]/[код_вебхука]/crm.lead.add.json';
// формируем параметры для создания лида в переменной $queryData
$queryData = http_build_query(array(
  'fields' => array(
    'TITLE' => 'Название лида',
    'EMAIL' => Array(
           "n0" => Array("VALUE" => $mail, "VALUE_TYPE" => "WORK")),
       'PHONE' => Array(
           "n0" => Array("VALUE" => $phone, "VALUE_TYPE" => "WORK")),
  ),
  'params' => array("REGISTER_SONET_EVENT" => "Y")
));

// обращаемся к Битрикс24 при помощи функции curl_exec
$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);
if (array_key_exists('error', $result)) echo "Ошибка при сохранении лида: ".$result['error_description']."<br/>";

Если у Вас много форм

Советую использовать следующий код:

  1. // Bitrix24
  2. function bitrix_push_wpcf7_mail_sent_function($data){
  3.     $queryUrl = 'https://[ваш домен].bitrix24.ru/rest/[id]/[идентификатор вебхука]/crm.lead.add.json';
  4.     $curl = curl_init();
  5.     curl_setopt_array($curl, array(
  6.         CURLOPT_SSL_VERIFYPEER => 0,
  7.         CURLOPT_POST => 1,
  8.         CURLOPT_HEADER => 0,
  9.         CURLOPT_RETURNTRANSFER => 1,
  10.         CURLOPT_URL => $queryUrl,
  11.         CURLOPT_POSTFIELDS => $data,
  12.     ));
  13.     $result = curl_exec($curl);
  14.     curl_close($curl);
  15. }
  16.  
  17. add_action( 'wpcf7_mail_sent', 'your_wpcf7_mail_sent_function' );
  18. function your_wpcf7_mail_sent_function( $contact_form ) {
  19.  
  20.   $title = $contact_form->title;
  21.     $posted_data = $contact_form->posted_data;
  22.  
  23.     switch($title){
  24.         case 'Обратный звонок':
  25.             $submission = WPCF7_Submission::get_instance();
  26.             $posted_data = $submission->get_posted_data();
  27.             $queryData = http_build_query(array(
  28.                 'fields' => array(
  29.                     'TITLE'     => $title,
  30.                     'NAME'      => $posted_data['your-name'],
  31.                     'PHONE'     => array(
  32.                         array("VALUE" => $posted_data['your-tel'])
  33.                     ),
  34.                 ),
  35.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  36.             ));
  37.             bitrix_push_wpcf7_mail_sent_function($queryData);
  38.         break;
  39.  
  40.         case '5 минут разговоров':
  41.             $submission = WPCF7_Submission::get_instance();
  42.             $posted_data = $submission->get_posted_data();
  43.             $queryData = http_build_query(array(
  44.                 'fields' => array(
  45.                     'TITLE'     => $title,
  46.                     'NAME'      => $posted_data['your-name'],
  47.                     'PHONE'     => array(
  48.                         array("VALUE" => $posted_data['your-tel'])
  49.                     ),
  50.                 ),
  51.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  52.             ));
  53.             bitrix_push_wpcf7_mail_sent_function($queryData);
  54.         break;
  55.  
  56.         case 'home':
  57.             $submission = WPCF7_Submission::get_instance();
  58.             $posted_data = $submission->get_posted_data();
  59.             $queryData = http_build_query(array(
  60.                 'fields' => array(
  61.                     'TITLE'     => $title,
  62.                     'NAME'      => $posted_data['your-name'],
  63.                     'PHONE'     => array(
  64.                         array("VALUE" => $posted_data['your-tel'])
  65.                     ),
  66.                 ),
  67.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  68.             ));
  69.             bitrix_push_wpcf7_mail_sent_function($queryData);
  70.         break;
  71.  
  72.         case 'kontact forma':
  73.             $submission = WPCF7_Submission::get_instance();
  74.             $posted_data = $submission->get_posted_data();
  75.             $queryData = http_build_query(array(
  76.                 'fields' => array(
  77.                     'TITLE'     => $title,
  78.                     'NAME'      => $posted_data['your-name'],
  79.                     'PHONE'     => array(
  80.                         array("VALUE" => $posted_data['your-tel']),
  81.                     ),
  82.                     'EMAIL'     => array(
  83.                         array("VALUE" => $posted_data['email-495']),
  84.                     ),
  85.                     'COMMENTS' => $posted_data['textarea-999'],
  86.                 ),
  87.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  88.             ));
  89.             bitrix_push_wpcf7_mail_sent_function($queryData);
  90.         break;
  91.  
  92.         case 'popapforma':
  93.             $submission = WPCF7_Submission::get_instance();
  94.             $posted_data = $submission->get_posted_data();
  95.             $queryData = http_build_query(array(
  96.                 'fields' => array(
  97.                     'TITLE'     => $title,
  98.                     'NAME'      => $posted_data['your-name'],
  99.                     'PHONE'     => array(
  100.                         array("VALUE" => $posted_data['your-tel']),
  101.                     ),
  102.                 ),
  103.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  104.             ));
  105.             bitrix_push_wpcf7_mail_sent_function($queryData);
  106.         break;
  107.  
  108.         case 'popkatalog':
  109.             $submission = WPCF7_Submission::get_instance();
  110.             $posted_data = $submission->get_posted_data();
  111.             $queryData = http_build_query(array(
  112.                 'fields' => array(
  113.                     'TITLE'     => $title,
  114.                     'NAME'      => $posted_data['your-name'],
  115.                     'PHONE'     => array(
  116.                         array("VALUE" => $posted_data['your-tel']),
  117.                     ),
  118.                     'EMAIL'     => array(
  119.                         array("VALUE" => $posted_data['text-652']),
  120.                     ),
  121.                 ),
  122.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  123.             ));
  124.             bitrix_push_wpcf7_mail_sent_function($queryData);
  125.         break;
  126.  
  127.         case 'zayavka':
  128.             $submission = WPCF7_Submission::get_instance();
  129.             $posted_data = $submission->get_posted_data();
  130.             $queryData = http_build_query(array(
  131.                 'fields' => array(
  132.                     'TITLE'     => $title,
  133.                     'NAME'      => $posted_data['your-name'],
  134.                     'PHONE'     => array(
  135.                         array("VALUE" => $posted_data['your-tel']),
  136.                     ),
  137.                     'COMMENTS' => $posted_data['textarea-999'],
  138.                 ),
  139.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  140.             ));
  141.             bitrix_push_wpcf7_mail_sent_function($queryData);
  142.         break;
  143.  
  144.         case 'Каталог с ценами':
  145.             $submission = WPCF7_Submission::get_instance();
  146.             $posted_data = $submission->get_posted_data();
  147.             $queryData = http_build_query(array(
  148.                 'fields' => array(
  149.                     'TITLE'     => $title,
  150.                     'NAME'      => $posted_data['your-name'],
  151.                     'PHONE'     => array(
  152.                         array("VALUE" => $posted_data['your-tel']),
  153.                     ),
  154.                     'EMAIL'     => array(
  155.                         array("VALUE" => $posted_data['your-email']),
  156.                     ),
  157.                 ),
  158.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  159.             ));
  160.             bitrix_push_wpcf7_mail_sent_function($queryData);
  161.         break;
  162.  
  163.         case 'Обратный звонок':
  164.             $submission = WPCF7_Submission::get_instance();
  165.             $posted_data = $submission->get_posted_data();
  166.             $queryData = http_build_query(array(
  167.                 'fields' => array(
  168.                     'TITLE'     => $title,
  169.                     'NAME'      => $posted_data['your-name'],
  170.                     'PHONE'     => array(
  171.                         array("VALUE" => $posted_data['your-tel']),
  172.                     ),
  173.                 ),
  174.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  175.             ));
  176.             bitrix_push_wpcf7_mail_sent_function($queryData);
  177.         break;
  178.  
  179.         case 'Оставьте заявку на консультацию':
  180.             $submission = WPCF7_Submission::get_instance();
  181.             $posted_data = $submission->get_posted_data();
  182.             $file = $submission->uploaded_files();
  183.             $encode_file = base64_encode(file_get_contents($file['file-830']));
  184.             $queryData = http_build_query(array(
  185.                 'fields' => array(
  186.                     'TITLE'     => $title,
  187.                     'NAME'      => $posted_data['your-name'],
  188.                     'PHONE'     => array(
  189.                         array("VALUE" => $posted_data['your-tel']),
  190.                     ),
  191.                     'COMMENTS' => $posted_data['textarea-999'],
  192.                     'UF_CRM_1587135356' => array(
  193.                         'fileData'=>array($posted_data['file-830'], $encode_file)
  194.                     ),
  195.                 ),
  196.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  197.             ));
  198.             bitrix_push_wpcf7_mail_sent_function($queryData);
  199.         break;
  200.  
  201.         case 'Форма в контактах':
  202.             $submission = WPCF7_Submission::get_instance();
  203.             $posted_data = $submission->get_posted_data();
  204.             $queryData = http_build_query(array(
  205.                 'fields' => array(
  206.                     'TITLE'     => $title,
  207.                     'NAME'      => $posted_data['your-name'],
  208.                     'PHONE'     => array(
  209.                         array("VALUE" => $posted_data['your-tel']),
  210.                     ),
  211.                     'EMAIL'     => array(
  212.                         array("VALUE" => $posted_data['email-495']),
  213.                     ),
  214.                     'COMMENTS' => $posted_data['your-message'],
  215.                 ),
  216.                 'params' => array("REGISTER_SONET_EVENT" => "Y")
  217.             ));
  218.             bitrix_push_wpcf7_mail_sent_function($queryData);
  219.         break;
  220.     }
  221. }
  222.  
  223. //END Bitrix24
Оплата услуг