如何在PHP中创建一个QR码(附代码实例)

809 阅读3分钟

如今,二维码几乎无处不在!

这是有道理的。它们很小,无需特殊软件就能在任何现代智能手机上读取,并让我们轻松快速地完成许多事情,如在咖啡馆签到、进入WiFi网络、在暑假中使用滑板车,以及进行购买。

下面是我从网上找到的一些例子:

Some examples of QR codes.

所以,如果你想知道如何在你基于PHP的应用程序中创建它们,请继续阅读。

前提条件

要学习本教程,你需要具备以下条件:

  • 以前有编写PHP代码的经验。
  • 安装了GD扩展的PHP7.4。
  • 全局安装了Composer
  • 一部智能手机。

让我们在PHP中创建一个QR码

首先,我们需要创建一个项目目录结构来存储我们要使用的所有文件。要做到这一点,请切换到顶层目录,并运行下面的命令:

mkdir -p php-qr-code-generator \
    php-qr-code-generator/src/QR/{Image,Options} \
    php-qr-code-generator/public/img

cd php-qr-code-generator

如果你使用的是Microsoft Windows,运行下面的命令 而不是

mkdir php-qr-code-generator
mkdir php-qr-code-generator/src/QR/Image
mkdir php-qr-code-generator/src/QR/Options
mkdir php-qr-code-generator/public/img

cd php-qr-code-generator

安装依赖项

接下来,是时候安装该项目唯一的依赖,即chillerlan/php-qrcode。要做到这一点,运行下面的命令:

composer require chillerlan/php-qrcode

编写代码

现在,是时候写一些代码了。使用你的IDE或文本编辑器,在公共场合创建一个名为index.php的新文件,并在其中添加以下代码:

<?php

declare(strict_types=1);

use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;

require_once('./../vendor/autoload.php');

$options = new QROptions(
  [
    'eccLevel' => QRCode::ECC_L,
    'outputType' => QRCode::OUTPUT_MARKUP_SVG,
    'version' => 5,
  ]
);

$qrcode = (new QRCode($options))->render('https://twilio.com');
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
  <title>Create QR Codes in PHP</title>
  <link rel="stylesheet" href="/css/styles.min.css">
</head>
<body>
<h1>Creating QR Codes in PHP</h1>
<div class="container">
  <img src='<?= $qrcode ?>' alt='QR Code' width='800' height='800'>
</div>
</body>
</html>

这段代码首先导入所需的类,并包括Composer的自动加载器。之后,它初始化了一个新的QROptions 实例,名为$options ,它存储了生成QR码的选项。

然后,这个对象被用来初始化一个QRCode 对象,该对象通过其render() 方法负责生成QR码。对于render() ,我们传递要存储在QR码中的数据,也就是Twilio的URL。随意改变它为你喜欢的任何字符串。

之后,QR码在一个小的HTML页面的img 标签中被呈现出来。该页面包括一些额外的标记,以使其更加专业,使用了一个用Tailwind CSS构建的自定义样式表。

确保你 style.min.css 下载public/css,否则该页面将无法按预期呈现。

测试代码是否有效

写好代码后,我们需要测试它是否工作。要做到这一点,在项目的根目录下运行以下命令,启动你的本地服务器,使用公共目录作为目录根:

php -S 0.0.0.0:8080 -t public

然后在你的网络浏览器中打开*http://localhost:8080*。你会看到呈现的页面类似于下面的图片。

The QR code rendered in the browser.

如果你想减少空间,或二维码和边框之间的安静区域,可以尝试将LogoOptions['quietzoneSize'] 设置为1-3的值,或将LogoOptions['addQuietzone'] 设置为false

创建一个带有商标的QR码

也可以在二维码上添加品牌或标识,比如出于营销目的和建立用户信任。要做到这一点,我们要利用chillerlan/php-qrcode附带的一个例子类。QRImageWithLogo.

首先,将vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php复制到src/QR/Image,并将其namespace ,即App\QR\Image

然后,使用你的IDE或文本编辑器,在src/QR/Options中创建一个名为LogoOptions.php的新文件。在该文件中,添加以下代码:

<?php

declare(strict_types=1);

namespace App\QR\Options;

use chillerlan\QRCode\QROptions;

class LogoOptions extends QROptions
{
  protected int $logoSpaceWidth;
  protected int $logoSpaceHeight;
}

这段代码扩展了基础QROptions 类,允许它设置覆盖在QR码上的图像的宽度和高度。

配置Composer的自动加载器配置

接下来,由于我们已经创建了一些自定义类,我们需要注册一个PSR-4自动加载器,以便在运行时找到它们。要做到这一点,在composer.json中添加以下JSON片段,在require 块之后:

"autoload": {
  "psr-4": {
    "App\\": "src/"
  }
}

然后,在项目根目录下的终端,运行以下命令:

composer dump-autoload

更新代码

接下来你需要做的是用以下代码替换public/index.php中的$options$qrcode 的定义:

$options = new LogoOptions(
  [
    'eccLevel' => QRCode::ECC_H,
    'imageBase64' => true,
    'logoSpaceHeight' => 17,
    'logoSpaceWidth' => 17,
    'scale' => 20,
    'version' => 7,
  ]
);

$qrOutputInterface = new QRImageWithLogo(
  $options,
  (new QRCode($options))->getMatrix(''https://twilio.com'')
);

$qrcode = $qrOutputInterface->dump(
  null,
  __DIR__.'/../public/img/logo-twilio-mark-red.png'
);

注意:确保你添加下面的import 语句

use App\QR\Image\QRImageWithLogo;
use App\QR\Options\LogoOptions;

代码开始时将$options 初始化为一个新的LogoOptions 实例。LogoOptions 是一个自定义的Options 类,它包含两个额外的成员变量。$logoSpaceWidth, 和$logoSpaceHeight 。这些会影响覆盖在QR码上的图像的大小。

$logoSpaceWidth 和 是不能平均分割的。$logoSpaceHeight

除了这两个之外,这个代码还设置了另外两个:

  • imageBase64:这决定了QR码是否会被呈现为二进制数据或Base64编码的字符串。我把它设置为 "真",因为它使QR码的渲染更简单。
  • scale:这设置了一个QR码像素的大小。该值越高,QR码的质量就越高。

ECC_H 我们还将eccLevel ,以允许我们在二维码上叠加一个标志,并将version ,以允许更高水平的纠错,因为二维码中的数据量增加了,所以需要纠错。

之后,我们将$qrOutputInterface 初始化为一个新的QRImageWithLogo 实例,该实例处理生成一个QR码,并使用PHP的GD扩展将指定的图像覆盖在上面。

$options 我们将一个新的 对象传递给 's constructor,这样它就知道如何生成QR码以及要存储在其中的数据。QRMatrix QRImageWithLogo

代码最后调用$qrOutputInterface'sdump 方法,将图像覆盖在QR码上,并返回QR码的Base64编码的字符串表示。

我们把null作为第一个参数传给dump 。如果我们愿意,我们可以通过指定输出文件的绝对或相对路径来生成一个PNG文件。

添加一个图像文件

在测试变化之前,我们需要做的最后一件事是选择我们要覆盖在QR码上的图像。为了本文的目的,我使用Twilio的标志。要下载它,首先在Twilio的库中打开它,然后点击页面右下方的**"实际尺寸_PNG**"链接。

如果你选择使用不同的图片,请确保你将图片保存在public/img中,并将图片的路径作为第二个参数传给$qrOutputInterface->dump()

测试这些变化是否有效

随着代码和图像的到位,让我们生成新版本的QR码,看看它是什么样子。要做到这一点,在你的浏览器中重新加载http://localhost:8080,你应该看到它的渲染类似于下面的截图。

The QR code with branding rendered in the browser.

**注意:**如果你想改变QR码的矩阵,可以尝试在初始化LogoOptions 时将maskPattern 设置为1至7的值,或QRCode::MASK_PATTERN_AUTO 。看到二维码显示方式的差异是相当有趣的。

这就是在PHP中创建QR码的方法

chillerlan/php-qrcode这样的包或Packagist上的其他包可以帮助你在你的应用程序中生成QR码,无论是否有品牌效应。我强烈建议在你的应用程序中使用它们,只要它们有意义。

在阅读本教程后,您是否考虑在您的应用程序中使用QR码?如果是,如果是,我很想看看你的作品。