推荐使用 bacon/bacon-qr-code 库生成二维码,支持 PNG/SVG 格式、可调容错等级与尺寸,需启用 GD 扩展(PNG)并确保输入为 UTF-8 编码。PHP 生成二维码不需要自己实现算法,用现成的库最稳妥。推荐
bacon/bacon-qr-code(官方维护、无依赖、支持 PHP 7.4+),它比老旧的 phpqrcode 更安全、更易维护。
用 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 图片流适合前端 这类动态调用:
writeString('https://example.com');
?>
RendererStyle(300) 控制宽高;传第二个参数可设 margin(如 new RendererStyle(300, 10))header() 直接 echo 会导致乱码或下载失败echo $writer->writeString(.
..) 换成 file_put_contents('qrcode.png', $writer->writeString(...))
SVG 无损缩放,嵌入 HTML 更灵活,且不依赖 GD 扩展:
writeString('Hello World');
?>
Svg 渲染器不依赖 GD,适合容器化部署或 GD 被禁用的环境header,用 echo 插入 )
- 注意:部分旧版 IE 不支持 inline SVG,生产环境需确认兼容范围
常见错误与绕过技巧
实际集成时容易卡在这几个点上:
立即学习“PHP免费学习笔记(深入)”;
- 报错
Class 'BaconQrCode\Writer' 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, \BaconQrCode\Encoder\ErrorCorrectionLevel::M())
- 想加 logo?这个库原生不支持。得先生成二维码 PNG,再用 GD 函数(
imagecopyresized)叠加图片 —— 注意别遮挡定位图案(三个角上的方块)
真正麻烦的不是生成,而是控制容错率、适配不同扫码环境、以及处理非 ASCII 字符的编码一致性。这些细节不验证到真机扫码,很容易上线后才发现扫不出。