reCAPTCHA验证始终返回false且加载时出现ERR_EMPTY_RESPONSE求助
我帮你梳理下代码里的几个关键问题,这应该就是导致你一直得到fail结果和出现ERR_EMPTY_RESPONSE的核心原因:
1. 拼写错误(最直接的问题)
你代码里把success拼写成了succes(少了一个s)——不管是判断条件里的$response->{'succes'},还是SESSION赋值的"succes",都是拼写错误。Google的reCAPTCHA API返回的字段名是**success**,所以你永远取不到正确的验证结果,自然一直走else分支返回fail。
2. URL参数转义错误
你在拼接URL时用了&,这是HTML的转义字符,在PHP里直接拼接URL应该用&,否则Google的API无法正确解析你的请求参数,会返回无效响应甚至空内容,导致file_get_contents获取失败,进而json_decode返回false。
3. 布尔值判断逻辑错误
reCAPTCHA API返回的success是布尔类型(true/false),不是字符串'true'。你用字符串比较的方式会导致判断失效,应该直接和布尔值比较。
4. file_get_contents的兼容性问题
部分服务器会禁用allow_url_fopen配置,这时候file_get_contents无法请求外部URL,会返回false,引发ERR_EMPTY_RESPONSE。改用cURL发送请求兼容性更好,也能更清晰地排查请求错误。
5. 缺少用户IP参数(推荐补充)
Google官方推荐在验证请求中带上用户的IP地址(remoteip参数),这能提升验证的准确性和安全性,避免一些异常请求被误判。
修正后的完整代码
<?php session_start(); // 别忘了开启session,否则SESSION赋值无效 $secretKey = "***********"; $responseKey = $_POST['g-recaptcha-response']; $userIp = $_SERVER['REMOTE_ADDR']; // 正确拼接URL,使用&分隔参数,加上remoteip $url = "https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$responseKey}&remoteip={$userIp}"; // 改用cURL发送请求,兼容性更好 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 若服务器SSL验证有问题可开启,生产环境建议保持true $response = curl_exec($ch); curl_close($ch); // 先判断请求是否成功 if ($response === false) { $_SESSION['response'] = "request_fail"; // 请求本身失败 } else { $responseData = json_decode($response); // 检查json解码是否成功,以及success字段是否为true if ($responseData !== null && $responseData->success === true) { $_SESSION['response'] = "success"; } else { // 可以打印错误信息调试,比如$responseData->error-codes // var_dump($responseData->{'error-codes'}); $_SESSION['response'] = "fail"; } } ?>
额外调试建议
如果还是有问题,可以在代码里打印$response和$responseData,看看Google返回的具体内容:
var_dump($response); // 查看请求返回的原始内容 var_dump($responseData); // 查看解码后的对象
如果返回error-codes,可以对照Google的reCAPTCHA文档排查具体错误原因(比如密钥错误、响应过期等)。
内容的提问来源于stack exchange,提问作者SenTisso

