验证失败无提示是因为错误未绑定到 $errors,需将规则设为 'g-recaptcha-response' => 'required|recaptcha',并在 messages() 中映射 'g-recaptcha-response.recaptcha' => '请完成验证码验证',v3 还需手动校验 score 并注入错误。

验证失败时看不到提示,不是验证码没起作用,而是错误消息根本没绑定到视图的 $errors 里。
为什么 validate() 报 Invalid captcha 却不显示错误?
Laravel 默认把 g-recaptcha-response 当普通字段校验,但不会自动把它的错误塞进 $errors —— 除非你显式声明规则并确保 message key 匹配。
- 你在 Form Request 或控制器里写的规则是
'recaptcha' => 'required|recaptcha'?错。必须用前端实际提交的字段名:'g-recaptcha-response' => 'required|recaptcha' - 自定义验证规则名必须是
recaptcha(全小写),且要use Illuminate\Support\Facades\Validator; - 如果用了
config/recaptcha.php,检查version值是否和前端加载的 v2/v3 一致;v2 返回 token,v3 返回 score,服务端校验逻辑完全不同
怎么让 @error('g-recaptcha-response') 真的生效?
Blade 模板里写 @error('g-recaptcha-response') 没用,是因为默认错误 key 是 recaptcha,不是字段名。得手动映射。
- 在 Form Request 的
messages()方法里加:'g-recaptcha-response.recaptcha' => '请完成验证码验证' - 或者在控制器中手动验证时,用
withErrors($validator, 'default')并确保规则 key 和 error key 对齐 - 别依赖全局
@if($errors->any())——$errors->get('g-recaptcha-response')可能为空,因为错误实际挂在recaptcha这个 key 下
v3 验证失败后怎么返回有意义的提示?
v3 不弹出交互式验证框,只返回一个 score,服务端必须主动判断阈值,并手动注入错误。
- 不能只靠
|recaptcha规则:它只校验 token 有效性,不校验 score - 需在控制器里取
$request->input('g-recaptcha-response'),调用 Google API 解析 score,再用if ($score withErrors(['g-recaptcha-response' => '验证未通过']); } - 注意:v3 的 token 一次性有效,解析后就不能再复用;重复请求会返回
invalid-input-response
最容易被忽略的是:v2 和 v3 的前端初始化、token 提交方式、服务端校验入口完全不同,混用会导致静默失败——错误不报、页面不提示、表单卡住,但日志里连 warning 都没有。











