@Yura0103

Как подключить reCAPTCHA v3 к форме 1С Битрикс?

Пытаюсь разобраться как прикручивать reCAPTCHA v3 к простой форме обратной связи. На текущий момент вот что получилось реализовать на пару с Интернетом.

1) Страница непосредственно с формой
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallbackRecap&render=6LfufSsqAAAAAO2YPDSvJYyIMkn******-m2pqw" async defer></script>
<div class="my_form">
<input type="text" name="user" id="user">
<input type="text" name="email" id="email">
<input type="text" name="reviews" id="reviews">	
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
<button class="add-reviews">Отправить</button>
</div>

$(document).ready(function(){
	$(".add-reviews").on("click", function(){
		var $user= $('#user').val();
		var $email = $('#email').val();
		var $reviews = $('#reviews').val();
		var $arr = [$user, $email, $reviews];
			$.ajax({
				url: '/about/reviews/send-reviews.php',
				type: 'POST',
				cache: false,
				data: {arr: $arr},										
					}).done(function(data){
						
				
						$('#result').val('result');
					});
		});	
	var onloadCallbackRecap = function() {
	grecaptcha.ready(function () {
	grecaptcha.execute('6LfufSsqAAAAAO2YPDSvJYyIMkn******-m2pqw', { action: 'contact_callback' }).then(function (token) {
	var recaptchaResponse = document.getElementById('recaptchaResponse');
	recaptchaResponse.value = token;
			});
		});
	};
});

2. Страница проверки и отправки сообщения
if (isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_SERVER["REQUEST_METHOD"] == "POST" && is_array($_POST["CALLBACK"]) && isset($_POST['recaptcha_response'])) {
header("Cache-Control: no-store, no-cache, must-revalidate");
 
$recaptcha_key = '6LfufS****AAAPonK6L66LF1PTgQ6OaVY*******';
 
 
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_params = [
'secret' => $recaptcha_key,
'response' => $_POST['recaptcha_response'],
'remoteip' => $_SERVER['REMOTE_ADDR'],
];
 
$ch = curl_init($recaptcha_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $recaptcha_params);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
$response = curl_exec($ch);
if (!empty($response)) {
$decoded_response = json_decode($response);
}
 
$recaptcha_success = false;
//dbg2f($decoded_response, 'responce');
 
if ($decoded_response && $decoded_response->score > 0) {
$recaptcha_success = $decoded_response->score;


	$NAME = $_POST['arr'][0];	
	$EMAIL = $_POST['arr'][1];	
	$REVIEWS =  $_POST['arr'][2];


	$arEventFeilds = array(
		"NAME"=>$NAME,
		"EMAIL"=>$EMAIL,
		"REVIEWS" => $REVIEWS
		);
	
} else {
	print_r('Привет БОТ');
// прописываем действие, если пользователь оказался ботом
}
 
 
if($recaptcha_success > 0.5) CEvent::Send("NEW-TEMPLATES", "s1", $arEventFeilds, "N", "18");
 
echo json_encode($arr);
 
return;
}


В результате сообщение не отправляется . И ошибок в консоли нет после клика по кнопке "Отправить"
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 1
CEvent::Send() только ставит сообщение в очередь ( читай "пишет в таблицу в БД"). А отправлено оно будет только на следующем хите, если повезёт.
Для немедленной отправки используйте CEvent::SendImmediate()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы