PHP项目怎么实现二维码生成?

wen java案例 2

本文目录导读:

PHP项目怎么实现二维码生成?

  1. 使用第三方库(推荐)
  2. 使用API服务(最简单)
  3. 完整示例:包含各种功能
  4. Web界面实现
  5. 推荐方案

我来介绍几种在PHP项目中生成二维码的常用方法:

使用第三方库(推荐)

PHP QR Code(最流行)

// 1. 安装(使用Composer)
composer require phpqrcode/phpqrcode
// 2. 使用
require_once 'vendor/autoload.php';
// 生成二维码图片
QRcode::png('https://example.com', 'qrcode.png');
// 直接输出到浏览器
QRcode::png('https://example.com');
// 带参数的二维码
QRcode::png(
    'https://example.com',
    false,
    QR_ECLEVEL_L,  // 纠错级别
    10,            // 大小
    2              // 边距
);

Endroid QR Code(功能更强大)

// 1. 安装
composer require endroid/qr-code
// 2. 使用
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
$qrCode = QrCode::create('https://example.com')
    ->setSize(300)
    ->setMargin(10)
    ->setForegroundColor(new Color(0, 0, 0))
    ->setBackgroundColor(new Color(255, 255, 255));
$writer = new PngWriter();
$result = $writer->write($qrCode);
// 保存到文件
$result->saveToFile('qrcode.png');
// 输出到浏览器
header('Content-Type: '.$result->getMimeType());
echo $result->getString();

使用API服务(最简单)

Google QR Code API

function generateQRCode($data, $size = 200) {
    $url = "https://api.qrserver.com/v1/create-qr-code/?size={$size}x{$size}&data=" . urlencode($data);
    return '<img src="' . $url . '" alt="QR Code">';
}
// 使用
echo generateQRCode('https://example.com', 300);

其他免费API

// API Ninjas
function qrCodeApiNinjas($text, $size = 150) {
    $url = "https://api.qrserver.com/v1/create-qr-code/?size={$size}x{$size}&data=" . urlencode($text);
    return $url;
}
// 显示图片
echo '<img src="' . qrCodeApiNinjas('https://example.com') . '">';

完整示例:包含各种功能

<?php
require_once 'vendor/autoload.php';
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Writer\SvgWriter;
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
class QRCodeGenerator {
    /**
     * 生成二维码并保存为文件
     */
    public function generateFile($data, $filename, $size = 300) {
        $qrCode = QrCode::create($data)
            ->setSize($size)
            ->setMargin(10)
            ->setErrorCorrectionLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::HIGH))
            ->setEncoding(new Encoding('UTF-8'))
            ->setForegroundColor(new Color(0, 0, 0))
            ->setBackgroundColor(new Color(255, 255, 255));
        $writer = new PngWriter();
        $result = $writer->write($qrCode);
        $result->saveToFile($filename);
        return $filename;
    }
    /**
     * 直接输出二维码到浏览器
     */
    public function outputQRCode($data, $size = 300) {
        $qrCode = QrCode::create($data)
            ->setSize($size)
            ->setMargin(10);
        $writer = new PngWriter();
        $result = $writer->write($qrCode);
        header('Content-Type: '.$result->getMimeType());
        header('Content-Disposition: inline; filename="qrcode.png"');
        echo $result->getString();
    }
    /**
     * 生成带Logo的二维码
     */
    public function generateWithLogo($data, $logoPath, $size = 300) {
        $qrCode = QrCode::create($data)
            ->setSize($size)
            ->setMargin(10);
        $writer = new PngWriter();
        $result = $writer->write($qrCode);
        // 合并Logo(需要GD库)
        $qrImage = imagecreatefromstring($result->getString());
        $logo = imagecreatefrompng($logoPath);
        $qrWidth = imagesx($qrImage);
        $qrHeight = imagesy($qrImage);
        $logoWidth = imagesx($logo);
        $logoHeight = imagesy($logo);
        // Logo居中
        $logoX = ($qrWidth - $logoWidth) / 2;
        $logoY = ($qrHeight - $logoHeight) / 2;
        imagecopy($qrImage, $logo, $logoX, $logoY, 0, 0, $logoWidth, $logoHeight);
        ob_start();
        imagepng($qrImage);
        $imageData = ob_get_clean();
        imagedestroy($qrImage);
        imagedestroy($logo);
        return $imageData;
    }
    /**
     * 生成SVG格式二维码
     */
    public function generateSVG($data, $size = 300) {
        $qrCode = QrCode::create($data)
            ->setSize($size)
            ->setMargin(10);
        $writer = new SvgWriter();
        $result = $writer->write($qrCode);
        return $result->getString();
    }
}
// 使用示例
$generator = new QRCodeGenerator();
// 1. 生成并保存文件
$generator->generateFile('https://example.com', 'qrcode.png');
// 2. 输出到浏览器
$generator->outputQRCode('https://example.com');
// 3. 带Logo的二维码
$qrWithLogo = $generator->generateWithLogo('https://example.com', 'logo.png');
header('Content-Type: image/png');
echo $qrWithLogo;
// 4. SVG格式
$svgCode = $generator->generateSVG('https://example.com');
echo $svgCode;

Web界面实现

<!DOCTYPE html>
<html>
<head>二维码生成器</title>
</head>
<body>
    <form method="POST" action="generate.php">
        <input type="text" name="data" placeholder="输入要编码的内容" required>
        <select name="size">
            <option value="200">200x200</option>
            <option value="300" selected>300x300</option>
            <option value="400">400x400</option>
            <option value="500">500x500</option>
        </select>
        <select name="format">
            <option value="png">PNG</option>
            <option value="svg">SVG</option>
        </select>
        <button type="submit">生成二维码</button>
    </form>
</body>
</html>
// generate.php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $data = $_POST['data'] ?? '';
    $size = $_POST['size'] ?? 300;
    $format = $_POST['format'] ?? 'png';
    require_once 'vendor/autoload.php';
    use Endroid\QrCode\QrCode;
    use Endroid\QrCode\Writer\PngWriter;
    use Endroid\QrCode\Writer\SvgWriter;
    $qrCode = QrCode::create($data)->setSize($size)->setMargin(10);
    if ($format === 'svg') {
        $writer = new SvgWriter();
        header('Content-Type: image/svg+xml');
    } else {
        $writer = new PngWriter();
        header('Content-Type: image/png');
    }
    $result = $writer->write($qrCode);
    echo $result->getString();
}

推荐方案

  1. 简单需求:使用Google QR Code API
  2. 生产环境:使用Endroid QR Code库
  3. 旧项目:使用PHP QR Code库
  4. 需要Logo:使用Endroid QR Code + GD库

选择哪个方案取决于你的具体需求,如是否需要离线生成、性能要求、是否需要Logo等。

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