HTML/PHP集成Google reCaptcha v2始终验证失败问题求助
问题根因
- 核心逻辑错误:混淆了服务端PHP和客户端JS的执行顺序
PHP是在页面从服务端返回给浏览器前就执行完成的,你将验证码校验的PHP代码写在前端JS的点击事件函数中,页面加载阶段PHP就会尝试读取$_POST['g-recaptcha-response'],此时用户还未完成验证码验证、也未触发提交操作,该POST参数完全不存在,$recaptcha为空,必然验证失败。此外你在JS代码块中嵌入PHP的exit(),会直接在服务端渲染阶段终止页面输出,后续内容无法正常返回给浏览器。 - 表单配置缺失:当前form标签未设置
method="post"属性,也未指定后端提交地址,即使用户正常提交,表单数据也无法正常传给后端验证逻辑。 - 潜在配置问题:需确认你使用的前端站点密钥(
data-sitekey)和服务端SECRET KEY是reCaptcha后台同一套凭证生成的,且当前站点域名已添加到reCaptcha后台的可信域名列表中。
修正方案
1. 拆分后端验证逻辑
单独创建submit.php处理表单提交逻辑:
<?php function reCaptcha($recaptcha){ $secret = "你的SECRET KEY"; $ip = $_SERVER['REMOTE_ADDR']; $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); curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars); $data = curl_exec($ch); curl_close($ch); return json_decode($data, true); } // 接收表单提交的验证码参数 $recaptcha = $_POST['g-recaptcha-response'] ?? ''; $res = reCaptcha($recaptcha); if(!$res['success']) { // 验证失败跳转回原页面,也可以自定义错误提示 header('Location: 你的表单页面地址?error=captcha_fail'); exit(); } // 验证成功,后续处理你的表单业务逻辑 // ... 业务代码 header('Location: 提交成功跳转地址'); exit(); ?>
2. 修正前端页面代码
<!-- 头部引入保持不变 --> <script src="https://www.google.com/recaptcha/api.js" async defer></script> <!-- Body区域表单修正 --> <form id="captcha" name="Captcha" method="post" action="submit.php"> <div class="g-recaptcha" data-sitekey="你的站点KEY"></div> <?php if (isset($_GET['error']) && $_GET['error'] == 'captcha_fail'):?> <p style="color:red">验证码验证失败,请重试</p> <?php endif;?> <input id="submitForm" name="submitForm" class="submit_text" type="submit" value="Submit"/> </form> <!-- 原有的JS点击事件代码完全删除,不需要额外写JS逻辑,走默认表单提交即可 -->
内容的提问来源于stack exchange,提问作者Soda
相关产品推荐
相关产品推荐

