Google reCaptcha v3将成功归为false

问题描述 投票:0回答:2

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

当我显然不是机器人时,我的错误代码一直向我显示我是一个机器人,而我只是在测试我自己的代码。

我之前想过,代码存储在目录中的位置存在问题,所以我试过了。

然后,我想如果我更改了密钥,那么也许我会设法让系统再次运行。那没用。

最后,我尝试重新安排我的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的地方。

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

如果这有帮助。

我期待它变成["success"]=> bool(true)但是,我甚至没有丝毫的线索有什么不对。我已经准备好让Google通过电话来解决这个问题。有人可以帮忙吗?

javascript php json error-code recaptcha-v3
2个回答
0
投票

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

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


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中改变了这一点。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.