Генератор паролей

QR код для входа для воронки мероприятий

битрикс24 коробка

Задача:
сделать воронку мероприятий с  QR-кодом для входа
есть битриксовский функционал по отправке QR кода, но хотелось что-то более настраиваемое
Сделали на смарт-процессах
2 воронки
  • мероприятие с данными по мероприятию
  • заявки на посещение
сделали 2 CRM формы
  • для ранней регистрации в скрытом (автозаполнение) поле указывается ID мероприятия и при создании заявки подтягиваются все данные по мероприятию в заявку (через БП).
  • для регистрации на мероприятии (в туже воронку, но переходит сразу на нужную стадию)
Уведомления отправляются на почту и смс через роботы и БП
Ниже формирование qr-кодов, ссылок


функция для БП
//генерация QR кода для прохождения на мероприятия /page/meropriyatie/registratsiya_na_meropriyatie/
//запускается из БП  /crm/configs/bp/CRM_DYNAMIC_173/edit/341/


function generateQRcodeForEvents($id){    
    require_once($_SERVER['DOCUMENT_ROOT'] .'/eventcode/phpqrcode/qrlib.php'); 
    if(CModule::IncludeModule('crm')){
        $smartTypeId = 173; //регистрация на мероприятие
        $factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($smartTypeId);
        $item = $factory->getItem($id);
        if(!empty($item)){  
            $link = "https://nikaverro.ru/eventcode/?id=".$id."&c=".hash_hmac('sha256', $id, '_SECRET_KEY_'); //ссылка, которую зашиваем в QR код        

            $fileName = '173_'.$id.'.png'; //имя файла
            $pngAbsoluteFilePath = $_SERVER["DOCUMENT_ROOT"]."/upload/qr_event/".$fileName; //путь на сервере          
            if (!file_exists($pngAbsoluteFilePath)) {
                QRcode::png($link, $pngAbsoluteFilePath,QR_ECLEVEL_L, 7);
            }    
            

            $fields = [
                'UF_CRM_8_1724504387273' => CFile::MakeFileArray($pngAbsoluteFilePath), //поле типа файл c QR кодом
            ];
            $item->setFromCompatibleData($fields);

            $item->set("UF_CRM_8_1724504373103", $link); //ссылка, которую зашиваем в QR код


            $operation = $factory->getUpdateOperation($item);
            $operation->disableAllChecks();
            $result = $operation->launch();

            $fileId = $item->getUfCrm_8_1724504387273(); 
            
            if(!empty($fileId)){                
                
                $code = substr(hash_hmac('sha256', $fileId, '_SECRET_KEY_'),0,8);
                $item->set("UF_CRM_8_1725458779", "https://nikaverro.ru/eventcode/qr/?id=".$fileId."&c=".$code); //ссылка на QR код для мобильных
                
                $operation = $factory->getUpdateOperation($item);
                $operation->disableAllChecks();
                $result = $operation->launch();                   
                
            }    
        }
        
    }    

}


страница для мобильных с QR кодом (ссылку отправляем через смс)
/eventcode/qr/index.php
<?
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
?>
<!DOCTYPE html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Билет для входа</title>
    <link rel="stylesheet" href="style.css">    
  </head>
  <body>
   <div id='qr'>
      <img src="/eventcode/logo.png" alt='logo'>
      <br>
      <?if(
         !empty($_GET['id']) && 
         !empty($_GET['c']) && 
         ($_GET['c']==substr(hash_hmac('sha256', $_GET['id'], '_SECRET_KEY_'),0,8))
      ):
          $arFile = CFile::GetFileArray($_GET['id']);       
          if(!empty($arFile["SRC"]) && (strpos($arFile["SRC"],"/upload/qr_event/")!==false)):?>             
                 <img src="<?=$arFile["SRC"]?>" alt='qr'>
          <?endif;
      else:?>   
           <h1>Неправильная ссылка</h1>     
      <?endif;?>
   </div>   
</body>   
</html>

страница, на которую ведет QR код
/eventcode/index.php
<?require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Билет для входа</title>
    <link rel="stylesheet" href="styles/style.css">    
</head>
<body>
     <?global $USER;
   if(!$USER->IsAuthorized()):?>
      <h1>Покажите билет сотруднику</h1>
      <br><br>
      <a href='https://nikaverro.ru/'>Авторизация</a>

   <?else:
      $arGroups = $USER->GetUserGroupArray();
      if($USER->IsAdmin() || in_array(23,$arGroups)):       
         if(!empty($_GET['id'])&& !empty($_GET['c']) && ($_GET['c']==hash_hmac('sha256', $_GET['id'], 'hellonika'))):
            $id = $_GET['id'];
            if(CModule::IncludeModule("crm")):         
               $smartTypeId = 173; //регистрация на мероприятие
               $arResult = [];

               $factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($smartTypeId);
                $item = $factory->getItem($id);
                $dateEvent = new DateTime($item->getUfCrm_8_1695216356047());
                $stageId = $item->getStageId();

                if(in_array($stageId,["DT173_11:UC_DX6KLM","DT173_11:SUCCESS","DT173_11:FAIL"])):?>
                   <h1>Такая регистрация уже существует, зарегистрируйтесь еще раз</h1>   

                <?else:             
                   $today = new DateTime("+6 hours"); //время амурской области

                   if($dateEvent->modify("-2 hours") > $dateEvent):
                      $item->setStageId("DT173_11:UC_DX6KLM");
                      $item->save();?>
                      <h1>Регистрация <?=$id?>  успешно пройдена </h1>
                   <?else:?>
                      <h1>Пройти на мероприятие можно за 2 часа</h1>
                      <div>Провести билет можно с: <b><?=$dateEvent->format("d.m.Y H:i:s")?></b></div>
                      <div>сейчас: <?=$today->format("d.m.Y H:i:s")?></div>
                   <?endif;?>
               <?endif;?>           
                
            <?else:?>
               <h1>Билет <?=$id?>. У сотрудника нет прав.</h1>   
            <?endif;?>      
         <?else:?>
            <h1>Недействительный билет</h1>
         <?endif;?>
      <?else:?>      
            <h1>Привет, <?=$USER->GetFirstName()?>!</h1>
            <div>Не хватает прав доступа для работы с билетами. Обратитесь к администратору портала</div>

      <?endif;?>   
   <?endif;?>      
</body>   
</html>