Google reCAPTCHA报missing-input-response错误,请求排查协助
解决Google reCAPTCHA的"missing-input-response"错误
嘿,我之前也踩过这个坑!missing-input-response错误的本质就是Google验证接口没收到前端传过来的验证响应值,结合你的代码来看,主要问题出在这几个地方:
1. URL参数拼接的转义错误
你代码里拼接API地址时用了&,这是HTML里的转义字符,但后端拼接URL时应该用原始的&——不然Google的接口会把&response当成一个完整的参数名,自然识别不到真正的response参数,这是触发错误的核心原因。
2. 缺少对g-recaptcha-response的空值判断
如果用户没完成验证就提交表单,$_POST['g-recaptcha-response']会是空值,直接传去验证也会触发这个错误。
修正后的代码
我给你调整了代码,修复了这些问题,还加了参数编码避免特殊字符干扰:
function captcha(){ $secret = "..."; $response = $_POST['g-recaptcha-response'] ?? ''; // 先检查用户是否完成了验证 if(empty($response)){ return '<p><strong>错误:</strong>请先完成reCAPTCHA人机验证</p>'; } $remoteip = $_SERVER['REMOTE_ADDR']; // 用正确的&拼接参数,同时对参数做URL编码 $api_url = sprintf( "https://www.google.com/recaptcha/api/siteverify?secret=%s&response=%s&remoteip=%s", urlencode($secret), urlencode($response), urlencode($remoteip) ); $decode = json_decode(file_get_contents($api_url), true); if ($decode['success'] ?? false) { return $decode['success']; }else{ $errorsCode = ""; foreach ($decode['error-codes'] ?? [] as $key => $value) { $errorsCode .= '<p><strong>' . $key.':</strong> '.$value.'</p>'; } return $errorsCode; } }
额外的前端检查要点
除了后端,前端也要确保配置正确:
- 必须正确引入reCAPTCHA脚本:
<script src="https://www.google.com/recaptcha/api.js" async defer></script> - 表单里要有reCAPTCHA容器,替换成你的站点密钥:
<div class="g-recaptcha" data-sitekey="你的站点密钥"></div> - 提交前可以在浏览器控制台用
console.log(document.querySelector('[name="g-recaptcha-response"]').value)检查是否有值,确认参数能正常传到后端
你提到已经通过相关方案解决了,本质也是修复了URL拼接和参数传递的问题,以后碰到类似问题可以先从参数是否正确传递、URL是否合法这两点入手排查~
内容的提问来源于stack exchange,提问作者LAD
相关产品推荐
相关产品推荐

