thinkphp验证码功能需安装think-captcha扩展并启用session中间件,否则create()返回空白、check()恒为false;图像生成必须纯净输出,session需全路径一致,前后端分离时应改用redis缓存替代session。

验证码在 ThinkPHP 里不是开箱即用的功能,create() 返回空白、check() 恒为 false,基本可以断定是环境没配好,而不是代码写错了。
安装扩展和启用 Session 中间件是硬前提
TP5.1+ 和 TP6/8 都把验证码抽成了独立扩展,不装 topthink/think-captcha、不启用 \think\middleware\SessionInit::class,整个流程就卡死。
- 执行
composer require topthink/think-captcha,确认vendor/topthink/think-captcha目录存在 - 打开
app/middleware.php,确保\think\middleware\SessionInit::class这一行已取消注释(TP6 默认是注释状态) - 别在控制器里手动调
session_start()——框架的 Session 必须由中间件统一初始化,否则$_SESSION和session()不同步 - 快速验证 Session 是否生效:
session('test', 'ok'); var_dump(session('test'));输出string(2) "ok"才算通过
图像生成必须走纯净输出流,别手拼 /captcha
任何额外输出(空格、换行、echo、var_dump)都会破坏 PNG 流,浏览器显示“损坏的图像”。
- 模板里优先用
{:captcha_img()}——它自动生成带时间戳参数的<img src="/captcha?_=1748787620">,天然防缓存、适配 PATHINFO/兼容模式 - 若需自定义路由,绑定到专用方法:
Route::get('captcha', [\think\captcha\facade\Captcha::class, 'create']); - 该方法体内严禁任何
echo、var_dump、布局模板输出,连末尾多一个空行都不行 - 点击刷新只需加 JS:
onclick="this.src='{:captcha_src()}?'+Math.random()",captcha_src()返回纯 URL 字符串
check() 失败九成不是逻辑问题,而是上下文断裂
(new \think\captcha\Captcha())->check($input) 返回 false,几乎从不因为“字符串比对错”,而是底层支撑失效。
- 前端输入未
trim():用户多敲一个空格或回车就失败,建议统一$input = trim($input)再校验 - Session ID 不一致:登录页是
login.example.com,提交页是www.example.com,跨子域或协议不一致(http/https)都会导致两次请求用不同 Session - 验证码已被消耗:默认一次有效,
check()成功后自动清除 Session 值;JS 重复提交、F5 刷新后重试旧值,必然失败 - 大小写不匹配:默认区分大小写;若前端转小写而服务端生成含大写字母,需统一转小写比对,或配置
'codeSet' => '0123456789'纯数字避免歧义
前后端分离场景必须改用 Redis 缓存替代 Session
Vue/React 项目无法共享 Cookie,原生 Session 在跨请求时失效,必须解耦存储层。
- 配置
config/captcha.php中'api' => true - 控制器中调用
$imgObj = Captcha::create(),返回['img' => 'data:image/png;base64,...', 'code' => 'xK9m'] - 生成唯一 key(如
'captcha_' . Uuid::uuid4()),用cache($key, $imgObj['code'], 300)存入 Redis(5 分钟) - 前端提交时携带该
captcha_key和用户输入,后端用cache(input('post.captcha_key'))取值比对,成功后立刻cache(input('post.captcha_key'), null)清除
真正容易被忽略的是 Session 的一致性边界——不是“有没有启用”,而是“是否在所有相关请求路径上都生效”。比如登录页、验证码接口、表单提交页用了不同子域或协议,Session 就天然隔离了。这点不提前验证,后面所有校验都会无声失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











