thinkphp 5 验证码需先配环境:gd库、session中间件、think-captcha扩展三者缺一不可,否则create()返回空白、check()恒为false;模板中用{:captcha_img()}生成图片,校验前须trim输入并确保session_id一致。

ThinkPHP 5 验证码不是内置功能,新手第一步不是写代码,而是配环境。装错扩展、漏启 Session、GD 库没开——这三样里只要一个没到位,create() 就返回空白,check() 就永远 false。别急着改逻辑,先让图像能出来。
安装扩展和确认 PHP 环境
验证码依赖 GD 图像库和独立扩展包,缺一不可:
- 运行
composer require topthink/think-captcha(TP5.0 用=1.*,TP5.1+ 用最新版) - 检查
vendor/topthink/think-captcha目录是否存在 - 确认 PHP 已开启 GD 扩展:在命令行执行
php -m | grep gd,或新建phpinfo()页面搜索 “gd” - 若 GD 未启用,需修改
php.ini,取消;extension=gd前的分号,重启 Web 服务
必须启用 Session 中间件
验证码值靠 Session 存储和读取,中间件没跑起来,整个流程就断了:
- 打开
app/middleware.php,确保\think\middleware\SessionInit::class这一行已取消注释 - 不要在控制器里手动调用
session_start(),ThinkPHP 要求由中间件统一初始化 - 快速验证:在任意控制器方法中写
session('test', 'ok'); var_dump(session('test'));,输出string(2) "ok"才算通过
模板里一行代码生成验证码图片
别自己拼 URL,也别在控制器里 return $captcha->create() —— 容易因空格、换行或响应头问题导致图像损坏:
- 在模板 HTML 中直接写:
{:captcha_img()} - 它自动添加时间戳参数防缓存,自动适配 PATHINFO 或兼容模式路由
- 如需点击刷新,加 JS:
onclick="this.src='{:captcha_src()}?'+Math.random()" - 如果用了子域名或跨域访问,要确保前后端共用同一 Session 域名(比如都设为
.example.com)
校验前先做两件事
check() 失败,90% 不是比对错了,而是输入或上下文出了问题:
- 前端提交的验证码务必
trim():用户多敲一个空格,校验就失败 - 检查两次请求的
session_id()是否一致:登录页和提交页不能跨子域(如login.example.comvswww.example.com) - 验证码默认一次有效,
check()成功后自动清除;不要拿旧值重复提交 - 默认区分大小写,若前端转小写提交,而生成的是大写字母,建议统一转大写再校验:
$captcha->check(strtoupper($input))
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











