Ошибка: клиенты 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. Выберите сайт, над которым вы работаете. Нажмите на шестеренку настроек. Добавьте домен в соответствующий раздел.