Интеграция облачного Битрикс24 с Roistat


Передача номера визита Roistat в Битрикс Формах
Есть документация от Ройстат https://help.roistat.com/integrations/CRM_i_CMS/Bitriks24/Formy_Bitriks24._Vidzhet_na_sait/
Но она для старых CRM-форм, для новых CRM-форм не работает
для новых CRM-форм сделала так
<!-- BITRIX24 WIDGET INTEGRATION WITH ROISTAT -->
<script>
(function(w, d, s, h) {
   w.roistatLanguage = '';
   var p = d.location.protocol == "https:" ? "https://" : "http://";
   var u = "/static/marketplace/Bitrix24Widget/script.js";
   var js = d.createElement(s); js.async = 1; js.src = p+h+u; var js2 = d.getElementsByTagName(s)[0]; js2.parentNode.insertBefore(js, js2);
   })(window, document, 'script', 'cloud.roistat.com');
</script>
<!-- END BITRIX24 WIDGET INTEGRATION WITH ROISTAT -->

<script data-b24-form="click/5/j1mlqc" data-skip-moving="true">
    window.roistatVisitCallback = function (visitId) {
        //для формы
        window.addEventListener('b24:form:init', (event) => {
            let form = event.detail.object;            
            form.setProperty("roistatID",visitId);     
        });
        //для виджета
        window.addEventListener('b24:widget:init', (event) => {
            let form = event.detail.object;            
            form.setProperty("roistatID",visitId);            
        });
        //код формы
        (function(w,d,u){
                var s=d.createElement('script');s.async=true;s.src=u+'?'+(Date.now()/180000|0);
                var h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(s,h);
        })(window,document,'https://cdn-ru.bitrix24.ru/XXXXXX/crm/form/loader_5.js');     
        //код виджета
         (function(w,d,u){
               var s=d.createElement('script');s.async=true;s.src=u+'?'+(Date.now()/60000|0);
               var h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(s,h);
       })(window,document,'https://cdn-ru.bitrix24.ru/XXXXXX/crm/site_button/loader_3_yg4r7f.js');   
    }
</script>
<a href="#"  id="callbackhunterNew" style="display:none">Заказать обратный звонок</a>

Форма открывается по клику на кнопку, Битрикс пишет, что вставлять надо код перед КАЖДОЙ кнопкой, мне было лень искать гору кнопочек, тем более есть шанс пропустить
Сделала в подвале невидимую кнопку #callbackhunterNew, перед ней скрипт Битриксовский, остальные кнопки при клике вызывают клик данной кнопки, и, о чудо, открывается форма.

<script>
 jQuery("a[href^='https://nikaverro.bitrix24.ru/pub/form'], a[href='#callbackhunter']").click(function(e) {        
        e.preventDefault();
        document.getElementById('callbackhunterNew').click();        
    });
    jQuery("#callbackhunterNew").click(function(e) {
         e.preventDefault();
    })
</script>

Передача номера визита Roistat при звонке
Ройстат умеет по звонку через коллтрекинг создавать Лиды, но нам это не надо, потому что телефония Битрикс создает Лиды с нам нужной логикой.
Поэтому в сценарии коллтрегина "создавать сделку CRM" отключили.
Сделали в ройстате вебхук на сайт адрес_сайта/webhook.php?action=lead&type=call (не битрикс) при окончании звонка,
Webhook-уведомление от Roistat https://help.roistat.com/features/Calltracking/Rasshirennye_nastroiki_scenarija/Webhook-uvedomlenie/
Как создать лид написано тут как создать лид rest api + вебхук
а там скрипт форматирует все как надо и отправляет вебхук в Битрикс24 на обновление Лида со всякими УТМ-метками и прочей информацией из ройстата
$action = isset($_GET['action']) ? $_GET['action'] : null;
$type = isset($_GET['type']) ? $_GET['type'] : null;
$data = json_decode(trim(file_get_contents('php://input')), true);

if ($type == "call" && !empty($data)) {   
      //функция, которая делает запросы в Б24    
      function CurlBitrix24($method, $arData=array()){
      $queryUrl = "https://b24.alpha-soft.ru/rest/[ид пользователя]/[код вебхука]/".$method;   
      $curl = curl_init();
      curl_setopt_array($curl, array(
         CURLOPT_URL => $queryUrl,
         CURLOPT_SSL_VERIFYPEER => 0,
         CURLOPT_POST => 1,
         CURLOPT_HEADER => 0,
         CURLOPT_RETURNTRANSFER => 1,      
      ));
      if(!empty($arData)){
         curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($arData));
      }
      $result = curl_exec($curl);         
      curl_close($curl);
      return json_decode($result,true);
   }
   
   if(!empty($data['id']) && !empty($data['caller'])){
                //получаем лид 
       $arFilter = array(
         "!STATUS_ID"=>"CONVERTED",
         "TITLE"=>$data['caller']." - Входящий звонок", //телефония генерирует лиды с таким названием
         ">=DATE_CREATE"=> date("Y-m-d 00:00:00"),//чтоб не старые лиды         
       );
       $result = CurlBitrix24('crm.lead.list', array(
          "order" => array("ID"=>"DESC"),
                    "filter" => $arFilter,
                    "select" => array("ID","DATE_CREATE","UF_CRM_1616400954")
            ));
                //error_log( print_r($result, TRUE),3,"log.txt" );
                
              
            if(isset($result["result"][0]["ID"])){
                //если лид найден, то его апдейтим 
            $lead['COMMENTS'] = "Страница захвата: " . $data['landing_page'] ."<br>";   
           $lead['COMMENTS'] .= "Город: " . $data['city'] ."<br>";   
           $lead['UF_CRM_1616400954'] = $data['visit_id'];//свойство roistat в Б24 у лидов
           $lead['UTM_CAMPAIGN'] = $data["utm_campaign"];
           $lead['UTM_SOURCE'] = $data["utm_source"];
           $lead['UTM_CONTENT'] = $data["utm_content"];
           $lead['UTM_MEDIUM'] = $data["utm_medium"];
           $lead['UTM_SOURCE'] = $data["utm_source"];
           $lead['UTM_TERM'] = $data["utm_term"];
           $lead['WEB'] = $data["marker"];

           
             $result = CurlBitrix24('crm.lead.update', array(
          "id" => $result["result"][0]["ID"],
               "fields" => $lead,
               "params" => []
           ));

            }      
   }   

}