@inviziblll

Почему google reCAPTCHA не правильно срабатывает?

Создал проверку с использованием google reCAPTCHA для сайта.

Тип reCAPTCHA:Версия 2 – невидимый значок.

Иногда при тестировании google reCAPTCHA у меня появляется сообщение: “Не удается связаться с сервисом reCAPTCHA. Проверьте подключение к Интернету и повторите попытку.”

Сайт работает на CMS Битрикс, но в обработке reCAPTCHA на сервере используется практически чистый PHP.

В чем может быть причина ошибки?

$captcha - PHP массив, который хранит публичный и секретный ключи
публичный ключ я подставляю в кнопку button в атрибут data-sitekey
я его получаю из PHP объекта конфигурации, где хранятся ключи

HTML код формы (упростил)

<?
// объект конфигурации Битрикс в котором хранятся ключи
$configuration = \Bitrix\Main\Config\Configuration::getInstance();
$captcha = $configuration->get('google_recaptcha');
?>

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<button class="g-recaptcha form__btn btn" id="feedback_send" data-size="invisible" data-sitekey="<?=$captcha['value']['public']?>" data-callback="onSubmit">Отправить<div class="decor">&gt;&gt;</div></button>


Обработчик срабатывает на событие onSubmit.

function onSubmit(token) { 
    if(token){        
        let err = 0;    
            err = err + checkFeedbackPhone(); // phone
            err = err + checkFeedbackEmail(); // email
            err = err + checkMessage(); // message
        if(err == 0){
           formAjax(token);
           toggelFiledError(err);
        }else{
            grecaptcha.reset();
            toggelFiledError(err);
        }
    }
}


// ajax функция отправки сообщения
formAjax: function(token) {
       
            let email =  $("#feedback input[name='email']").val(),
                phone = $("#feedback input[name='phone']").val(),
                iblock_id = $("#feedback input:hidden[name='iblock_id']").val(),
                google_recaptcha = token,
                message = $("#feedback textarea[name='message']").val();

            let formData = new FormData();
            if(inputFileCounter){ 
                let i = 1;
                const elementList = document.querySelectorAll('#feedback input[type="file"]');
                elementList.forEach(function(element) {
                    const file = element.files[0];
                    formData.append('file_v_'+i, file);
                    i++;
                });
            }         

            formData.append('email', email);
            formData.append('phone',  phone);
            formData.append('iblock_id',  iblock_id);
            formData.append('google_recaptcha',  google_recaptcha);
            formData.append('message',  message);
            let obj = this; 

            // отправляем через ajax             
            $.ajax({
                    url: arParamsFeedback['AJAX_FILE_PATH'],
                    type: "POST",
                    dataType : "json", 
                    cache: false,
                    contentType: false,
                    processData: false,         
                    data: formData, 
                    success: function(data){

                        grecaptcha.reset();

	       	 /**
		здесь получаем сообщение от бэкенда
**/
                    }
            });     

            return false;    
    }


Обработчик на сервере

// берем и сравниваем значения captcha
function post_captcha($google_recaptcha) {

        $configuration = Configuration::getInstance(); // объект конфигурации где хранятся ключи
        $captcha = $configuration->get('google_recaptcha');
        $result = false;
       
        if($captcha){  
            $httpClient = new HttpClient(); // класс Битрикс для работы с http
            $result = $httpClient->post( // отправляем на google запрос верификации
                'https://www.google.com/recaptcha/api/siteverify',
                array(
                    'secret' => $captcha['value']['secret'],
                    'response' => $google_recaptcha,
                    'remoteip' => $_SERVER['HTTP_X_REAL_IP']
                )
            );     
        }
        return json_decode($result, true);
}

$result = [];
$google_recaptcha = htmlspecialchars($_REQUEST['google_recaptcha']);
if($google_recaptcha){ // google captcha
    $res = post_captcha($google_recaptcha); 
    if (!$res['success'] || $res == false) {
        $result['recaptca_success'] = false;
        // Если капча не правильная
        $result['msg'] = "RECAPTCHA_ERROR";
        echo json_encode($result);
        die();

    } else {
        // Если капча правильная
        $result['recaptca_success'] = $res['success'];
        $result['msg'] = "RECAPTCHA_SUCCESS";
    }
}


В чем может быть причина сообщения, частые запросы?
  • Вопрос задан
  • 1887 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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