解码 recaptcha return 值

Decoding recaptcha return values

我有一个 reCaptcha 服务在工作,但是通过 PHP 的 json_decode 函数传递 return 值给出了一些我不明白的结果。

如果 reCaptcha 有效,那么服务 returns { "success": true } - 我希望如此。

呼叫

print_r(json_decode($result, $assoc = true)); //where $result is the service call

给予

Array ( [success] => )

...但我期待 Array ( [success] => 1)(或类似)表示 true 值。

事实上,print_r(json_decode('{"success": true}', $assoc = true));确实returnArray ( [success] => 1 )

json reCaptcha returning 有何不同? (和/或我不明白什么?!)

我想这就是这里进一步混淆的原因:

echo(gettype($a->success));
echo($a->success === true);
echo($a->success === false);

然后我得到

boolean
1
1

如何检查 truefalse 两者 return true?!

更多信息

更令人困惑的是(至少对我来说),我也试过 var_dump:

echo($a);
var_dump($a);

哪个return

{ "success": true }
string(22) "{ "success": false }"

为什么var_dump中的json表示是false,而echo表示是true?!

我认为,您的主要问题是从 recaptcha 返回并保存在 $result 中的 JSON 是 { "success": false } 而不是 { "success": true }

这可以解释为什么你得到 Array ( [success] => ) 而不是 Array ( [success] => 1) 作为 echo false returns an empty stringecho true returns 1;

我尝试使用以下代码重现 recaptcha 的响应:

<html>
<head>
    <script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<body>
<form>
    <div class="g-recaptcha" data-sitekey="FILL_IN_YOUR_KEY"></div>
    <input type="submit">
</form>
</body>
</html>
<?php
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = ['secret' => 'FILL_IN_YOUR_SECRET', 'response' => $_GET['g-recaptcha-response']];

$options = ['http' => ['method' => 'POST', 'content' => http_build_query($data),],];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);

echo '$result var_dump:<br>';
var_dump($result);
echo '$result print_r:<br>';
print_r($result);
$object = json_decode($result);
echo '<br><br><br>$object var_dump:<br>';
print_r($object);
echo '<br>$object print_r:<br>';
var_dump($object);

如果成功,我得到的是:

万一失败:

在我的问题中,我可能应该说我正在使用受 this answer 启发的代码,并且我对 Google 验证服务的调用被封装在一个函数中。我已经意识到你只能调用此服务一次,但我每次调用该函数时都会调用它,所以我第二次调用该函数(即我第二次调用该服务)时,验证服务 做了 return false

我不确定这是否在任何地方都有明确记录,但也许它应该更明显一点!