1. 前言
packagist 传送门: endroid/qr-code - Packagist
使用该扩展前,先确认其 PHP 版本要求,endroid/qr-code 4.x 需要 PHP 版本 7.4+
使用前需要检查下是否启用了 gd2 扩展,对于 endroid/qr-code 版本选择,参考扩展包文档对 PHP 版本的要求
2. 安装扩展
执行 composer 命令安装 endroid/qr-code 扩展
composer require endroid/qr-code
会生成如下目录结构内容
├─vendor│ ├─autoload.php│ ├─ ...├─composer.json├─composer.lock
如果当前项目架构没有基于任何框架,只需要引入 composer 的自动加载文件即可
如果当前项目是基于 ThinkPHP,Laravel 等主流框架,这些框架都支持 composer,执行安装扩展包命令后可以直接使用
require 'vendor/autoload.php';
3. 生成二维码
使用 Builder 生成器:
use Endroid\QrCode\Builder\Builder;use Endroid\QrCode\Encoding\Encoding;use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;use Endroid\QrCode\Label\Alignment\LabelAlignmentCenter;use Endroid\QrCode\Label\Font\NotoSans;use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;use Endroid\QrCode\Writer\PngWriter;$result = Builder::create()->writer(new PngWriter())->writerOptions([])// 二维码文本->data('https://www.itqaq.com')// 内容编码->encoding(new Encoding('UTF-8'))// 容错等级(越高二维码越密集)->errorCorrectionLevel(new ErrorCorrectionLevelHigh())// 二维码内容区域大小->size(300)// 二维码内容外边距大小->margin(10)// 二维码内容圆形块尺寸模型->roundBlockSizeMode(new RoundBlockSizeModeMargin())// 二维码中间区域logo图片->logoPath(__DIR__ . '/3.png')->logoResizeToWidth(100)->logoResizeToHeight(100)// 二维码下方文字->labelText('长按识别二维码')->labelFont(new NotoSans(20))->labelAlignment(new LabelAlignmentCenter())// 验证读取器(默认情况下禁用)->validateResult(false)// 执行生成器->build();
不使用 Builder 生成器:
use Endroid\QrCode\Color\Color;use Endroid\QrCode\Encoding\Encoding;use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;use Endroid\QrCode\QrCode;use Endroid\QrCode\Label\Label;use Endroid\QrCode\Logo\Logo;use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;use Endroid\QrCode\Writer\PngWriter;$writer = new PngWriter();$qrCode = QrCode::create('https://www.itqaq.com')// 内容编码->setEncoding(new Encoding('UTF-8'))// 容错等级->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())// 内容区域大小->setSize(300)// 内容区域外边距->setMargin(10)// 内容圆形块尺寸模型->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())// 内容颜色->setForegroundColor(new Color(0, 0, 0))// 背景颜色->setBackgroundColor(new Color(255, 255, 255));// 二维码logo logo$logo = Logo::create(__DIR__ . '/3.png')->setResizeToWidth(50);// 二维码下方文字 label$label = Label::create('Label')->setTextColor(new Color(255, 0, 0));// 生成二维码数据对象(后面两个参数都是可选的)$result = $writer->write($qrCode, $logo, $label);
实际开发中,使用最多的是根据一串普通文本生成字符串,所以我将代码做了简化,方便以后快速使用
use Endroid\QrCode\QrCode;use Endroid\QrCode\Writer\PngWriter;use Endroid\QrCode\Encoding\Encoding;$qrCode = QrCode::create('https://www.itqaq.com')// 内容编码->setEncoding(new Encoding('UTF-8'))// 内容区域大小->setSize(200)// 内容区域外边距->setMargin(10);// 生成二维码数据对象$result = (new PngWriter)->write($qrCode);
4. 输出二维码
以下是三种输出二维码的方式,根据项目场景选择合适的方式即可
// 直接输出在浏览器中// ob_end_clean(); //处理在TP框架中显示乱码问题// header('Content-Type: ' . $result->getMimeType());// echo $result->getString();// 将二维码图片保存到本地服务器// $result->saveToFile(__DIR__ . '/qrcode.png');// 返回 base64 格式的图片$dataUri = $result->getDataUri();echo "<img src='{$dataUri}'>";https://www.lengleng.net