我正在测试我的用户登录/注册系统。我终于完成了表单,并且已经测试了一段时间。在完成表单之前,它已经可以正常工作了,并且在另一页上也可以正常工作,但是,在我的页面上注册无法正常工作。它一直将成功发送为错误。我的其他页面是联系表单,与我的注册页面没有什么不同。里面有所有相同的文件。
当我显然不是机器人,而我只是在测试自己的代码时,我的错误代码不断向我表明我是机器人。
我以为在最初将代码存储在目录中之前就没有问题了,所以我尝试了。
然后,我认为如果我更改了按键,那么也许我将设法使系统再次运行。那没用。
最后,我尝试重新整理我的html代码以使其正常工作,但这也不起作用。
现在,最疯狂的部分是,我仍然得到0.9(在recaptcha网站上检查)的分数,这足以让我作为人类通过,但它仍然给我JSON中的错误。
之前它运行良好,但是,一旦我开始对注册表格进行输入验证测试,它就开始将我的回复称为假。
这是我不断遇到的错误。我不太确定格式化JSON的方式。这是通过php函数var_dump
返回的。从技术上讲,它只是一行。
object(stdClass)#13 (2)
{
["success"]=> bool(false)
["error-codes"]=> array(1)
{
[0]=> string(22) "missing-input-response"
}
}
这是我在名为recaptcha.php的文件中拥有的脚本
<script src='https://www.google.com/recaptcha/api.js?render=<?php echo SITE_KEY; ?>'></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('<?php echo SITE_KEY; ?>', {action: 'homepage'}).then(function(token) {
document.getElementById('g-recaptcha-response').value=token;
});
});
</script>
编辑/
添加了一些其他代码。 一个PHP函数。常量SECRET_KEY被定义为另一个文件中的全局变量。
function getCaptcha($secretKey) {
$response =
file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=" . SECRET_KEY . "&response={$secretKey}");
$reCaptcha = json_decode($response);
return $reCaptcha;
}
这是我验证验证码的地方。
$reCaptcha = getCaptcha($_REQUEST['g-recaptcha-response']);
var_dump($reCaptcha);
如果有帮助。
我期望它变成["success"]=> bool(true)
,但是我什至没有丝毫线索。我已经准备好打电话给Google,以解决这个问题。有人可以帮忙吗?
答案 0 :(得分:0)
此错误意味着您没有将站点“秘密”参数传递给POST请求以: https://www.google.com/recaptcha/api/siteverify
检查“秘密”参数(在管理区域的设置屏幕中称为SECRET KEY)是否正确,并且已在POST请求中发送。
答案 1 :(得分:0)
好的,因此,在看了几件事之后,我发现了为什么它一直作为“缺少输入”的错误返回。
我的页面有两种形式,只有一种形式。
<form>
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response" />
</form>
<form>
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response" />
</form>
因为其中有两个,所以API不知道要区分哪个,并且没有给两个值分配相同的值,而是给了两个值。因此,为了解决此问题,我将JavaScript更改为此:
<script src='https://www.google.com/recaptcha/api.js?render=<?php echo SITE_KEY; ?>'></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('<?php echo SITE_KEY; ?>', {action: 'homepage'}).then(function(token) {
document.getElementById('g-recaptcha-response').value=token;
document.getElementById('g-recaptcha-response2').value=token;
});
});
</script>
我的输入表单看起来像这样:
<form>
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response" />
</form>
<form>
<input type="hidden" id="g-recaptcha-response2" name="g-recaptcha-response2" />
</form>
相同的值,但是放入两个单独的字段中。即使您仅将第二个字段用于一页,也可以将其保留在其中,因为它不会影响只有一个Recaptcha的页面。只要第一个字段用于存储令牌,并且在您的html中引用。我也在php中对此进行了更改。
$reCaptcha = getCaptcha($_REQUEST['g-recaptcha-response2']);
var_dump($reCaptcha);
我猜对于构建具有多种形式的页面的任何人,如果要使用Recaptcha,则需要区分两个不同的输入字段以接收令牌。在花了将近一天的时间之后,我不敢相信我花了这么长时间才弄清这么简单的东西。这样可以解决缺少输入的错误以及无效输入的错误。