reCAPTCHA v3 - ошибка: клиенты reCAPTCHA не существуют - PullRequest
1 голос
/ 14 марта 2019

Прежде всего, я знаю, что та же проблема уже была обнаружена здесь: Ошибка: клиентов reCAPTCHA не существует (reCAPTCHA v3) Но поскольку ответы там не привели меня к решению, я попытал здесь удачу.


Поэтому я попытался использовать reCAPTCHA, так как я получаю много спам-писем из формы на моей веб-странице. В моей HTML-главе у меня есть этот код:

<script src="https://www.google.com/recaptcha/api.js?render=MY_SITE_KEY"></script>
<script>
grecaptcha.ready(function() {
  grecaptcha.execute("MY_SITE_KEY").then(function(token) {
    console.log(token);
  });
});
</script>

чтобы загрузить капчу и которая генерирует токен. Когда я отправляю свою форму, я вызываю следующий код AJAX:

$.ajax({
  type: 'POST',
  url: $(form).attr('action'),
  data: {
    name: name,
    email: email,
    message: message,
    captcha: grecaptcha.getResponse()
}).done(function(response){ ... })

и, наконец, в PHP я делаю следующее:

<?php

  $secret = "MY_SECRET_KEY";
  $response = $_POST["captcha"];
  $verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
  $captcha_success=json_decode($verify);

    if ($captcha_success->success==false) {
      echo "reCaptcha indentified you as a bot. We don't like bots here.";
    }
    else if ($captcha_success->success==true) {

      // MY WHOLE mail() function here

    }

?>

Когда я отправляю форму, я получаю сообщение об ошибке:

Uncaught Error: No reCAPTCHA clients exist.
    at Gw (recaptcha__de.js:511)
    at Object.Q5 [as getResponse] (recaptcha__de.js:519)
    at HTMLFormElement.<anonymous> (main.js:265)
    at HTMLFormElement.dispatch (jquery.min.js:3)
    at HTMLFormElement.q.handle (jquery.min.js:3)

Что я сделал не так? Я следовал инструкциям Googles, но, может быть, я что-то упустил.

1 Ответ

1 голос
/ 19 марта 2019

Вы можете повторно реализовать следующим способом:

<script src="https://www.google.com/recaptcha/api.js?render=MY_SITE_KEY"></script>
<script>
var grecaptchaSiteKey = 'MY_SITE_KEY';

var _RECAPTCHA = _RECAPTCHA || {};

_RECAPTCHA.init = function() {
    grecaptcha.ready(function() {
        grecaptcha.execute(grecaptchaSiteKey, {action: 'homepage'}).then(function(token) {
            if (jQuery(form)[0]) {
                if (jQuery('.grecaptchaToken')[0]) {
                    jQuery(form).find('.grecaptchaToken').remove();
                }

                jQuery(form).append('<input type="hidden" class="grecaptchaToken" name="grecaptchaToken" value="' + token + '" />');
            }
        });
    });
}

_RECAPTCHA.init();

</script>

После этого вы можете получить значение скрытого ввода и поместить его в полезную нагрузку Ajax.

Теперь, чтобы избежать ошибок при отправке второй формы, вы можете вызвать метод _RECAPTCHA.init (); в рамках успешного обратного вызова вызова Ajax.

...