
本文详解 ReCaptcha V2 在 PHP 后端验证时始终返回 false 的根本原因(错误使用 GET 请求调用 Google 验证接口),并提供符合官方规范的安全、可靠验证实现。
本文详解 recaptcha v2 在 php 后端验证时始终返回 `false` 的根本原因(错误使用 get 请求调用 google 验证接口),并提供符合官方规范的安全、可靠验证实现。
Google reCAPTCHA v2 的服务端验证接口 https://www.google.com/recaptcha/api/siteverify 明确要求使用 POST 方法提交数据,而原代码中通过 file_get_contents() 拼接 URL 的方式实际发起了 GET 请求,这会导致 Google 服务器拒绝验证或返回无效响应(如 {"success": false, "error-codes": ["invalid-input-response"]}),进而使 intval($responseKeys["success"]) !== 1 恒为真,始终触发“请勾选验证码”错误。
✅ 正确做法:使用 cURL 发起标准 POST 请求
以下为修复后的 PHP 验证核心逻辑(兼容 PHP 7.2+,含错误处理与最佳实践):
// 获取用户提交的 reCAPTCHA 响应值
$captcha = $_POST['g-recaptcha-response'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
// 必须校验响应非空
if (empty($captcha)) {
http_response_code(400);
echo 'Please check the reCAPTCHA box.';
exit;
}
// 配置 Secret Key(务必从环境变量或配置文件读取,禁止硬编码)
$secretKey = 'YOUR_SECRET_KEY_HERE'; // 替换为你的密钥
// 使用 cURL 发起 POST 请求(推荐方式)
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'secret' => $secretKey,
'response' => $captcha,
'remoteip' => $ip
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true, // 强烈建议开启 SSL 验证
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 检查网络请求是否成功
if ($response === false || $httpCode !== 200) {
http_response_code(500);
echo 'reCAPTCHA verification service unavailable.';
exit;
}
// 解析 JSON 响应
$verification = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(500);
echo 'Invalid reCAPTCHA response format.';
exit;
}
// 最终验证逻辑:success 必须为布尔 true(注意不是字符串 "true" 或整数 1)
if (!isset($verification['success']) || $verification['success'] !== true) {
$errors = $verification['error-codes'] ?? ['unknown-error'];
http_response_code(400);
echo 'reCAPTCHA validation failed: ' . implode(', ', $errors);
exit;
}
// ✅ 验证通过,继续处理表单逻辑...
⚠️ 关键注意事项
- 禁止使用 file_get_contents() 拼接 URL:它本质是 GET 请求,违反 reCAPTCHA API 规范,且易受 URL 长度限制和特殊字符干扰;
- success 字段必须严格比对 true(布尔值):intval($responseKeys["success"]) !== 1 是危险写法——当响应异常时 success 可能为 null 或缺失,intval(null) 返回 0,导致误判;
- 启用 SSL 验证(CURLOPT_SSL_VERIFYPEER => true):防止中间人攻击,保障密钥与响应传输安全;
- 设置超时(CURLOPT_TIMEOUT):避免因 Google 接口延迟导致 PHP 脚本长时间阻塞;
-
前端需加载 reCAPTCHA API 脚本:确保 HTML 中包含:
<script src="https://www.google.com/recaptcha/api.js?render=6LfrrScdAAAAAM9UdXgQL4bHsISIEtYKW3Yca2Xm"></script>
(若使用显式渲染,还需初始化 grecaptcha.execute())
✅ 总结
reCAPTCHA v2 后端验证失败,90% 源于未遵循其 HTTP 方法规范。必须使用 POST 提交 secret、response 和可选 remoteip,并严格校验响应中的 success: true 布尔值。采用 cURL 实现不仅符合标准,还能精准控制超时、SSL 和错误状态,是生产环境唯一推荐方案。完成修复后,验证码勾选即生效,彻底解决“始终返回 false”问题。










