ошибка recaptcha v3 «отсутствует ответ на ввод»

#javascript #php #recaptcha

#javascript #php #recaptcha

Вопрос:

Я создаю форму для отправки электронных писем с помощью recaptcha. Все работало отлично, но я заметил, что recaptcha v3 работала всего 3 минуты и ее нужно было сбросить. Оттуда он начал выдавать ошибку «отсутствует ответ на ввод».

index.php

 <script>
  grecaptcha.ready(function() {
      grecaptcha.execute('key', {action: 'homepage'}).then(function(token) {
         document.getElementById('g-recaptcha-response').value=token;
      }); 
  });
  </script>

  <script>
    var callback = function() {
      grecaptcha.render('id-of-render-element', {
         'sitekey': 'key',
         'expired-callback': expCallback
       });
   };
   var expCallback = function() {
      alert("Your recatpcha has expired, please verify again ...");
      setInterval(function(){ grecaptcha.reset(); }, 5 * 60 * 1000 ); 
   };
  </script>

 <div id="id-of-render-element"></div>
<script src="https://www.google.com/recaptcha/api.js?onload=callbackamp;render=explicit" async defer></script>
  

класс captcha

 <?php

    class Captcha{

    public function getCaptcha($SecretKey){

        $Resposta = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=keyamp;response={$SecretKey}");
        $Retorno = json_decode($Resposta);
        return $Retorno;
    }

     public function returnCaptcha(){
         echo "entrou calss_captcha";
  $EnviaMail = False;
  $ObjCaptcha = new Captcha();
  $Retorno=$ObjCaptcha->getCaptcha($_POST['g-recaptcha-response']);
  var_dump($Retorno);
  if($Retorno->success == true amp;amp; $Retorno->score > 0.5){
      $EnviaMail = True;
  }else{
      $EnviaMail = False;
  }
  return $EnviaMail;
    }
    }

?>
  

Комментарии:

1. Использует ли ваш сайт SSL?

2. Нет, у меня нет ssl на моем веб-сайте.

Ответ №1:

Согласно комментарию пользователя, работающему для версии 2. Вам необходимо указать дополнительные параметры для вызова функции file_get_contents, и если на вашем сайте установлен SSL, то задайте параметры контекста.

 class Captcha{        
    public function getCaptcha($SecretKey){
        if($SecretKey){
            // Input data
            $secret = 'SECRET_KEY';
            $response = $SecretKey;
            $remoteip = $_SERVER['REMOTE_ADDR'];

            $url = "https://www.google.com/recaptcha/api/siteverify";

            $post_data = http_build_query(
                array(
                    'secret' => $secret,
                    'response' => $response,
                    'remoteip' => $remoteip
                )
            );
            $options=array(
                // If site has SSL then
                'ssl'=>array(
                    // In my case its /etc/ssl/certs/cacert.pem
                    'cafile'            => '/path/to/cacert.pem',
                    'verify_peer'       => true,
                    'verify_peer_name'  => true,
                ),
                'http' =>array(
                        'method'  => 'POST',
                        'header'  => 'Content-type: application/x-www-form-urlencoded',
                        'content' => $post_data
                )
            );
            $context  = stream_context_create( $options );
            $Resposta = file_get_contents( $url, false, $context );
            $Retorno = json_decode($Resposta);
            return $Retorno;
        }
    }
    public function returnCaptcha(){
        echo "entrou calss_captcha";
        $EnviaMail = False;
        $ObjCaptcha = new Captcha();
        $Retorno=$ObjCaptcha->getCaptcha($_POST['g-recaptcha-response']);
        var_dump($Retorno);
        if($Retorno->success == true amp;amp; $Retorno->score > 0.5){
            $EnviaMail = True;
        }else{
            $EnviaMail = False;
        }
        return $EnviaMail;
    }
}
  

Комментарии:

1. На моем веб-сайте нет SSL-сертификата, могу ли я решить проблему без SSL-сертификата?

2. Никаких проблем, которые вы можете, просто удалите ssl из массива

3. Я сделал это, и теперь я получаю новую ошибку «ошибка владельца сайта: недопустимый тип ключа» в div. Я использую Recaptcha v3, мне не нужен div для recaptcha для recaptcha, верно?

4. добавили ли вы свой веб-сайт (домен, т.Е. http:www.xyz.com ) на панели управления Google captcha? Вам необходимо убедиться, что ваш сайт добавлен в раздел доменов страницы Google reCAPTCHA, где вы сгенерировали ключ API и сохранили. Затем протестируйте еще раз

5. Да, я добавил это на панель мониторинга Google captcha. До того, как я попытался реализовать эту часть кода, чтобы срок действия recaptcha не истек, все работало нормально… Я понятия не имею, в чем проблема.