
本文详解 ReCaptcha V2 在表单提交中始终返回 false 的根本原因(如误用 GET 请求调用验证接口),并提供完整的前后端修复方案,包括 HTML、PHP 服务端验证及 AJAX 提交适配要点。
本文详解 recaptcha v2 在表单提交中始终返回 `false` 的根本原因(如误用 get 请求调用验证接口),并提供完整的前后端修复方案,包括 html、php 服务端验证及 ajax 提交适配要点。
Google reCAPTCHA v2(复选框版)验证失败却始终返回 false,是开发者常遇的典型问题。表面看是“用户未勾选”,实则多因服务端验证逻辑缺陷所致——最核心的错误在于:Google 的 /siteverify 接口严格要求使用 POST 方法提交验证参数,而许多教程或代码片段错误地采用了 file_get_contents() 拼接 URL 的 GET 方式,导致 secret 和 response 参数未被正确接收,API 默认返回 {"success": false}。
✅ 正确的服务端验证方式(PHP)
必须使用 POST 请求向 https://www.google.com/recaptcha/api/siteverify 提交数据。推荐使用 cURL(更可靠、可设超时/错误处理),避免 file_get_contents() 的 GET 陷阱:
// 获取用户提交的 token
$captcha = $_POST['g-recaptcha-response'] ?? '';
if (empty($captcha)) {
http_response_code(400);
echo 'Please check the reCAPTCHA box.';
exit;
}
// 验证 IP(可选,但建议)
$ip = $_SERVER['REMOTE_ADDR'];
// 使用 cURL 发起 POST 请求(关键!)
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'secret' => 'YOUR_SECRET_KEY_HERE', // 替换为你的密钥
'response' => $captcha,
'remoteip' => $ip
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false, // 生产环境建议保持 true
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 解析响应
$recaptchaData = json_decode($response, true);
if ($httpCode !== 200 || !isset($recaptchaData['success']) || $recaptchaData['success'] !== true) {
http_response_code(400);
echo 'reCAPTCHA verification failed. Please try again.';
exit;
}
// ✅ 验证通过,继续处理表单逻辑...
⚠️ 注意事项:
- 绝对不要用 file_get_contents("https://...?secret=xxx&response=yyy") —— 这本质是 GET,Google 会忽略参数或返回 false;
- remoteip 参数非必需,但启用后可增强安全性(需确保传入真实客户端 IP);
- 生产环境务必开启 CURLOPT_SSL_VERIFYPEER => true 并配置 CA 证书;
- 建议添加 CURLOPT_TIMEOUT 防止网络延迟阻塞请求。
? 前端与 AJAX 兼容性说明
你当前使用的 jQuery AJAX 提交(form.serialize())本身是正确的,它会自动将
reCAPTCHA API 已正确加载:在










