我以一种形式集成了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不太了解。我遵循了他们提供的文档,并以适当的方式使用了站点和密钥。
有人可以告诉我问题出在哪里以及可能的解决方法是什么
答案 0 :(得分:2)
我遇到了这个问题,因为当站点上没有任何Recaptcha激活时,我正在打电话给class ModelB(models.Model):
fieldB1 = models.CharField(max_length=20)
fieldB2 = models.ForeignKey(modelA)
def clean(self):
"""
Validate 'fieldB1', 'fieldB2' and 'fieldB2__fieldA2' are unique together
"""
# first, check that foreign keys fields exist. Must use '_id', or else a RelatedObjectDoesNotExist error will be raised
if self.fieldB2_id and self.fieldB2.field_A2_id:
if self.__class__.objects.filter(fieldB1=self.fieldB1, fieldB2=self.fieldB2, fieldB2__fieldA2=self.fieldB2.fieldA2).exists():
raise ValidationError(
_('Instance of ModelB with fieldB1, fieldB2 and fieldB2.fieldA2 already exists.'),
code='unique_together',
)
grecaptcha.reset();
答案 1 :(得分:1)
在用户与Recaptcha 2进行交互之前,也会发生这种情况。因此,我有一个提交按钮,该按钮触发一个JS函数来检查recaptcha的值。为了解决没有客户存在的问题,我做了:
try {
data["reCaptcha"] = grecaptcha.getResponse();
} catch (err) {
data["reCaptcha"] = "";
}
然后,将数据对象发送到验证Recaptcha的后端脚本。后端还检查该字段是否为空。
答案 2 :(得分:1)
我相信在加载reCaptcha api.js时会发生此错误,但是您的容器尚未出现在页面上(至少对于v2而言)。当我导航到页面而不是首先加载页面时,我在React应用程序中发生了此错误。无需使用render=explicit
和全局命名空间onLoadCallback
,我能够通过手动呈现captcha元素来解决它。
与其创建<div class="g-recaptcha"></div>
,不如给容器div一个id(<div id="recaptcha-container"></div>
),然后在您的JS代码中呈现它(例如,在React应用的componentDidMount
中):>
grecaptcha.ready(function() {
grecaptcha.render("recaptcha-container", {
"sitekey": "your-site-key"
});
});
答案 3 :(得分:0)
您是否尝试过在尝试发送请求之前加载脚本?
<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>
答案 4 :(得分:0)
当我在reCAPTCHA v3中遇到此问题时,是因为我没有将正确的站点密钥传递给它。
答案 5 :(得分:0)
我正在使用React,有时只渲染我的验证码容器。通过隐藏验证码按钮而不是不显示按钮来解决。