PHP 二维码生成工具

wen PHP项目 2

本文目录导读:

PHP 二维码生成工具

  1. 使用第三方库(推荐)
  2. 使用在线 API
  3. 完整示例:生成带样式的二维码
  4. 完整控制器示例
  5. 在 Laravel 中使用
  6. 安装建议
  7. 注意事项

我来帮你介绍几种 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

注意事项

  1. 二维码大小长度调整尺寸
  2. 容错级别:L(7%), M(15%), Q(25%), H(30%)
  3. 生成带 logo:需要容错级别至少 M
  4. URL 编码:包含特殊字符时记得编码
  5. 缓存处理:频繁生成的二维码可以缓存

选择哪种方案取决于你的具体需求,如果需要简单快速,建议使用 phpqrcode;如果追求功能和美观,推荐 endroid/qr-code。

抱歉,评论功能暂时关闭!