Google Recaptcha v3始终返回无效响应,Opencart环境求助排查
Google Recaptcha v3 无效响应问题修复方案
根据你提供的调试信息和代码,问题集中在后端token获取错误、域名不匹配、前端表单提交逻辑缺失这几个点,以下是针对性修复步骤:
一、错误码对应问题分析
从$resp的错误列表可以明确问题根源:
invalid-input-response:后端验证的是无效token值hostname-mismatch:后端指定的域名与实际站点域名拼写不一致action-mismatch/score-threshold-not-met:均为token无效导致的连带错误
二、控制器代码修复
1. 正确获取前端提交的token
原代码直接用字符串'token'传入验证方法,需改为获取POST表单中的token字段:
// 错误写法 ->verify('token', $_SERVER['REMOTE_ADDR']) // 正确写法(添加空值判断避免报错) ->verify($_POST['token'] ?? '', $_SERVER['REMOTE_ADDR'])
2. 修正域名拼写
调试信息中显示站点域名为my_syte.com,但控制器里写的是my_site.com,需统一为实际域名:
->setExpectedHostname('my_syte.com') // 与调试信息、Google后台配置的域名完全一致
3. 修复逻辑判断错误
原代码中评分判断逻辑颠倒,需调整为验证成功且评分达标时跳转成功页:
if (!$resp->isSuccess()) { $this->error_msg = 'ReCaptcha验证失败:' . implode(', ', $resp->getErrorCodes()); } else { if ($resp->getScore() >= 0.5) { // 符合阈值要求才跳转 header('Location: success.htm'); exit(); } else { $this->error_msg = '验证评分过低,疑似机器人操作'; } }
三、.tpl模板代码修复
1. 替换占位符为实际站点密钥
将脚本中的site_key替换为你在Google Recaptcha后台获取的v3站点密钥:
<!-- 错误写法 --> <script src='https://www.google.com/recaptcha/api.js?render=site_key' ></script> <!-- 正确写法 --> <script src='https://www.google.com/recaptcha/api.js?render=你的实际v3站点密钥' ></script>
2. 绑定提交按钮点击事件
原代码的onClick函数未绑定到提交按钮,需给按钮添加触发事件:
<!-- 错误写法 --> <input type="submit" name="btnSubmit" id="submit" value="<?php echo $button_send; ?>" class="btn" /> <!-- 正确写法 --> <input type="submit" name="btnSubmit" id="submit" value="<?php echo $button_send; ?>" class="btn" onclick="onClick(event)" />
3. 完善表单提交逻辑
获取token后需手动提交表单,否则仅设置token但不会触发表单提交:
function onClick(e) { e.preventDefault(); grecaptcha.ready(function() { grecaptcha.execute('你的实际v3站点密钥', {action: 'homepage'}).then(function(token) { console.log(token); document.getElementById('token').value = token; // 添加表单提交逻辑 document.querySelector('form').submit(); }); }); }
四、额外注意事项
- 确保Google Recaptcha后台配置的域名与实际站点完全一致(包括是否带www、是否为HTTPS)
- 确认
siteKey和secret是v3版本的密钥,不要与v2密钥混淆 - 测试时打开浏览器控制台,检查token是否正常生成并传递到后端
内容的提问来源于stack exchange,提问作者Den4ik
相关产品推荐
相关产品推荐

