Laravel集成Anhskohbo NoCaptcha出现400错误请求求助
嘿,我之前在Laravel里用这个包的时候也踩过类似的坑,这个bad-request错误本质是向Google的reCAPTCHA验证接口发送的参数不符合要求,咱们从几个常见的点排查:
检查密钥配置是否正确
先确认.env文件里的NOCAPTCHA_SECRET和NOCAPTCHA_SITEKEY是Google reCAPTCHA v2的密钥(这个包主要适配v2),别不小心用了v3的密钥——v3的验证参数逻辑和v2完全不同,直接用会触发bad request。另外要注意密钥有没有多余的空格或者拼写错误,复制的时候很容易踩这个小坑。确认前端参数传递无误
前端表单里的reCAPTCHA组件对应的name属性必须是g-recaptcha-response,后端验证时要正确获取这个值。比如在控制器或者表单请求类里,你得用request('g-recaptcha-response')来拿到用户验证后的响应值,如果前端name写错了(比如写成recaptcha-response),后端传空值给Google接口,就会直接报400错误。验证包的配置与版本兼容性
首先检查Anhskohbo NoCaptcha的版本和你的Laravel版本是否兼容,比如Laravel 9及以上可能需要更新到包的最新稳定版。另外打开config/nocaptcha.php,确认verify_url是https://www.google.com/recaptcha/api/siteverify(如果你的服务器在国内,可能需要换成国内镜像地址,但你之前Yii2能用官方地址的话,这个应该没问题)。手动测试接口验证参数
你可以用curl直接调用Google的验证接口,排查是不是参数本身的问题:curl -X POST https://www.google.com/recaptcha/api/siteverify \ -d "secret=你的NOCAPTCHA_SECRET密钥" \ -d "response=前端页面中g-recaptcha-response的实际值"如果这个请求也返回
bad-request,那就是密钥或者response值的问题;如果请求正常返回success,那就要检查Laravel代码里的参数传递逻辑了。排查CSRF令牌问题
虽然reCAPTCHA本身不需要CSRF,但Laravel的表单默认要求CSRF保护,确保你的注册表单里加了@csrf指令,避免因为请求被拦截导致参数丢失,间接引发错误。
一般来说,因为你之前在Yii2里能正常使用,说明你的域名已经在Google那边完成验证,所以问题大概率出在Laravel这边的密钥配置或者参数传递上,按上面的步骤排查应该能解决。
内容的提问来源于stack exchange,提问作者Mirrai

