ThinkPHP官方think-captcha不支持滑动验证码,因Captcha::create('slide')无对应驱动;推荐接入极验Geetest V4或腾讯tcaptcha,自研仅限特殊场景且需严控服务端校验逻辑。

ThinkPHP 本身不内置滑动验证码,必须借助第三方库或自研逻辑实现;直接用 think-captcha 默认只支持字符型(数字/字母)验证码,Captcha::create('slide') 会报错 —— 因为官方扩展未实现滑动类型。
为什么 think-captcha 不支持滑动验证码
当前稳定版 think-captcha(v3.x / v4.x)的 Captcha 类中,create() 方法只识别 'default'、'math'、'funny' 等预设类型,没有 'slide' 的驱动注册和渲染逻辑。调用 Captcha::create('slide') 会触发 InvalidArgumentException: Unsupported captcha type 错误。
常见误操作包括:
- 盲目修改配置项
type => 'slide',但后端无对应处理器 - 前端引入了滑动组件(如
tcaptcha或geetest),却没对接校验接口 - 用 JS 模拟拖拽完成,但服务端仍走传统
captcha/check,导致校验永远失败
推荐方案:接入极验(Geetest)V4(最省心)
极验提供 ThinkPHP 原生 SDK,支持 V4(行为验证)和 V3(传统滑动),V4 更抗自动化且无需用户拖动,体验更自然。关键点不是“怎么画滑块”,而是“如何让服务端正确解析极验返回的加密参数”。
实操步骤:
- 在
composer.json中添加"geetest/geetest": "^4.0",执行composer install - 初始化时传入你在极验后台申请的
captcha_id和private_key,不要硬编码,建议从config/captcha.php读取 - 前端调用
initGeetest后,表单提交需带上geetest_challenge、geetest_validate、geetest_seccode三个字段 - 服务端校验不能只查 session,必须调用
$gee->verifyResponse($challenge, $validate, $seccode),该方法会发起 HTTPS 请求到极验服务器
注意:本地开发时若提示 cURL error 60,是 SSL 证书问题,临时可加 $gee->setCurlSSL(false)(上线前务必关掉)。
轻量替代:用 tcaptcha(腾讯验证码)+ 自定义验证逻辑
腾讯 tcaptcha 无需申请密钥即可测试(开发环境用 123456789 占位),适合快速验证流程。但它不提供 ThinkPHP 封装,需手动构造请求。
核心难点在服务端校验:
- 前端回调返回的
ticket和randstr必须原样传给后端 - 后端用
file_get_contents()或curl向https://ssl.captcha.qq.com/ticket/verify发起 POST 请求,参数含aid(你申请的 app_id)、AppSecretKey(私钥)、Ticket、Randstr、UserIP - 响应是 JSON,
response === 1才代表通过;response === 0是失败,evil_level字段可辅助判断风险等级 - 别跳过
UserIP校验 —— tcaptcha 会比对前端传的 IP 和服务端获取的 IP,不一致直接返回response: 0
自研滑动逻辑(仅限学习/特殊合规场景)
真要自己生成滑块图、计算轨迹、校验偏移,工作量远超集成第三方。如果必须做,关键控制点只有两个:
- 图片生成阶段:用
imagecreatetruecolor()绘制背景图 + 缺口图,缺口位置存入 session(如session('slide_x', 120)),并把背景图 base64 返回给前端 - 校验阶段:前端提交用户拖动距离(如
offset_x=118),服务端检查abs($offset_x - session('slide_x')) ,再叠加时间限制(如 3 秒内完成)和尝试次数(session 计数)
注意:纯前端计算偏移不可信,所有关键参数(缺口位置、允许误差、有效时间)必须由服务端生成并保管;任何把 slide_x 放在 hidden input 或 localStorage 的做法都等于没验证。
滑动验证码真正的复杂点不在“拖动效果”,而在于服务端与第三方的加密通信、票据时效性管理、以及防绕过设计。别花时间重写极验的 JS SDK,优先确保 geetest_validate 能被正确接收、转发、解析。上线前一定用抓包工具确认三个 token 字段是否完整到达后端,这是 80% 集成失败的根源。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











