ThinkPHP5验证码最常用五操作:一、前端用{:captcha_img()}一键插入可刷新图片;二、后端用validate()嵌入captcha规则自动校验;三、手动验证支持全局函数或实例化方式,并可传ID区分多验证码;四、多表单需用不同entry标识避免冲突;五、通过配置length、codeSet、expire、useNoise等参数优化体验与安全。

ThinkPHP5 验证码最常用、最实用的五个操作,不是全功能罗列,而是真正每天写登录/注册/表单时反复用到的核心点。掌握这五项,90% 的验证码场景都能快速搞定。
一、前端一键插入并支持点击刷新
模板里不用手写 img 标签拼 URL,直接用内置函数:
-
{:captcha_img()}—— 最简写法,自动生成带 onclick 刷新逻辑的 img 标签 - 如果改过
helper.php中的captcha_img()函数(推荐替换为带Math.random()的版本),点击图片就能实时换新,无需额外 JS - 不刷新?检查是否开了 URL 路由;没开路由就用
{:url('controller/action')}显式指定地址
二、后端验证一句话嵌入规则
和框架验证器无缝对接,不写 if 判断也能拦截:
- 在控制器中调用
$this->validate($data, ['captcha|验证码' => 'require|captcha']) - 注意:字段名必须和表单 name 属性一致(如
name="captcha") - 规则里的
captcha是系统内置验证类型,自动从 session 读取并校验,失败直接返回错误信息
三、手动验证更灵活的两种写法
适合 AJAX 提交、多步骤表单或需要自定义提示的场景:
立即学习“PHP免费学习笔记(深入)”;
- 全局函数方式:
if (!captcha_check(input('post.captcha'))) { $this->error('验证码错误'); } - 实例化方式:
$captcha = new \think\captcha\Captcha(); if (!$captcha->check(input('post.captcha'))) { ... } - 多个验证码时,传第二个参数 ID:
captcha_check($code, 'login')或$captcha->check($code, 'reg')
四、生成多个验证码不冲突的关键
一个页面有登录+注册两个表单?不能共用同一组缓存:
- 生成时加标识:
$captcha->entry('login')和$captcha->entry('reg') - 对应验证也必须带相同标识,否则始终校验失败
- 路由也要区分,比如注册页验证码走
url('register/verify'),登录页走url('login/verify')
五、三处可配、影响体验的关键参数
不用改源码,几行配置就能让验证码更友好或更安全:
-
长度与字符:设
'length' => 4更易读,'codeSet' => '23456789'排除易混字符(0/o, 1/l) -
有效期:默认 300 秒(5 分钟),业务要求高可设
'expire' => 180 -
干扰强度:简单场景关掉杂点和曲线
'useNoise'=>false, 'useCurve'=>false,加载更快、识别率更高
不复杂但容易忽略。日常开发中,把这五点串起来——插图、配规则、加 ID、调验证、调参数——验证码模块就稳了。



















