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

