本文目录导读:

我来介绍几种在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,因为它功能更完善,维护更活跃。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播