如今,二维码几乎无处不在!
这是有道理的。它们很小,无需特殊软件就能在任何现代智能手机上读取,并让我们轻松快速地完成许多事情,如在咖啡馆签到、进入WiFi网络、在暑假中使用滑板车,以及进行购买。
下面是我从网上找到的一些例子:

所以,如果你想知道如何在你基于PHP的应用程序中创建它们,请继续阅读。
前提条件
要学习本教程,你需要具备以下条件:
让我们在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*。你会看到呈现的页面类似于下面的图片。

如果你想减少空间,或二维码和边框之间的安静区域,可以尝试将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,你应该看到它的渲染类似于下面的截图。

**注意:**如果你想改变QR码的矩阵,可以尝试在初始化LogoOptions 时将maskPattern 设置为1至7的值,或QRCode::MASK_PATTERN_AUTO 。看到二维码显示方式的差异是相当有趣的。
这就是在PHP中创建QR码的方法
像chillerlan/php-qrcode这样的包或Packagist上的其他包可以帮助你在你的应用程序中生成QR码,无论是否有品牌效应。我强烈建议在你的应用程序中使用它们,只要它们有意义。
在阅读本教程后,您是否考虑在您的应用程序中使用QR码?如果是,如果是,我很想看看你的作品。