У меня работает служба 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 )
Чем отличается json reCaptcha? (и/или что я не понимаю?)
Я предполагаю, что дальнейшая путаница здесь:
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 }"
почему json-представление в var_dump
false
когда echo
показывает, что это true
?!
В моем вопросе я должен был, наверное, сказать, что я использовал код, вдохновленный этим ответом, и что мой звонок в службу проверки Google был завернут в функцию. Я понял, что вы можете только однажды называть эту услугу один раз, но я вызывал ее каждый раз, когда я вызывал функцию, и поэтому во второй раз, когда я вызывал эту функцию (то есть во второй раз, когда я вызывал эту услугу), служба проверки return false
Я не уверен, что это явно документировано где угодно, хотя, возможно, это должно было быть немного более очевидным!
Я думаю, ваша главная проблема заключалась в том, что JSON вернулся из recaptcha и сохранил в $result
было { "success": false }
а не { "success": true }
.
Это объясняет, почему вы получили Array ( [success] => )
а не Array ( [success] => 1)
поскольку echo false
возвращает пустую строку, но 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);
И я получил это в случае успеха:
И это в случае отказа:
false
значение. Я узнал почему (это было действительно глупо) и добавил это как ответ