PHP环境下Google Invisible reCAPTCHA无响应,求排查问题(附客户端代码)
排查PHP环境下Google Invisible reCAPTCHA失效问题
别着急,我帮你一步步拆解可能的问题点,从客户端到后端逐一排查:
一、客户端代码的核心遗漏点
你提供的客户端代码有几个关键细节需要补全或确认:
必须引入reCAPTCHA核心脚本
你没提到是否加载了Google的官方脚本,这是触发验证的基础!需要在<head>里添加:<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>注意要带上
onload=onloadCallback和render=explicit参数,这样才能触发你定义的回调函数。提交按钮的配置要正确
你调用grecaptcha.render('submit', ...),这里的submit是按钮的ID吗?按钮不能用普通的<button type="submit">,得改成:<button id="submit" type="button">提交表单</button>用
type="button"避免表单直接提交,让Invisible reCAPTCHA接管点击事件。onSubmit函数要补充表单提交逻辑
你现在的函数只打印了日志,没有实际提交表单!需要加上:var onSubmit = function(token) { console.log('success!'); document.getElementById('你的表单ID').submit(); // 替换成你实际的表单ID };
二、后端PHP验证的关键步骤
很多人会忽略后端验证,这才是reCAPTCHA的安全核心,你需要在mail-script.php里添加验证逻辑:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 检查是否收到reCAPTCHA响应令牌 if (!isset($_POST['g-recaptcha-response'])) { die('请完成人机验证'); } // 准备验证请求参数 $secretKey = '你的Secret Key'; // 替换成Google后台获取的Secret Key $responseToken = $_POST['g-recaptcha-response']; $userIp = $_SERVER['REMOTE_ADDR']; // 向Google发送验证请求 $url = 'https://www.google.com/recaptcha/api/siteverify'; $data = [ 'secret' => $secretKey, 'response' => $responseToken, 'remoteip' => $userIp ]; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ] ]; $context = stream_context_create($options); $result = file_get_contents($url, false, $context); $response = json_decode($result); // 判断验证结果 if ($response->success) { // 验证通过,执行邮件发送逻辑 echo '验证通过,邮件已发送'; } else { // 验证失败,可输出具体错误原因 die('人机验证失败,请重试'); } } ?>
三、容易忽略的全局配置检查
- Site Key和Secret Key要配对:确保客户端用的Site Key和后端用的Secret Key来自Google reCAPTCHA后台的同一个项目。
- 域名要加入白名单:在Google后台,必须把当前网站的域名(比如
localhost或线上域名)添加到允许列表,否则验证会直接失败。 - reCAPTCHA类型要选对:创建项目时要选择「Invisible reCAPTCHA v2」,不要选普通reCAPTCHA v2或v3。
你可以按上面的步骤逐一排查,应该能快速定位问题!
内容的提问来源于stack exchange,提问作者like2think
相关产品推荐
相关产品推荐

