<?php
* @Descripttion: 二维码生成服务
* @version: v1
* @Author: youhujun youhu8888@163.com
* @Date: 2026-01-08 00:01:25
* @LastEditors: youhujun youhu8888@163.com
* @LastEditTime: 2026-01-08 00:01:25
* @FilePath: App.Service.V1.Qrcode.QrcodeFacadeService.php
* Copyright (C) 2026 youhujun. All rights reserved.
*/
namespace YouHuJun\Tool\App\Services\V1\Qrcode;
use YouHuJun\Tool\App\Exceptions\CommonException;
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\Label\LabelAlignment;
use Endroid\QrCode\Label\Font\OpenSans;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;
* 二维码生成服务类
*
* 提供二维码生成功能,支持多种输出模式,去除框架和模型依赖
*/
class QrcodeFacadeService
{
* 生成二维码
*
* @param array $config 配置参数
* @param array $params 二维码参数
* @param int $mode 输出模式: 1-保存到文件, 2-直接输出, 3-生成Data URI
* @return mixed 根据mode不同返回不同结果
* @throws CommonException
*/
public function makeQrcode(array $config, array $params, int $mode = 1)
{
if (!isset($params['data']) || empty($params['data'])) {
throw new CommonException('QrcodeDataRequired');
}
$redirectUrl = $params['data'];
$logoPath = $config['logoPath'] ?? '';
$noticeInfo = $config['noticeInfo'] ?? '二维码';
$qrcodePath = $config['qrcodePath'] ?? '';
$size = $config['size'] ?? 300;
$margin = $config['margin'] ?? 10;
$logoResizeToWidth = $config['logoResizeToWidth'] ?? 50;
if ($mode === 1 && empty($qrcodePath)) {
throw new CommonException('QrcodeSavePathRequired');
}
$builder = new Builder(
writer: new PngWriter(),
writerOptions: [],
validateResult: false,
data: $redirectUrl,
encoding: new Encoding('UTF-8'),
errorCorrectionLevel: ErrorCorrectionLevel::High,
size: $size,
margin: $margin,
roundBlockSizeMode: RoundBlockSizeMode::Margin,
logoPath: $logoPath,
logoResizeToWidth: $logoResizeToWidth,
logoPunchoutBackground: true,
labelText: $noticeInfo,
labelFont: new OpenSans(20),
labelAlignment: LabelAlignment::Center
);
$result = $builder->build();
if ($mode === 1) {
$result->saveToFile($qrcodePath);
if (!file_exists($qrcodePath)) {
throw new CommonException('QrcodeSaveError');
}
return $qrcodePath;
} elseif ($mode === 2) {
header('Content-Type: ' . $result->getMimeType());
echo $result->getString();
exit;
} elseif ($mode === 3) {
return $result->getDataUri();
} else {
throw new CommonException('QrcodeModeError');
}
}
}