是的,think-captcha 已深度集成进 ThinkPHP 6+,开箱即用,但需确保启用 GD 扩展、使用正确驱动路径(如 think\captcha\driver\Gd)、避免响应头提前输出、手动启动 session,并通过 Response::create() 输出图片流。
是的,think-captcha 官方扩展已深度集成进 ThinkPHP 6+(TP6/TP7),不需要手写绘图逻辑或图像处理函数。但「易实现」的前提是:你用的是标准 HTTP 请求流程,且未禁用 GD 扩展或混淆了验证码驱动类型。
Captcha 类调用失败的常见原因直接 new Captcha 报错或返回空白图片,大概率是以下几类问题:
gd 或 imagick 扩展未启用(PHP 配置中检查 extension=gd)think-captcha v3+ 却在控制器里仍写 new \think\captcha\Captcha()(v3+ 已移除该路径,应改用 think\captcha\driver\Gd 或容器注入)echo 或日志调试语句)导致 header 冲突session()->start() 或配置中间件)以下是在控制器中生成并输出验证码图片的标准写法(以 Gd 驱动为例):
use think\captcha\driver\Gd;
use think\Response;
public function captcha()
{
$captcha = new Gd([
'fontSize' => 20,
'length' => 4,
'useNoise' => false,
]);
return Response::create($captcha->get(), 'image/jpeg');
}
注意:get() 方法返回的是原始图像二进制流,必须用 Response::create() 包装并指定 MIME 类型,否则浏览器无法识别为图片;若用 return $captcha->output();(旧版写法),在 TP6+ 会报错——该方法已被移除。
后端生成时已将验证码明文存入 session(key 默认为 captcha),前端提交表单时只需把用户输入传到后端比对即可,无需 JS 解密或额外接口:
captcha(与默认 session key 一致,方便统一处理)CaptchaService(TP6.1+ 内置):(new
\think\captcha\CaptchaService())->check($input, 'default')
session()->delete('captcha')
真正容易被忽略的是:验证码 session 的生命周期和表单提交的并发场景。比如用户快速刷新验证码多次,旧的 session 值会被覆盖,但前端可能还拿着上一轮的图片去提交,导致「明明输对了却提示错误」——这不是代码 bug,而是交互设计缺失,需要前端配合禁用输入框或加 loading 状态。