Laravel如何实现验证码功能_Laravel Captcha插件安装配置【方案】

1次阅读

mews/captcha安装后不生效需手动发布配置、注册路由并确保session正常;默认math驱动易被误判,验证码路由须置于所有路由之前且避免中间件拦截,验证失败多因session失效或字段名不匹配。

Laravel如何实现验证码功能_Laravel Captcha插件安装配置【方案】

composer require mews/captcha 安装后不生效?

不是装完就能用,mews/captcha 默认不自动注册服务提供者(laravel 5.5+ 也需手动确认),且配置文件不会自动生成。

  • 运行 php artisan vendor:publish --provider="MewsCaptchaCaptchaServiceProvider" 才会生成 config/captcha.php
  • Laravel 9+ 若启用了 Package Discovery,仍需检查 config/app.php 中是否残留旧版 providers 手动注册项,冲突会导致配置不加载
  • captcha.php 里默认的 default 驱动是 math(算术题),不是图形验证码,容易误以为“没显示”

验证码图片返回 404 或空白?

路由未正确声明或中间件拦截是主因,mews/captcha 的图片 URL 是通过路由生成的,不是静态资源。

  • 确保已添加路由:在 routes/web.php 中写 Route::get('captcha/{config?}', 'CaptchaController@captcha')->name('captcha');(注意:它不自带控制器,需自己建)
  • 更稳妥的做法是直接用包内置的路由:在 routes/web.phpRoute::captcha(); —— 这行会注册 /captcha/{config?},但必须放在所有其他路由之前,否则被 catch-all 路由吞掉
  • 如果用了 auth 中间件或其他全局中间件(如语言检测、权限校验),可能提前终止响应,导致图片流被截断,建议对验证码路由加 ->withoutMiddleware(...)

表单提交时 validate(‘captcha’) 总失败?

验证失败通常不是逻辑错,而是 session 或字段名不匹配。

  • captcha 字段默认走的是 session 存储,必须确保当前请求 session 已启动且未失效;Laravel 8+ 使用 cookie session 驱动时,若域名带 www 或 http/https 混用,session_id 可能不一致
  • 前端 inputname 必须严格为 captcha,不能是 captcha_code 或带前缀,否则 $request->validate(['captcha' => 'required|captcha']) 找不到值
  • 验证规则 captcha 本质是调用 CaptchaService::check(),它会从 session 读取上一次生成的 hash 值比对,如果页面刷新后没重新加载验证码图片(即没触发新 /captcha 请求),session 里的旧值已被清空,必然失败

如何切换成中文数字或自定义字体?

默认字体不支持中文,强行传中文字符串会出方块或报 GD 错误,必须换字体文件并改配置。

  • 下载一个支持中文的 TTF 文件(如 simhei.ttf),放到 public/fonts/
  • 修改 config/captcha.php 中对应配置项:'fonts' => ['public/fonts/simhei.ttf'](注意路径是 web root 相对路径)
  • 若用 custom 驱动,需自己实现 generate() 方法,把 mt_rand(1000, 9999) 换成中文数字数组随机取,例如 ['零','一','二','三'],再用 imagettftext() 绘制
  • GD 库必须启用 freetype 支持,ubuntu 下装 php-gd 后还需确认 gd.jpeg_ignore_warninggd.freetypephp.ini 中为 On

实际集成时最常卡在 session 和路由顺序——前者无声失效,后者 404 还以为是路径写错。字体和中文只是表象,底层 session 生命周期和 GD 环境才是真门槛。

text=ZqhQzanResources