Подключаем Goolge reCAPTCHA 2 к формам 1С-Битрикс

Стандартная каптча, с вводом непонятных символов это уже "прошлый век". Чаще "каптчи" ставят на различные формы. А эти данные очень важны для владельца сайта, т.к. это может быть заказ услуги, обратная связь, регистрация в партнерском разделе и т.п. Важно что бы защита от ботов не стала проблемой для ваших посетителей.

Что бы установить Google recaptcha 2 на сайт необходимо:

  • Зарегистрировать сайт на https://www.google.com/recaptcha/admin и получить секретные ключи и инструкцию по установке
  • Действовать согласно инструкции.  :) Шучу. Подключаем js библиотеку в header.php или в component_epilog.php компонента с формой.
    <?\Bitrix\Main\Page\Asset::getInstance()->addJs('//www.google.com/recaptcha/api.js');?> 
  • В настройках компонента формы отключите стандартную каптчу.
  • В шаблоне формы находим место подключения стандартной каптчи и меняем на предложенный по инструкции код. Параметр data-sitekey у вас будет свой.
    <div class="g-recaptcha" data-sitekey="6Leh4iETAAAAAM6ybuqexxuK0Sc4Q4MBYK3xO3JZ"></div>
  • Если ваша форма загружается с помощью ajax, просто подключите скрипт api.js в форме, а не в шаблоне сайта.
    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
  • Для изменения размера каптчи можно использовать параметр "data-size", либо с помощью css
    <div class="g-recaptcha" data-size="compact" ... 
     
    .g-recaptcha { 
    	transform:scale(0.77);
    	transform-origin:0 0; 
    }
  • Добавляем обработчик добавления элементов в init.php и смотрим прошел ли пользователь проверку. Не забудьте заменить секретный ключ и ID инфоблока.
    <?
    	AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "checkGoogleCaptcha");
    
    	function checkGoogleCaptcha(&$arFields) {
    		if ($arFields['IBLOCK_ID'] == 6 && $_REQUEST['iblock_submit']) {
    			global $APPLICATION;
    			if ($_REQUEST['g-recaptcha-response']) {
    				$httpClient = new \Bitrix\Main\Web\HttpClient;
    						$result = $httpClient->post(
    							'https://www.google.com/recaptcha/api/siteverify',
    							array(
    								'secret' => '6Leh4iETAAAAAO7ynh2PqbbB777777noIG0tc',
    								'response' => $_REQUEST['g-recaptcha-response'],
    								'remoteip' => $_SERVER['HTTP_X_REAL_IP']
    					 	)
    				);
    				$result = json_decode($result, true);
    				if ($result['success'] !== true) {
    					$APPLICATION->throwException("Вы не прошли проверку подтверждения личности");
    					return false;
    				}
    			} else {
    				$APPLICATION->throwException("Вы не прошли проверку подтверждения личности");
    				return false;
    			}
    		}
    	}
    ?>
  • Если форма загружается ajax`ом не забудьте обновить каптчу с помощью js-метода grecaptcha.reset();