endroid/qr-code 是生成 PNG 二维码最稳妥的 PHP 第三方库,需启用 GD 扩展,调用 QRCode::create() 后必须 setSiz e、setMargin 并 writeString() 输出,中文需 urlencode 或配置 font_path,SVG 输出须设 image/svg+xml 头。
用 endroid/qr-code 生成 PNG 二维码最稳妥
PHP 官方没有内置二维码生成功能,必须依赖第三方库。endroid/qr-code 是目前维护活跃、API 清晰、默认输出 PNG 的首选。它不依赖 GD 扩展(可选使用 imagick),但若用默认驱动,需确保 gd 已启用:
php -m | grep gd若无输出,需在
php.ini 中取消 ;extension=gd 的注释并重启 Web 服务。
QRCode::create() 基本调用不能少这三步
生成一个可用二维码,核心是创建实例 → 设置尺寸与内容 → 输出或保存。漏掉任意一步都会报错或返回空白:
-
QRCode::create()必须传入字符串内容,空字符串或null会抛出InvalidArgumentException -
->writeString()返回的是原始 PNG 二进制数据,不是 Base64;若直接echo,需先设置header('Content-Type: image/png') -
->saveToFile()要求目标目录有写权限,且父目录必须存在,否则抛出RuntimeException
$qrcode = QRCode::create('https://example.com')
->setSize(300)
->setMargin(10);
header('Content-Type: image/png');
echo $qrcode->writeString();
中文内容乱码?关键是编码和字体双处理
直接传入中文字符串(如 '你好')默认会失败或显示方块,因为 endroid/qr-code 默认只支持 ASCII。解决方法不是改字符集,而是启用「带 logo 或文本的复合二维码」模式,并显式指定中文字体:
- 必须使用
WriterStyle::create()->setLogoPath()或->setForegroundColour()等扩展写法时,才触发字体加载逻辑 - 实际生效的路径是
->setWriterOptions(['font_path' => '/path/to/simhei.ttf']),字体文件需为 TrueType 格式(.ttf),且 PHP 进程有读取权限 - 若仅需扫码识别中文内容(非显示中文),应先
urlencode()再传入,如QRCode::create(rawurlencode('你好')),扫码后客户端自行解码
生成 SVG 二维码要注意 MIME 类型和浏览器兼容性
用 QrCode::create(...)->setWriter(new SvgWriter()) 可输出矢量格式,但不能直接用 writeString() 返回 HTML 片段 —— 它返回的是纯 XML 字符串,缺少 声明和命名空间,部分浏览器(如旧版 Safari)会拒绝渲染:
- 务必手动添加响应头:
header('Content-Type: image/svg+xml') - 不要嵌入到 HTML 中再用
%EF%BC%8CBase64%20%E7%BC%96%E7%A0%81%20SVG%20%E6%98%93%E5%87%BA%E9%94%99%EF%BC%9B%E6%8E%A8%E8%8D%90%E7%94%A8%E7%8B%AC%E7%AB%8B%20URL%20%E6%8F%90%E4%BE%9B%20SVG%0A - %E8%8B%A5%E9%9C%80%E5%9C%A8%E7%BD%91%E9%A1%B5%E5%86%85%E8%81%94%E6%98%BE%E7%A4%BA%EF%BC%8C%E7%94%A8%20
echo%20%24qrcode->writeString()%20%E8%BE%93%E5%87%BA%E5%8E%9F%E5%A7%8B%20SVG%20%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%B9%B6%E5%8C%85%E8%A3%B9%E5%9C%A8%20%20%E4%B8%AD%EF%BC%88%E6%B3%A8%E6%84%8F%EF%BC%9ASVG%20%E4%B8%8D%E6%94%AF%E6%8C%81%20%20%E5%8A%A0%E8%BD%BD%E8%87%AA%E8%BA%AB%EF%BC%89%0A
%E5%A4%8D%E6%9D%82%E7%82%B9%E5%9C%A8%E4%BA%8E%EF%BC%9A%E4%BA%8C%E7%BB%B4%E7%A0%81%E5%AE%B9%E9%94%99%E7%AD%89%E7%BA%A7%E3%80%81%E8%BE%B9%E6%A1%86%E7%95%99%E7%99%BD%E3%80%81%E9%A2%9C%E8%89%B2%E5%AE%9A%E5%88%B6%E8%BF%99%E4%BA%9B%E5%8F%82%E6%95%B0%E8%99%BD%E7%81%B5%E6%B4%BB%EF%BC%8C%E4%BD%86%E4%B8%80%E6%97%A6%E6%B7%B7%E7%94%A8%20setWriter()%20%E5%92%8C%20setWriterOptions()%EF%BC%8C%E5%AE%B9%E6%98%93%E5%9B%A0%E9%A9%B1%E5%8A%A8%E5%B7%AE%E5%BC%82%E5%AF%BC%E8%87%B4%E9%9D%99%









