thinkphp5验证码需四步:一装对应版本扩展包,二启用session中间件,三模板用{:captcha_img()}嵌入,四控制器用captcha_check()校验。

ThinkPHP5 验证码不是内置功能,装错版本、漏启 Session、手写路径出错——这三处踩坑最多。只要按顺序做对四件事,5分钟内就能跑通。
一、安装对应版本的扩展包
TP5.0 必须用 1.* 版本,TP5.1+ 必须用 2.* 版本,混用会直接报错:
- TP5.0 项目:执行
composer require topthink/think-captcha=1.* - TP5.1 或更高小版本(如 5.1.40):执行
composer require topthink/think-captcha=2.* - 安装后确认
vendor/topthink/think-captcha目录存在 - 国内网络慢?先换镜像:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
二、启用 Session 中间件(关键!)
验证码值靠 Session 存取,没它,create() 返回空白、check() 恒为 false:
- 打开
app/middleware.php,确保\think\middleware\SessionInit::class这一行已取消注释 - 快速验证是否生效:在任意控制器方法中写
session('test', 'ok'); var_dump(session('test'));,输出string(2) "ok"才算成功 - 切勿手动调用
session_start()—— ThinkPHP 的 Session 必须由中间件统一管理
三、模板里一行嵌入验证码
别拼 URL,别写 /captcha,用框架封装好的助手函数最稳:
- 在 HTML 模板里直接写:
{:captcha_img()}—— 自动生成带防缓存参数的<img>标签 - 需要点击刷新?加一句 JS:
onclick="this.src='{:captcha_src()}?'+Math.random()" - 若用了子域名或跨域部署,务必检查前后端请求的
session_id()是否一致,否则校验必失败
四、控制器里简单校验
接收输入后先去空格,再调用校验,两行代码搞定:
- 获取用户输入:
$code = trim(input('post.code')); - 校验:
if (!captcha_check($code)) { $this->error('验证码错误'); } - 或者用门面方式:
(new \think\captcha\Captcha())->check($code) - 如需自定义样式(宽高、字体、位数等),在
config/captcha.php或application/extra/captcha.php中配置即可
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











