本文目录导读:

我来帮你介绍几种 PHP 生成二维码的方案,从简单到高级都有。
使用第三方库(推荐)
使用 phpqrcode(最流行)
// 1. 下载 phpqrcode.php 文件
// 下载地址: https://sourceforge.net/projects/phpqrcode/
// 或使用 Composer: composer require aferrandini/phpqrcode
require_once('phpqrcode.php');
// 简单生成二维码
$content = "https://www.example.com";
$filename = 'qrcode.png';
// 生成二维码图片
QRcode::png($content, $filename, QR_ECLEVEL_L, 4, 2);
// 直接输出到浏览器
QRcode::png('Hello World', false, QR_ECLEVEL_M, 4, 2);
// 生成带 logo 的二维码
$content = 'https://www.example.com';
$filename = 'qrcode_with_logo.png';
$logo = 'logo.png';
QRcode::png($content, 'temp.png', QR_ECLEVEL_H, 10, 2);
// 合并 logo
$QR = imagecreatefromstring(file_get_contents('temp.png'));
$logo = imagecreatefromstring(file_get_contents($logo));
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
$logo_qr_width = $QR_width / 5;
$scale = $logo_width / $logo_qr_width;
$logo_qr_height = $logo_height / $scale;
$from_width = ($QR_width - $logo_qr_width) / 2;
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
imagepng($QR, $filename);
使用 endroid/qr-code(更现代)
// composer require endroid/qr-code
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
// 创建二维码
$qrCode = QrCode::create('https://www.example.com')
->setSize(300)
->setMargin(10);
$writer = new PngWriter();
$result = $writer->write($qrCode);
// 保存到文件
$result->saveToFile('qrcode.png');
// 输出到浏览器
header('Content-Type: '.$result->getMimeType());
echo $result->getString();
使用 chillerlan/php-qrcode(功能全面)
// composer require chillerlan/php-qrcode
use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;
$options = new QROptions([
'version' => 5,
'outputType' => QRCode::OUTPUT_MARKUP_IMG,
'eccLevel' => QRCode::ECC_L,
'scale' => 5,
'margin' => 4,
]);
// 生成二维码
$qrcode = (new QRCode($options))->render('https://www.example.com');
// 保存为 SVG 文件
$options->outputType = QRCode::OUTPUT_MARKUP_SVG;
$options->outputBase64 = false;
$qrcode = (new QRCode($options))->render('Hello World');
file_put_contents('qrcode.svg', $qrcode);
使用在线 API
// 使用 Google Chart API(简单但已弃用)
function generateQRCode($url, $size = '200x200') {
$url = urlencode($url);
return "https://chart.googleapis.com/chart?cht=qr&chs={$size}&chl={$url}";
}
// 使用 qrserver.com API
function generateQRFromAPI($url, $size = 200) {
return "https://api.qrserver.com/v1/create-qr-code/?size={$size}x{$size}&data=" . urlencode($url);
}
// 在页面中显示
echo '<img src="' . generateQRFromAPI('https://www.example.com') . '" alt="QR Code">';
完整示例:生成带样式的二维码
<?php
// 使用 endroid/qr-code 带颜色的二维码
require_once 'vendor/autoload.php';
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
function generateStyledQRCode($content, $options = []) {
// 默认配置
$defaults = [
'size' => 300,
'margin' => 10,
'foregroundColor' => '#000000',
'backgroundColor' => '#ffffff',
'logo' => null,
'label' => null,
'labelSize' => 16,
'filename' => 'qrcode.png'
];
$config = array_merge($defaults, $options);
// 解析颜色
$fg = sscanf($config['foregroundColor'], '#%02x%02x%02x');
$bg = sscanf($config['backgroundColor'], '#%02x%02x%02x');
$qrCode = QrCode::create($content)
->setSize($config['size'])
->setMargin($config['margin'])
->setForegroundColor(new Color($fg[0], $fg[1], $fg[2]))
->setBackgroundColor(new Color($bg[0], $bg[1], $bg[2]))
->setErrorCorrectionLevel(new ErrorCorrectionLevelLow());
// 添加标签
if ($config['label']) {
$qrCode->setLabel($config['label'], $config['labelSize']);
}
$writer = new PngWriter();
$result = $writer->write($qrCode);
// 添加 logo
if ($config['logo'] && file_exists($config['logo'])) {
// 这里需要额外处理 logo 合并
$qrImage = imagecreatefromstring($result->getString());
$logo = imagecreatefromstring(file_get_contents($config['logo']));
$qrWidth = imagesx($qrImage);
$qrHeight = imagesy($qrImage);
$logoWidth = imagesx($logo);
$logoHeight = imagesy($logo);
$logoSize = $qrWidth / 5;
$x = ($qrWidth - $logoSize) / 2;
$y = ($qrHeight - $logoSize) / 2;
imagecopyresampled($qrImage, $logo, $x, $y, 0, 0, $logoSize, $logoSize, $logoWidth, $logoHeight);
// 保存图片
imagepng($qrImage, $config['filename']);
imagedestroy($qrImage);
} else {
// 直接保存
$result->saveToFile($config['filename']);
}
return $config['filename'];
}
// 使用示例
$filename = generateStyledQRCode('https://www.example.com', [
'size' => 400,
'foregroundColor' => '#007bff',
'backgroundColor' => '#ffffff',
'logo' => 'my-logo.png',
'label' => '扫描访问',
'filename' => 'my-qrcode.png'
]);
echo "二维码已生成: " . $filename;
?>
完整控制器示例
<?php
// QRCodeController.php
class QRCodeController {
// 生成并下载二维码
public function download($content) {
require_once('phpqrcode.php');
header('Content-Type: image/png');
header('Content-Disposition: attachment; filename="qrcode.png"');
QRcode::png($content, false, QR_ECLEVEL_L, 10, 2);
exit;
}
// 生成并保存二维码
public function generate($content, $filename = null) {
if ($filename === null) {
$filename = uniqid('qr_') . '.png';
}
require_once('phpqrcode.php');
QRcode::png($content, $filename, QR_ECLEVEL_L, 10, 2);
return $filename;
}
// 批量生成二维码
public function batchGenerate($items) {
$files = [];
foreach ($items as $item) {
$filename = $this->generate($item['content'], $item['filename']);
$files[] = [
'name' => $item['name'],
'file' => $filename
];
}
return $files;
}
}
// 使用示例
$controller = new QRCodeController();
$controller->download('https://www.example.com');
在 Laravel 中使用
<?php
// 安装依赖
// composer require endroid/qr-code
// 创建服务提供者或辅助函数
namespace App\Services;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
class QRCodeService {
public function generate($content, $options = []) {
$qrCode = QrCode::create($content)
->setSize($options['size'] ?? 300)
->setMargin($options['margin'] ?? 10);
$writer = new PngWriter();
$result = $writer->write($qrCode);
// 返回 base64 或保存到存储
return [
'data' => $result->getString(),
'base64' => 'data:' . $result->getMimeType() . ';base64,' . base64_encode($result->getString()),
'file' => $result->saveToFile(storage_path('app/qrcodes/' . uniqid() . '.png'))
];
}
}
// 在控制器中使用
class QrController extends Controller {
public function show($id) {
$qrService = new QRCodeService();
$qrResult = $qrService->generate('Product ' . $id, [
'size' => 200
]);
return response($qrResult['data'])
->header('Content-Type', 'image/png');
}
}
安装建议
推荐使用 Composer 安装:
# 选择其中之一安装 # 最轻量 composer require aferrandini/phpqrcode # 功能完整 composer require endroid/qr-code # 支持多种输出格式 composer require chillerlan/php-qrcode
注意事项
- 二维码大小长度调整尺寸
- 容错级别:L(7%), M(15%), Q(25%), H(30%)
- 生成带 logo:需要容错级别至少 M
- URL 编码:包含特殊字符时记得编码
- 缓存处理:频繁生成的二维码可以缓存
选择哪种方案取决于你的具体需求,如果需要简单快速,建议使用 phpqrcode;如果追求功能和美观,推荐 endroid/qr-code。