推荐使用 bacon/bacon-qr-code 库生成二维码,支持 PNG/svg 格式、可调容错等级与尺寸,需启用 GD 扩展(PNG)并确保输入为 UTF-8 编码。

php 生成二维码不需要自己实现算法,用现成的库最稳妥。推荐 bacon/bacon-qr-code(官方维护、无依赖、支持 PHP 7.4+),它比老旧的 phpqrcode 更安全、更易维护。
安装 bacon/bacon-qr-code 库
用 composer 安装是最标准的方式,避免手动引入和 autoloader 冲突:
- 确保项目根目录有
composer.json,且已配置好 Composer 环境 - 运行命令:
composer require bacon/bacon-qr-code - 如果报错
ext-gd not found,说明 GD 扩展未启用 —— 需在php.ini中取消;extension=gd的注释,并重启 Web 服务(如 apache/nginx + PHP-FPM)
生成 PNG 格式二维码(最常用场景)
直接输出 PNG 图片流适合前端 这类动态调用:
writeString('https://example.com'); ?>
-
RendererStyle(300)控制宽高;传第二个参数可设 margin(如new RendererStyle(300, 10)) - 不加
header()直接 echo 会导致乱码或下载失败 - 若需保存文件,把
echo $writer->writeString(...)换成file_put_contents('qrcode.png', $writer->writeString(...))
生成 SVG 格式二维码(适合响应式页面)
SVG 无损缩放,嵌入 html 更灵活,且不依赖 GD 扩展:
writeString('Hello World'); ?>
-
Svg渲染器不依赖 GD,适合容器化部署或 GD 被禁用的环境 - 生成的 SVG 是纯文本,可直接内联到 HTML 中(去掉
header,用echo插入)- 注意:部分旧版 IE 不支持 inline SVG,生产环境需确认兼容范围
常见错误与绕过技巧
实际集成时容易卡在这几个点上:
立即学习“PHP免费学习笔记(深入)”;
- 报错
class 'BaconQrCodeWriter' not found:没执行composer install或自动加载失效,运行composer dump-autoload - 中文内容乱码/无法识别:QR 码本身不处理编码,必须保证输入字符串是 UTF-8。例如从数据库读取后做
mb_convert_encoding($str, 'UTF-8', 'GBK') - 二维码内容超长导致扫描失败:默认容错等级是
L(约 7% 恢复能力)。可提升为M(15%)、Q(25%)或H(30%),用new RendererStyle(300, 0, NULL, null, null, BaconQrCodeEncoderErrorCorrectionLevel::M()) - 想加 logo?这个库原生不支持。得先生成二维码 PNG,再用 GD 函数(
imagecopyresized)叠加图片 —— 注意别遮挡定位图案(三个角上的方块)
真正麻烦的不是生成,而是控制容错率、适配不同扫码环境、以及处理非 ASCII 字符的编码一致性。这些细节不验证到真机扫码,很容易上线后才发现扫不出。