poster-php
PHP 图片验证码与海报生成工具包 —— 框架无关核心 + Laravel / ThinkPHP / Webman / Hyperf 适配。
功能
验证码(三种方式 + 随机切换)
| 类型 | 说明 |
|---|---|
点击验证 click |
用户按顺序点击图片上的目标文字 |
旋转验证 rotate |
用户拖动滑块将图片旋转回正确角度 |
滑块验证 slider |
用户拖动拼图块到缺口位置 |
随机切换 random |
随机选取以上三种验证码之一 |
海报生成
链式 Builder API,支持 14 种元素:
| 元素 | 方法 | 说明 |
|---|---|---|
| 文字 | addText() |
自动换行,对齐,多行 |
| 图片 | addImage() |
缩放裁剪,圆角,阴影 |
| 头像 | addAvatar() |
圆形裁剪,边框 |
| 二维码 | addQrcode() |
纯 PHP 生成,中心 Logo,底部文案 |
| 形状 | addShape() |
矩形/圆形/圆角,填充/描边 |
| 分割线 | addLine() |
颜色,宽度 |
| 水印 | addWatermark() |
平铺文字,角度,间距 |
| 表格 | addTable() |
表头,斑马纹,列宽 |
| 图表 | addChart() |
柱状图 / 折线图 / 饼图 |
| 日历 | addCalendar() |
月历,高亮日期,标注 |
| 艺术字体 | addArtisticText() |
描边 / 阴影 / 渐变 / 霓虹 |
| Emoji | addEmoji() |
彩色 emoji 表情渲染 |
| 字体图标 | addIcon() |
FontAwesome 图标渲染 |
| 颜文字 | addEmoticon() |
日式颜文字 / 自定义表情 |
安装
1 | composer require erikwang2013/poster-php |
系统要求:PHP >= 8.0,GD 扩展。
可选扩展:
ext-imagick:ImageMagick 图像驱动(性能更好,功能更强)ext-redis:Redis 验证码存储(分布式部署)
使用说明
一、验证码
1. 点击验证码 (ClickCaptcha)
用户需要按顺序点击图片上的目标文字(如”树””鸟””花”),验证人类操作。
1 | // 通过辅助函数(框架无关) |
2. 旋转验证码 (RotateCaptcha)
系统随机旋转图片 30°~330°,用户拖动滑块将图片旋转回正。
1 | // 通过辅助函数 |
3. 滑块验证码 (SliderCaptcha)
系统从背景切出拼图块并偏移,用户拖动拼图到缺口位置。
1 | // 通过辅助函数 |
4. 随机切换 (RandomCaptcha)
系统随机从 click / rotate / slider 中选取一种验证码,增加破解难度。
1 | // 通过辅助函数 — 一行代码随机生成 |
验证安全特性
| 特性 | 说明 |
|---|---|
| 一次性 | 验证成功/超过最大次数后 key 删除 |
| 防暴力 | 默认最多验证 3 次(可配置) |
| 有效期 | 默认 300 秒(可配置) |
| 随机性 | 每次生成的背景颜色、噪声、目标位置均随机 |
二、海报生成
基础用法
1 | use Erikwang2013\Poster\Poster\PosterBuilder; |
文字 addText()
1 | $builder->addText('新品首发', [ |
图片 addImage()
1 | $builder->addImage('/path/to/product.jpg', [ |
头像 addAvatar()
1 | $builder->addAvatar('/path/to/avatar.jpg', [ |
二维码 addQrcode()
1 | $builder->addQrcode('https://example.com/page/123', [ |
形状 addShape()
1 | // 矩形 |
分割线 addLine()
1 | $builder->addLine([ |
水印 addWatermark()
1 | $builder->addWatermark('CONFIDENTIAL', [ |
表格 addTable()
1 | $builder->addTable([ |
图表 addChart()
1 | // 柱状图 |
日历 addCalendar()
1 | $builder->addCalendar([ |
艺术字体 addArtisticText()
1 | // 描边效果 |
Emoji addEmoji()
1 | // 直接使用 emoji 字符 |
系统会自动检测 macOS / Linux / Windows 上的 emoji 字体路径。
字体图标 addIcon()
1 | // 使用内置 FontAwesome 图标名(需提供图标字体文件) |
颜文字 addEmoticon()
1 | // 使用内置颜文字 |
三、模板系统
1 | use Erikwang2013\Poster\Poster\PosterTemplate; |
框架集成
Laravel
1 | use Erikwang2013\Poster\Adapters\Laravel\Facades\Captcha; |
1 | php artisan vendor:publish --tag=poster-config |
ThinkPHP
config/web.php:1
2
3
4'services' => [
Erikwang2013\Poster\Adapters\ThinkPHP\CaptchaService::class,
Erikwang2013\Poster\Adapters\ThinkPHP\PosterService::class,
],
Webman
config/bootstrap.php:1
2
3
4return [
Erikwang2013\Poster\Adapters\Webman\CaptchaPlugin::class,
Erikwang2013\Poster\Adapters\Webman\PosterPlugin::class,
];
Hyperf
通过 ConfigProvider 自动注册。
配置
见 config/poster.php,支持 .env 覆盖(参考 .env.example)。
目录结构
1 | src/ |
开源不易,欢迎支持
| 微信 | 支付宝 |
|---|---|
![]() |
![]() |
License
MIT License — Copyright (c) 2026 erik erik@erik.xyz — https://erik.xyz
本文链接: https://erik.xyz/open/poster-php.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!

