1

我正在测试我的用户登录/注册系统。我终于完成了表格,我已经测试了一段时间了。在我完成表格之前它正在工作,它在另一个页面上工作得很好,但是,它在我的注册页面上不起作用。它一直将成功发送为假。我的另一个页面是一个联系表格,它与我的注册页面没有什么不同。它里面有所有相同的文件。

当我显然不是机器人并且我只是在测试自己的代码时,我的错误代码不断向我显示我是机器人。

之前我以为代码存储在目录中的位置有问题,所以我尝试了一下。

然后,我想如果我改变了密钥,那么也许我会设法让系统再次工作。那没有用。

最后,我尝试重新排列我的 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 打电话来解决这个问题。任何人都可以帮忙吗?

4

2 回答 2

0

此错误意味着您没有将站点“秘密”参数传递给 POST 请求: https ://www.google.com/recaptcha/api/siteverify

检查“秘密”参数(在管理区域的设置屏幕中称为 SECRET KEY)是否正确并在 POST 请求中发送。

于 2019-04-04T17:41:05.150 回答
0

好的,所以在查看了一些东西之后,我发现了为什么它一直作为“缺少输入”错误返回。

我有一页有两种形式,只有一个recaptcha。

    <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.ini 中改变了这个。

    $reCaptcha = getCaptcha($_REQUEST['g-recaptcha-response2']);
       var_dump($reCaptcha);

我猜对于任何构建具有多个表单的页面的人来说,如果你想使用recaptcha,你需要区分两个不同的输入字段来接收令牌。在花了将近一天的时间之后,我不敢相信我花了这么长时间才弄清楚这么简单的事情。这将解决缺失输入错误和无效输入错误。

于 2019-04-05T01:01:42.890 回答