thinkphp验证码需gd扩展、session中间件、配置文件、接口响应、校验逻辑五者协同;缺一即导致图片不显示、校验失败或失效,须按顺序逐一确认。

ThinkPHP 验证码不是装个包就能用的,关键在环境、配置、调用三者协同。GD 库没开、Session 没启、参数写错或校验方式不匹配,任一环节出问题都会导致“图片不显示”“总提示错误”“点一下就失效”。下面按实际开发顺序讲清楚核心要点。
确保基础环境就绪
验证码依赖底层图像处理和会话存储,这两项必须提前确认:
- PHP 的 GD 扩展必须启用:检查 phpinfo() 页面是否有 GD support 为 enabled;若无,在 php.ini 中取消
extension=gd前的分号,重启 Web 服务 -
Session 中间件必须启用:ThinkPHP6 默认关闭 Session,需打开
app/middleware.php,取消\think\middleware\SessionInit::class行的注释 - 安装扩展不能跳过:执行
composer require topthink/think-captcha,安装后确认vendor/topthink/think-captcha目录存在
合理配置 captcha.php
配置文件决定验证码的安全性与可用性,建议统一放在 config/captcha.php,避免硬编码:
- 必设项:'length'(建议 4~5)、'expire'(建议 1800 秒即 30 分钟)、'useNoise' 和 'useCurve'(开启可防 OCR 识别)
- 适配显示效果:'imageW' 和 'imageH' 根据前端容器宽度调整,比如宽 130px 高 50px 更适合表单内联布局
-
字符集可控:如需避开易混淆字符(0/O/1/l),自定义 'codeSet',例如
'23456789abcdefghjkmnpqrstuvwxyz'
前后端联调关键写法
生成与展示不是简单 echo 图片,而是走 HTTP 流式响应,前端必须正确请求接口:
- 控制器中用
return \think\captcha\facade\Captcha::create();,不要用echo或dump - 模板里用
<img src="%7B:url('index/captcha')%7D" onclick="this.src='{:url('index/captcha')}?'+Math.random()">,带随机参数才能强制刷新 - 表单 input 的 name 推荐用
captcha,后端统一用input('post.captcha')获取,语义清晰不易错
校验逻辑要一次到位
验证码本质是一次性口令,校验失败不重试、成功即清空是基本安全原则:
- 校验必须在接收 POST 的动作中进行,调用
captcha_check($code)即可,无需手动读 session - 校验通过后,系统自动失效该验证码;若需手动清除(如调试),可调用
\think\captcha\facade\Captcha::reset(); - 不要自己拼接 session key 或 md5 加密输入值——think-captcha 已封装完整流程,自行处理反而容易出错
不复杂但容易忽略,把 GD、Session、配置、接口响应、校验五环扣紧,验证码就能稳定跑起来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











