thinkphp5验证码需手动安装扩展、配置session并正确调用生成与校验,缺一不可;常见“图片空白”或“验证失败”问题多源于环境配置而非代码逻辑。

ThinkPHP5 验证码不是内置功能,必须手动安装扩展、配好 Session、再调用生成和校验——缺一不可。很多新手卡在“图片空白”或“始终验证失败”,其实问题几乎都出在环境配置环节,而非代码逻辑。
一、安装对应版本的验证码扩展
TP5.0 和 TP5.1 对扩展版本要求严格,装错就报错或不生效:
- TP5.0 项目:执行 composer require topthink/think-captcha=1.*
- TP5.1 及以上(含 5.1.x):执行 composer require topthink/think-captcha=2.*
安装完成后,运行 php think captcha:install —— 这一步会自动生成 config/captcha.php 配置文件和 public/static/captcha/ 前端资源目录,不能跳过。
二、确保 Session 正常工作
验证码值靠 Session 存储,Session 不通,图像就是空白,check() 永远返回 false。
- 检查
app/middleware.php,确认已启用\think\middleware\SessionInit::class(TP5.1 默认未启用,需取消注释) - 不要在控制器里写
session_start(),必须由中间件统一初始化 - 快速验证:在任意控制器方法中加两行:
session('test', 'ok');<br> dump(session('test'));
输出string(2) "ok"才算 Session 生效
三、前端显示验证码(推荐最稳方式)
别手拼 URL,直接在模板中写:
-
{:captcha_img()}—— 自动生成带防缓存参数的<img>标签,适配 PATHINFO / 兼容模式,还自动处理路由前缀 - 如需点击刷新,加一行 JS:
<script>$('#captcha').click(function(){ $(this).attr('src', '{:captcha_src()}?'+Math.random()); });</script>
切记:不要在生成验证码的方法里做任何 echo、var_dump 或输出空格/换行,否则图像流被破坏,浏览器显示“损坏的图像”。
四、后端接收并验证(关键细节)
验证失败,90% 是输入或环境问题,不是比对逻辑错了:
- 接收时先 trim:
$code = trim(input('code'));,避免前后空格导致失败 - 校验用
captcha_check($code)或(new \think\captcha\Captcha())->check($code) - 注意大小写:默认区分大小写;若前端输入小写但验证码含大写字母,建议统一转大写:
captcha_check(strtoupper($code)) - 验证通过后值即被清除,不可重复使用;页面 JS 刷新后提交旧值,必然失败
配合 Validate 使用更简洁:'code' => 'require|captcha''code.captcha' => '验证码不正确'
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











