本文目录导读:

我来介绍几种在PHP项目中生成二维码的方法:
使用 phpqrcode 库(推荐)
安装
composer require phpqrcode/phpqrcode
基础使用
<?php
require_once 'vendor/autoload.php';
// 方法1:直接输出到浏览器
QRcode::png('https://example.com');
// 方法2:保存为文件
QRcode::png('https://example.com', 'qrcode.png');
// 方法3:自定义参数
QRcode::png('https://example.com', 'qrcode.png',
QR_ECLEVEL_L, // 纠错级别
10, // 大小
2 // 边距
);
?>
生成带Logo的二维码
<?php
require_once 'vendor/autoload.php';
function createQRWithLogo($text, $logoPath, $outputPath) {
// 生成二维码
QRcode::png($text, 'temp_qr.png', QR_ECLEVEL_H, 10, 2);
// 创建图像资源
$qrImage = imagecreatefrompng('temp_qr.png');
$logo = imagecreatefrompng($logoPath);
// 计算logo位置(居中)
$qrWidth = imagesx($qrImage);
$qrHeight = imagesy($qrImage);
$logoWidth = imagesx($logo);
$logoHeight = imagesy($logo);
// 调整logo大小(二维码的1/5)
$logoSize = $qrWidth / 5;
$logoResized = imagescale($logo, $logoSize, $logoSize);
// 合并图像
$x = ($qrWidth - $logoSize) / 2;
$y = ($qrHeight - $logoSize) / 2;
imagecopy($qrImage, $logoResized, $x, $y, 0, 0, $logoSize, $logoSize);
// 保存
imagepng($qrImage, $outputPath);
// 清理
imagedestroy($qrImage);
imagedestroy($logo);
imagedestroy($logoResized);
unlink('temp_qr.png');
}
createQRWithLogo('https://example.com', 'logo.png', 'qrcode_with_logo.png');
?>
使用 endroid/qr-code 库(功能更丰富)
安装
composer require endroid/qr-code
基本使用
<?php
require_once 'vendor/autoload.php';
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;
$builder = new Builder(
writer: new PngWriter(),
writerOptions: [],
validateResult: false,
data: 'https://example.com',
encoding: new Encoding('UTF-8'),
errorCorrectionLevel: new ErrorCorrectionLevelHigh(),
size: 300,
margin: 10,
roundBlockSizeMode: new RoundBlockSizeModeMargin(),
labelText: '扫描二维码',
labelFont: new NotoSans(12),
labelAlignment: new LabelAlignmentCenter()
);
$result = $builder->build();
// 直接输出
header('Content-Type: '.$result->getMimeType());
echo $result->getString();
// 或保存到文件
$result->saveToFile('qrcode.png');
?>
高级功能:自定义样式
<?php
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;
use Endroid\QrCode\Writer\ValidationException;
$writer = new PngWriter();
// 创建二维码
$qrCode = QrCode::create('Data')
->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::create('path/to/logo.png')
->setResizeToWidth(60)
->setPunchoutBackground(true);
// 添加标签
$label = Label::create('标签')
->setTextColor(new Color(255, 0, 0));
$result = $writer->write($qrCode, $logo, $label);
?>
原生PHP实现(不依赖库)
<?php
function generateQRCode($text, $size = 200) {
$data = urlencode($text);
$url = "https://api.qrserver.com/v1/create-qr-code/?size={$size}x{$size}&data={$data}";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$image = curl_exec($ch);
curl_close($ch);
header('Content-Type: image/png');
echo $image;
}
// 使用
generateQRCode('https://example.com', 300);
?>
生成带参数的二维码(用于追踪)
<?php
function generateTrackingQR($baseUrl, $params = []) {
// 构建URL
$url = $baseUrl . '?' . http_build_query($params);
// 使用phpqrcode生成
QRcode::png($url, false, QR_ECLEVEL_L, 10, 2);
}
// 使用示例 - 添加追踪参数
generateTrackingQR('https://example.com', [
'source' => 'qr_code',
'campaign' => 'summer_sale',
'user_id' => 12345
]);
?>
最佳实践建议
-
选择合适的库:
- phpqrcode:轻量级,适合简单需求
- endroid/qr-code:功能丰富,支持更多自定义选项
-
性能优化:
// 启用缓存 function getCachedQR($text, $cacheTime = 3600) { $cacheFile = 'cache/' . md5($text) . '.png'; if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) { return $cacheFile; } QRcode::png($text, $cacheFile); return $cacheFile; } -
错误处理:
try { QRcode::png('data', 'output.png'); } catch (Exception $e) { error_log('QR Code generation failed: ' . $e->getMessage()); // 生成默认图片或错误提示 } -
安全性考虑:进行过滤和验证
- 限制生成图片的大小
- 设置适当的错误纠错级别
选择哪种方法取决于你的具体需求,一般推荐使用 endroid/qr-code,因为它功能更完善,维护更活跃。