首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 生成二維碼完整指南:Google API、PHP QR Code 庫、帶 Logo 二維碼、容錯率原理

     編輯:PHP 相關知識

前言

二維碼已成連接線上線下核心入口。PHP 生成二維碼主流方案有二:調用 Google Chart API(零依賴、簡單)與本地 PHP QR Code 庫(可控、高性能、支持帶 Logo)。本文系統對比兩者優劣,提供完整代碼、核心參數詳解、帶 Logo 合成原理、容錯率科普及生產級建議。

方案一:Google Chart API(適合簡單場景)

調用代碼

<?php
function generateQRfromGoogle($chl, $widthHeight = 150, $EC_level = 'L', $margin = 0) {
    $chl = urlencode($chl);
    echo '<img src="https://chart.googleapis.com/chart?chs=' . $widthHeight . 'x' . $widthHeight
        . '&cht=qr&chld=' . $EC_level . '|' . $margin . '&chl=' . $chl
        . '" alt="QR Code" width="' . $widthHeight . '" height="' . $widthHeight . '" />';
}

// 使用
generateQRfromGoogle('https://www.example.com', 200, 'M', 1);
?>

核心參數

參數說明可選值/範例
chs圖片尺寸200x200 (寬x高,單位像素)
cht圖表類型qr (固定)
chl編碼內容URL、文本,**必須 URLEncode**,最大 4296 字符
chld容錯級別|邊距L|0, M|1, Q|2, H|2 (邊距 0-4)
choe字符編碼UTF-8 (推薦顯式指定)

優缺點

  • ✅ 零代碼依賴、零服務器資源消耗
  • ✅ Google CDN 極快、高可用
  • ❌ **強依賴外網**,內網/離線/國內訪問不穩定不可用
  • ❌ 數據經過 Google 服務器,**敏感信息不宜使用**
  • ❌ 無法自定義樣式(顏色、Logo、圓點風格)
  • ❌ Google 已停止維護 Chart API(雖仍可用但不保證 SLA)

方案二:PHP QR Code 庫(生產環境首選)

安裝與引入

# 方式一:Composer (推薦)
composer require chillerlan/php-qrcode

# 方式二:手動下載 phpqrcode.php (單文件版)
# 官網: https://phpqrcode.sourceforge.net/
require_once 'phpqrcode.php';

核心方法:QRcode::png()

QRcode::png(
    string $text,        // 編碼內容
    string $outfile = false, // 輸出文件路徑,false 直接輸出瀏覽器
    int $level = QR_ECLEVEL_L, // 容錯級別: L(7%), M(15%), Q(25%), H(30%)
    int $size = 3,       // 模塊大小 (像素/模塊),圖片尺寸 ≈ size * (版本*4+17)
    int $margin = 4,     // 靜默區寬度 (模塊數)
    bool $saveandprint = false // true: 保存並輸出
);

基本使用示例

<?php
require_once 'phpqrcode.php';

// 1. 直接輸出瀏覽器
QRcode::png('https://www.example.com');

// 2. 保存文件
QRcode::png('https://www.example.com', 'qrcode.png', QR_ECLEVEL_M, 6, 2);

// 3. 獲取二進制數據(用於合成、上傳雲存儲)
ob_start();
QRcode::png('Data', false, QR_ECLEVEL_L, 4);
$pngData = ob_get_clean();
// $pngData 可直接存入 DB BLOB、上傳 S3、返回 API 響應
?>

進階:生成帶 Logo 的二維碼(核心需求)

原理:利用容錯率「犧牲」中心區域數據嵌入 Logo

  • QR 碼分為功能圖形(定位、定時、版本信息)和數據區。
  • 容錯級別 H (30%) 意味著遮蓋 30% 數據區仍可解碼。
  • 將 Logo 放置中心,遮蓋部分數據區,掃碼器通過容錯算法恢復原始數據。
  • Logo 面積建議 ≤ 20%-25%,留有冗餘應對掃描角度/光照/模糊。

完整合成代碼

<?php
require_once 'phpqrcode.php';

function generateQRWithLogo($data, $logoPath, $outputPath, $level = 'H', $size = 6, $margin = 2) {
    // 1. 生成基礎二維碼(高容錯 H 級)
    $tempQR = 'temp_qr_' . uniqid() . '.png';
    QRcode::png($data, $tempQR, constant('QR_ECLEVEL_' . $level), $size, $margin);
    
    // 2. 載入圖片資源
    $qr = imagecreatefromstring(file_get_contents($tempQR));
    $logo = imagecreatefromstring(file_get_contents($logoPath));
    
    if (!$qr || !$logo) {
        @unlink($tempQR);
        throw new Exception('圖片載入失敗');
    }
    
    // 3. 計算 Logo 目標尺寸(二維碼寬度的 1/5)
    $qrW = imagesx($qr);
    $qrH = imagesy($qr);
    $logoW = imagesx($logo);
    $logoH = imagesy($logo);
    
    $targetW = $qrW / 5;
    $scale = $logoW / $targetW;
    $targetH = $logoH / $scale;
    
    // 4. 居中坐標
    $dstX = ($qrW - $targetW) / 2;
    $dstY = ($qrH - $targetH) / 2;
    
    // 5. 白底圓角矩形背景(可選,提升識別率)
    $bgColor = imagecolorallocate($qr, 255, 255, 255);
    $radius = 10;
    // 簡易畫圓角矩形...
    
    // 6. 重採樣複製 Logo 到二維碼中心
    imagecopyresampled($qr, $logo, $dstX, $dstY, 0, 0, $targetW, $targetH, $logoW, $logoH);
    
    // 7. 輸出最終圖片
    imagepng($qr, $outputPath);
    
    // 8. 清理資源
    imagedestroy($qr);
    imagedestroy($logo);
    @unlink($tempQR);
    
    return $outputPath;
}

// 使用
generateQRWithLogo(
    'https://www.example.com/product/12345',
    'logo.png',           // 需為正方形、背景透明/白色的 PNG
    'final_qrcode.png',
    'H',                  // 必須用 H 級容錯
    8,                    // 較大 size 確保清晰度
    2
);
echo '<img src="final_qrcode.png" alt="QR with Logo">';
?>

Logo 設計規範(關鍵)

  • ✅ **正方形**,邊長建議 100-300px
  • ✅ **白色/透明背景**,避免干擾定位點
  • ✅ **核心標識居中**,四周留白(Safe Zone)
  • ❌ 避免細線條、漸變、透明度過渡
  • ❌ 不要覆蓋三個大定位點(角落)

容錯率級別選擇指南

級別恢復能力適用場景數據密度
L (7%)低乾淨環境、大尺寸打印、無 Logo最高
M (15%)中通用場景、標準打印高
Q (25%)較高可能髒污/折疊、帶小 Logo中
H (30%)最高**帶 Logo、戶外廣告、金屬蝕刻、低質打印**低

建議: 帶 Logo **強制使用 H 級**;普通場景 M 級平衡體積與魯棒性。

生產級最佳實踐

  1. 緩存機制: 相同內容+參數的二維碼極高復用率,用 Redis/文件緩存 md5($data.$level.$size.$logo) 作為 Key。
  2. 異步生成: 大批量生成(如導出 1 萬張)放入隊列,Worker 消費生成上傳 OSS,返回簽名 URL。
  3. 驗證回讀: 生成後用 ZBar/ZXing 庫掃描驗證內容正確,防止庫 Bug 導致批量失效。
  4. SVG 輸出: 打印級需求用 QRcode::svg() 矢量輸出,無限縮放不失真。
  5. 安全: 內容含敏感信息(如帶 Token 的登錄碼)務必使用本地庫,禁用 Google API;設置短過期時間、一次性失效。

總結

Google API 適合原型、內網工具、非敏感、低頻場景;PHP QR Code (chillerlan/php-qrcode) 是生產環境標準配置:可控、高性能、支持 Logo/SVG/多種輸出。掌握 容錯率原理、Logo 合成算法、緩存驗證策略,即可構建穩健、專業的二維碼生成服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved