tp6中生成二维码接口需安装simplesoftwareio/qrcode扩展,控制器通过qrcode门面生成png图片流或base64数据,支持参数自定义与异常处理,配合路由配置及安全校验,适用于多端调用。

ThinkPHP6(TP6)中生成二维码接口,核心是借助第三方库(如 endroid/qr-code 或 simplesoftwareio/qrcode),结合控制器返回图片流或 Base64 数据。不依赖前端 JS,纯后端生成,适合小程序、APP、H5 等场景调用。
安装兼容的二维码扩展包
TP6 基于 PHP 7.2+,推荐使用轻量、维护活跃的 simplesoftwareio/qrcode(Laravel 生态常用,TP6 兼容良好):
- 执行命令安装:composer require simplesoftwareio/qrcode
- 该包底层基于 bacon/bacon-qr-code,支持 PNG/SVG 输出、纠错等级、尺寸、颜色等自定义
- 无需额外配置服务提供者(TP6 无 service provider 自动注册机制),直接在控制器中 use 即可
编写二维码生成接口控制器
新建控制器(如 app\controller\QrCode.php),实现一个接收参数并输出二维码图片的接口:
- 支持 GET 参数传入 text(要编码的内容)、size(宽高像素,默认 300)、level(纠错等级 L/M/Q/H)
- 设置响应头为 image/png,防止浏览器下载或乱码
- 捕获异常(如空内容、非法字符),返回统一错误提示(如 JSON 格式)
示例代码片段:
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use think\Response;
public function index()
{
$text = input('text', '');
$size = (int)input('size', 300);
$level = input('level', 'M');
if (empty($text)) {
return json(['code' => 400, 'msg' => 'text 参数不能为空'])->code(400);
}
try {
$png = QrCode::size($size)
->errorCorrection($level)
->generate($text);
return Response::create($png, 'image/png');
} catch (\Exception $e) {
return json(['code' => 500, 'msg' => '生成失败:' . $e->getMessage()])->code(500);
}
}
路由与安全注意事项
在 route/app.php 中注册简洁路由(避免暴露过多参数):
- 推荐使用 GET /api/qrcode?text=xxx&size=200,便于调试和跨域调用
- 生产环境建议加简单校验,如限制 text 长度(≤ 500 字符)、过滤特殊控制字符(防止 XSS 或协议滥用)
- 若用于登录或支付等敏感场景,text 应为加密 token 或短期有效链接,不可直接暴露用户 ID 等明文信息
- 考虑配合 Nginx 缓存静态二维码(如对相同参数做 10 分钟缓存),减轻 PHP 重复生成压力
进阶:返回 Base64 供前端直接渲染
部分前端(如 Vue/React 小程序)更倾向接收 Base64 字符串而非图片流:
- 修改控制器逻辑:不返回 Response,而是 base64_encode($png),再包装成 JSON
- 注意设置合适的 Content-Type 为 application/json
- 前端可用
<img :src="'data:image/png;base64,' + data.base64">直接显示 - 注意 Base64 体积比原始 PNG 大约 33%,大尺寸或高频请求建议走图片流方式











