You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP服务端处理reCaptcha表单提交始终返回错误该如何解决?

问题原因
  • 核心错误:后端未获取前端传递的校验参数。前端AJAX请求将reCaptcha响应值放在参数captcha中提交,但PHP代码中直接使用了未定义的变量$recaptcha,传给谷歌校验接口的response字段为空,必然校验失败。
  • 次要潜在错误:CURL配置不全。代码未显式声明POST请求,部分PHP版本不会自动根据CURLOPT_POSTFIELDS识别为POST请求;部分低版本PHP环境未配置根证书,请求谷歌HTTPS接口会被拦截。
  • 其他可能问题:$secret填写的是前端站点密钥而非服务端密钥,或者服务器无法正常访问谷歌reCaptcha接口。
修复步骤
  1. 后端PHP先获取前端传递的captcha参数
  2. 补全CURL的POST请求和SSL相关配置
  3. 可选:新增错误日志输出,方便后续排查其他异常

修复后form_submission.php代码

<?php 
$secret = "----你自己的服务端secret key----";
$ip = $_SERVER['REMOTE_ADDR'];
// 新增:获取前端传递的captcha参数
$recaptcha = $_POST['captcha'] ?? '';
// 空值直接返回错误,不用请求谷歌接口
if (empty($recaptcha)) {
    echo 'ERROR';
    exit;
}

$postvars = array("secret"=>$secret, "response"=>$recaptcha, "remoteip"=>$ip);
$url = "https://www.google.com/recaptcha/api/siteverify";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 新增:显式声明POST请求
curl_setopt($ch, CURLOPT_POST, true);
// 可选:如果SSL请求报错可临时加这行,生产环境建议配置根证书后删除
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
$data = curl_exec($ch);
// 可选:请求失败时打印CURL错误方便排查
if(curl_errno($ch)){
    error_log('CURL错误:' . curl_error($ch));
}
$captcha_success=json_decode($data, true);
curl_close($ch);
  
if ($captcha_success['success']==false) {
    // 可选:把谷歌返回的错误码打日志,方便排查密钥、参数错误问题
    error_log('reCaptcha校验失败错误码:' . json_encode($captcha_success['error-codes'] ?? []));
    echo 'ERROR';
}
else {
    echo 'SUCCESS';
}
?>

前端校验注意事项

确保页面已正确加载reCaptcha v2的JS资源,点击提交前用户已经完成了验证码校验,grecaptcha.getResponse()可以拿到非空的响应值即可,原有JS代码无需修改。

内容的提问来源于stack exchange,提问作者Soda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:54:02