reCAPTCHA v3 随机返回invalid-keys错误排查求助
reCAPTCHA v3 随机返回invalid-keys错误排查方案
问题背景
我为高流量表单创建并集成了全新的reCAPTCHA v3密钥,前端按官方步骤实现,后端用PHP cURL发起验证请求。测试时流程正常,但约40%请求随机返回未在官方文档中列出的invalid-keys错误。已确认密钥正确,更换长期可用的旧密钥、等待超16小时后问题仍存在,求推进思路。
前端代码
<script src='https://www.google.com/recaptcha/api.js'></script> <input type="submit" class="submit g-recaptcha" name="form_submit" value="Submit" data-sitekey="RECAPTCHA_SITE_KEY" data-callback="onRecaptchaSubmit" data-action="submit" /> <script type="text/javascript"> function onRecaptchaSubmit(token) { document.getElementById('FORM_ID').submit(); } </script>
后端代码
<?php // Make the API request $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://www.google.com/recaptcha/api/siteverify"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array( 'secret' => 'RECAPTCHA_SECRET_KEY', 'response' => $token, 'remoteip' => $ip_address, ))); // Fetch response $response = json_decode(curl_exec($ch)); curl_close($ch);
排查建议
检查后端密钥的配置一致性
高流量场景如果用多实例部署,可能存在部分实例未同步最新密钥的情况。建议在后端验证代码中添加日志,记录每次请求的secret值、responsetoken和remoteip,确认是否存在密钥不一致的请求。防止前端token重复提交
用户快速多次点击提交按钮可能生成多个token,部分过期或重复使用的token会触发异常。可以在回调函数中禁用按钮:function onRecaptchaSubmit(token) { const submitBtn = document.querySelector('.g-recaptcha'); submitBtn.disabled = true; document.getElementById('FORM_ID').submit(); }验证cURL请求参数合法性
确保$ip_address是合法的IP格式(无多余字符),该参数为可选,可暂时移除测试是否解决问题。同时检查$token是否存在空值或截断情况,添加日志记录接收的token值。排查服务器网络与请求限制
高流量下服务器出口IP可能被Google临时限制,检查cURL请求是否有超时、DNS解析异常。另外确保服务器时间同步正常,时间偏差过大可能导致token验证失败。检查表单传输过程中的token完整性
确认表单以POST方式提交,避免GET请求导致token参数暴露或截断。排查是否有中间件(如WAF、CDN)篡改了token参数,可在后端对比前端提交的token与实际接收值是否一致。
内容的提问来源于stack exchange,提问作者brodenbrett
相关产品推荐
相关产品推荐

