Подключаем reCAPTCHA 2 к формам 1С-Битрикс
Встроенная стандартная капча Битрикса все меньше стала помогать от спам-ботов в формах обратной связи. Сейчас наиболее распостранненный вариант защиты форм — это исползование Google reCAPTCHA, ниже инструкция как подключить ее к формам обратной связи 1С-Битрикс без использования плагинов.
На данный момент reCAPTCHA существует в версиях 2 и 3, мы будем подключать версию 2.
Шаг 1.
Регистрируем домен на сайте https://www.google.com/recaptcha/admin/ и получаем 2 ключа (ключ сайта и секретный ключ).
Шаг 2.
В header.php
вашего шаблона добавляем:
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
Шаг 3.
Заходим в шаблон формы, ищем где подключается стандартная капча и меняем все на:
<div class="g-recaptcha" id="g-recaptcha" data-sitekey="6LexQ88UAAAAAGPs1eC9GFv0thZ7bH56456456YbEU"></div>
"sitekey"
— это ключ сайта полученный при регистрации.
Должно получится что-то похожее:
if($arResult["isUseCaptcha"] == "Y")
{
?>
<div class="g-recaptcha" id="g-recaptcha" data-sitekey="6LexQ88UAAAAAGPs1eC9GFv0thZ7bH56456456YbEU"></div>
<?
} // isUseCaptcha
Не забудьте в настройках компонента указать «Использовать капчу».
Шаг 4.
Теперь в файл init.php
добавляем код (не забудьте заменить секретный ключ, на тот который получили при регистрации):
function my_onBeforeResultAdd($WEB_FORM_ID, &$arFields, &$arrVALUES)
{
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' => '6LexQ88UAsAAAAOl0oOlZaqddfedsrwt5Re2K3KO2V',
'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;
}
}
AddEventHandler('form', 'onBeforeResultAdd', 'my_onBeforeResultAdd');
Подробнее о файле init.php можно прочитать в обучающих материалах Битрикс https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2916
Теперь reCaptcha должна работать.
Проблема с формами в режиме ajax
Если ваша Битрикс форма работает в режиме ajax, то reCaptcha будет работать некорректно. Например при поялении ошибок валидации формы, reCaptcha не будет отображаться.
Я решил это так:
Сначала строчку
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
нужно добавить в сам шаблон формы, а не в файл header.php шаблона как указано в шаге № 2.
Дальше нужно отследить событие onAjaxSuccess и перерисовать капчу, я сделал это добавив в файл bitrix/templates/.default/js/common.js
код:
$(document).ready(function(){
…
…
//Добавляем этот код
BX.addCustomEvent('onAjaxSuccess', function(){
grecaptcha.render('g-recaptcha', {
'sitekey' : '6LexQ88UAAAAAGPs1eC9GFv0thZ7bHP2z6bIYbEU'
});
});
После этого reCaptcha заработала 🙂