我有一个reCaptcha服务正在运行,但是通过PHP的json_decode
函数传递返回值会给出一些我不明白的结果。
如果reCaptcha有效,则服务返回{ "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));
确实返回Array ( [success] => 1 )
reCaptcha返回的json有什么不同? (和/或我未能理解的是什么?!)
我想这就是进一步的混乱:
echo(gettype($a->success));
echo($a->success === true);
echo($a->success === false);
然后我得到
boolean
1
1
对true
和false
的检查如何返回true
?!
更多信息
更令人困惑的是(至少对我而言),我也试过了var_dump
:
echo($a);
var_dump($a);
返回
{ "success": true }
string(22) "{ "success": false }"
当var_dump
显示false
时,为什么echo
true
中的json表示?{!
答案 0 :(得分:1)
我认为,您的主要问题是从recaptcha返回并保存在$result
中的JSON是{ "success": false }
而不是{ "success": true }
。
这可以解释为什么Array ( [success] => )
而非Array ( [success] => 1)
为echo false
returns an empty string,但echo true
返回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);
我得到的是成功案例:
这是在失败的情况下:
答案 1 :(得分:0)
在我的问题中,我应该说我正在使用受this answer启发的代码,并且我对Google验证服务的调用包含在一个函数中。我已经意识到你只能调用一次这个服务,但每次调用该函数时我都会调用它,所以第二次调用函数(即第二次调用服务)时,验证服务< em>做了返回false
我不确定这在任何地方是明确记录的,尽管可能它应该更明显一些!