最稳妥方案是使用 endroid/qr-code v4,它兼容 PHP 7.4–8.3、不强依赖 GD 特定函数、API 清晰且维护活跃;需注意 v4 链式调用、容错等级改用常量、必须显式指定 Writer,并谨慎处理 Logo 尺寸与边距。
endroid/qr-code 生成二维码最稳妥PHP 原生不支持二维码生成,必须依赖第三方库。目前维护活跃、API 清晰、兼容 PHP 7.4–8.3 的首选是 endroid/qr-code(v4+)。它不依赖 GD 扩展的特定函数(比如 imageantialias),对 Docker 环境或精简镜像更友好。
安装命令:composer require endroid/qr-code
基础用法示例:
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
$qrCode = QrCode::create('https://example.com');
$result = (new PngWriter())->write($qrCode);
header('Content-Type: image/png');
echo $result->getString();
Call to undefined function imagecreate() 怎么办这是最常卡住的一步。不是所有 PHP 环境默认启用 GD——尤其 Alpine Linux 容器、某些宝塔面板精简版、或自编译 PHP 时漏了 --with-gd。
php -m | grep gd;或写个 phpinfo() 页面搜 “gd”sudo apt install php-gd,然后重启 PHP-FPM 或 Apacheapk add php7-gd(注意版本号匹配)bacon/bacon-qr-code(纯 PHP 实现,无扩展依赖),但体积略大、生成速度稍慢endroid/qr-code v3 和 v4 参数差异要注意v4 是重大重构版本,接口变化明显,老项目升级容易出错:
QrCode::png() 直接输出;v4 必须显式指定 PngWriter 或 SvgWriter
->setSize(300);v4 改为 QrCode::create(...)->setSize(300)(链式调用)'L'/'M';v4 改用常量 QrCode::ERROR_CORRECTION_LEVEL_LOW
SvgWriter 并设 header 为 image/svg+xml
不是简单叠加就能好看。Logo 太大、位置不对、没预留 margin,会导致扫码失败。
关键控制点:
->setLogoPath('/path/to/logo.png') + ->setLogoSize(60)(像素值)->setMargin(10),否则 Logo 贴边会干扰定位图案生成后务必用多个主流扫码 App(微信、支付宝、iOS 原生相机)实测,别只看图片是否“显示正常”。