Процесс получения ключей reCAPTCHA v3 довольно прост и описан на многих сайтах, поэтому не будем на этом останавливаться.
Оставим только ссылку на сервис reCAPTCHA:
https://www.google.com/recaptcha/admin/Итак мы получили ключ сайта и секретный ключ
Во время своей работы reCAPTCHA v3 собирает данные о взаимодействии с сайтом и формирует специальную строку — токен.
Токен необходимо передать на сервер, обслуживающий сайт, сервер с применением секретного ключа делает запрос к сервису reCAPTCHA v3. Ответ содержит число в диапазоне от 0 (бот) до 1 (человек). Далее вы самостоятельно определяете проходное значение для своего сайта.
Исходя из этой информации сервер "решает" — обрабатывать или нет полученный от пользователя запрос
Если на вашем сайте под управлением 1С-Битрикс используется компонент Веб-формы, то наиболее простым решением будет использование решений из Маркетплейса, которые заменяют стандартную капчу на reCaptcha.
Далее рассмотрим пример подключения reCAPTCHA v3 для сайта под управлением БУС 1С-Битрикс, для случая когда используются формы не на основе компонента Веб-формы. Обращаем внимание что часть кода для reCAPTCHA помечена соответствующими комментариями в начале и в конце. А некоторые строки закомментированы.
В файле footer.php шаблона размещаем полученный ключ сайта
<script type="text/javascript">
//popup order
$('#popup-order1').dialog({
autoOpen: false,
modal: true,
resizable: false,
draggable: false,
width: 300,
show: { effect: "fade", duration: 400 },
hide: { effect: "fade", duration: 400 },
dialogClass: '',
title: ''
})
$('.js-btn-popup-order1').on('click', function() {
$('#popup-order1').dialog('open');
return false;
})
$('#form1').each(function(){
var $form = $(this),
$inpRequ = $form.find('.reqired'),
init = function(){
$form.on('submit', submit);
$inpRequ.on('focusin', focusIn);
},
submit = function(e){
e.preventDefault();
var error = false;
$inpRequ.each(function(){
if ($(this).val() == '') {
$(this).addClass('inp-error');
error = true;
}
});
if (!error) {
//$.post($form.attr('action'), $form.serialize()); комментируем
//$(this).addClass('frm-succefull'); комментируем
//recaptcha start
if ($form.find('.g-recaptcha-token').length) {
grecaptcha.execute('6LcDZ2....b8b9K', {action:'validate_captcha'})//КЛЮЧ САЙТА
.then(function(token) {
$form.find('.g-recaptcha-token').val(token);
postForm();
});
}
else
postForm();
}
},
postForm = function(){
$.post($form.attr('action'), $form.serialize(), function(result){
if (result) {
if (result.success)
$form.addClass('frm-succefull');
else
{
$form.addClass('error');
$form.find('.frm-error .details').text(result.error);
}
}
else
{
$form.addClass('error');
$form.find('.frm-error .details').text('Неизвестная ошибка');
}
}, 'json');
},//recaptcha end
focusIn = function(){
$(this).removeClass('inp-error');
};
init();
});
</script>
В нашем случае обработчик формы указан в теге формы <form action="send.php"....
. Вносим изменения в файл send.php, расположенный в корне сайта
<?
//recaptcha блок получения оценки капчи (score) капчи - значение score можно изменять от 0 до 1
$capcha_ok = false;
$google_response = null;
if (@$_POST['g-recaptcha-token'])
{
$google_response = file_get_contents(
"https://www.google.com/recaptcha/api/siteverify?secret=".
'6LcDZ2Yp....o6'. //СЕКРЕТНЫЙ КЛЮЧ
"&response=" . @$_POST['g-recaptcha-token'].
"&remoteip=" . $_SERVER['REMOTE_ADDR']
);
$google_response = json_decode($google_response);
if ($google_response && $google_response->success && $google_response->score > 0.4)
$capcha_ok = true;
}
if ($capcha_ok)
{//recaptcha конец получения оценки
//require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");//добавляем вместо предыдущей строки
$strEmail = COption::GetOptionString("main", "email_from", "");
if(SITE_CHARSET == "windows-1251")
.........
$success = mail($strEmail, $subject, $template, $headers);
//echo ($success) ? 'true' : 'false'; комментируем
//recaptcha сообщения отправки формы
if ($success)
echo json_encode(['success' => true, 'score' => $google_response ? $google_response->score : null]);
else
echo json_encode(['success' => false, 'error' => 'Ошибка отправки письма', 'score' => $google_response ? $google_response->score : null]);
}
else
echo json_encode(['success' => false, 'error' => 'Ошибка прохождения капчи', 'score' => $google_response ? $google_response->score : null]);
//recaptcha end
//require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); комментируем
?>
Проверка полученного значения score и прохождения капчи в консоли Google Chrome