解码 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
如何检查 true
和 false
两者 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 string 但 echo 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
我不确定这是否在任何地方都有明确记录,但也许它应该更明显一点!
我有一个 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
如何检查 true
和 false
两者 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 string 但 echo 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
我不确定这是否在任何地方都有明确记录,但也许它应该更明显一点!