Ошибка: клиенты reCAPTCHA не существуют (reCAPTCHA v3)

Я интегрировал reCAPTCHA v3 в одну из моих форм. В режиме onload в правом нижнем углу отображается токен и логотип Google CAPTCHA. Но когда я отправляю форму, в консоли появляется сообщение об ошибке "Ошибка: клиенты reCAPTCHA не существуют". Также, похоже, данные не извлекаются с помощью "g-recaptcha-response" и $_POST["g-recaptcha-response"] остается пустым.

Вот пример кода:

<script type="text/javascript">
    var ReCaptchaCallbackV3 = function() {
        grecaptcha.ready(function() {
            grecaptcha.execute("site_key").then(function(token) {
                console.log("v3 Token: " + token);
            });
        });
    };
</script>

<script src="https://www.google.com/recaptcha/api.js?onload=ReCaptchaCallbackV3&render=site_key"></script>

Он не производит никакого "g-recaptcha-response" при отправке формы.

Я не знаю много о Google ReCaptcha. Я следовал за предоставленной ими документацией и правильно использовал сайт и секретный ключ.

Кто-нибудь, пожалуйста, скажите мне, где может быть проблема и какое возможное решение?

8 ответов

Я полагаю, что эта ошибка возникает, когда reCaptcha api.js загружается, но ваш контейнер еще не представлен на странице (по крайней мере, для v2). Эта ошибка возникала в приложении React при переходе на страницу, а не при ее загрузке в качестве первого. Вместо того, чтобы использовать render=explicit и используя глобальное пространство имен onLoadCallbackЯ смог решить это, вручную отобразив элемент captcha.

Вместо создания <div class="g-recaptcha"></div>, дайте контейнеру div только идентификатор (<div id="recaptcha-container"></div>) и отобразить его в своем коде JS (например, в componentDidMount для приложения React):

grecaptcha.ready(function() {
  grecaptcha.render("recaptcha-container", {
    "sitekey": "your-site-key"
  });
});

Когда я столкнулся с этой проблемой с reCAPTCHA v3, это произошло потому, что я не передал ей правильный ключ сайта.

Вы пытались загрузить скрипт, прежде чем отправлять запрос?

<script src="https://www.google.com/recaptcha/api.js?onload=ReCaptchaCallbackV3&render=site_key"></script>
<script type="text/javascript">
    var ReCaptchaCallbackV3 = function() {
        grecaptcha.ready(function() {
            grecaptcha.execute("site_key").then(function(token) {
                console.log("v3 Token: " + token);
            });
        });
    };
</script>

У меня была эта проблема, потому что я звонил grecaptcha.reset(); когда на сайте не было активного рекапчи

grecaptcha.reset();
recaptcha__en.js:507 Uncaught Error: No reCAPTCHA clients exist.
    at MX (recaptcha__en.js:507)
    at Object.Zn [as reset] (recaptcha__en.js:514)
    at <anonymous>:1:13

Это также происходит в Recaptcha 2, прежде чем пользователь взаимодействует с ним. Итак, у меня есть кнопка отправки, которая запускает функцию JS, которая проверяет значение recaptcha. Чтобы решить проблему отсутствия клиента, я сделал:

try {
   data["reCaptcha"] = grecaptcha.getResponse();
} catch (err) {
   data["reCaptcha"] = "";
}

Затем объект данных отправляется внутреннему сценарию, который проверяет recaptcha. Серверная часть также проверяет, является ли поле пустым.

В моем случае присутствовал из предыдущего фрагмента кода, и я вызывал его программно.

Так как проверка капчи каждый раз происходит на лету. Сброс не потребовался.
После устранения этогоgrecaptcha.reset();мой код работает отлично.

Может эта подсказка кому поможет.

Я использовал React и иногда только рендерил мой контейнер для капчи. Исправлено скрытием кнопки капчи вместо ее отрисовки.

Мы получили это, потому что у нас есть вторая среда с другим доменом, и мы забыли добавить этот домен на сайт администратора reCaptcha. Решением было добавить новый домен в настройки. Шаги: Откройте www.google/recaptcha/admin/site. Выберите сайт, над которым вы работаете. Нажмите на шестеренку настроек. Добавьте домен в соответствующий раздел.

Другие вопросы по тегам