您的当前位置:首页>全部文章>文章详情

【PHP】TP使用endroid/qr-code生成二维码

CrazyPanda发表于:2024-03-08 17:54:18浏览:347次TAG:

前言

TP版本:TP6.0

Packagist 传送地址: https://packagist.org/packages/endroid/qr-code

使用前需要检查下是否启用了 gd2 扩展,对于 endroid/qr-code 版本选择,参考扩展包文档对 PHP 版本的要求

1、 安装扩展

执行 composer 命令安装 endroid/qr-code 扩展

composer require endroid/qr-code

2、 使用builder生成器

use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\Label\Alignment\LabelAlignmentCenter;
use Endroid\QrCode\Label\Font\NotoSans;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;

$result = Builder::create()
    ->writer(new PngWriter())
    ->writerOptions([])
    // 二维码文本
    ->data('https://www.itqaq.com')
    // 内容编码
    ->encoding(new Encoding('UTF-8'))
    // 容错等级(越高二维码越密集)
    ->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
    // 二维码内容区域大小
    ->size(300)
    // 二维码内容外边距大小
    ->margin(10)
    // 二维码内容圆形块尺寸模型
    ->roundBlockSizeMode(new RoundBlockSizeModeMargin())
    // 二维码中间区域logo图片
    ->logoPath(__DIR__ . '/3.png')
    ->logoResizeToWidth(100)
    ->logoResizeToHeight(100)
    // 二维码下方文字
    ->labelText('长按识别二维码')
    ->labelFont(new NotoSans(20))
    ->labelAlignment(new LabelAlignmentCenter())
    // 验证读取器(默认情况下禁用)
    ->validateResult(false)
    // 执行生成器
    ->build();

生成二维码,直接返回前端

/**
 * 生成二维码图片:url会直接跳转(url必须带有http,否则不会跳转;其他情况会生成带有参数的二维码)
 * @param $data
 * @param string $label  图片上可添加的其他文案
 * @param int $size
 * @param int $margin
 * @return string
 */
public static function generateQrCode($data, $label = '', $size = 300, $margin = 10)
{
    $qr = Builder::create()
        ->writer(new PngWriter())
        ->writerOptions([])
        ->data($data)
        ->encoding(new Encoding('UTF-8'))
        ->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
        ->size($size)
        ->margin($margin)
        ->roundBlockSizeMode(new RoundBlockSizeModeMargin());
    if (!empty($label)) {
        $qr->labelText($label)
            ->labelFont(new NotoSans(20))
            ->labelAlignment(new LabelAlignmentCenter());
    }
    return $qr->build()->getDataUri();
}

生成二维码图片并保存本地

生成二维码图片,并保存到指定路径,可跟进业务对保存到指定路径的图片进行其他处理

/**
 * @param $data
 * @param $path:要保存图片到某一个路径,路径可自定义一个有权限的路径
 * @param int $size
 * @param int $margin
 * @param string $label 
 * @return array|string|null
 * @author anxiaowen
 */
public static function savePath($data, $path, $label = '', $size = 300, $margin = 10)
{
    $qr = Builder::create()
        ->writer(new PngWriter())
        ->writerOptions([])
        ->data($data)
        ->encoding(new Encoding('UTF-8'))
        ->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
        ->size($size)
        ->margin($margin)
        ->roundBlockSizeMode(new RoundBlockSizeModeMargin());
    if (!empty($label)) {
        $qr->labelText($label)
            ->labelFont(new NotoSans(20))
            ->labelAlignment(new LabelAlignmentCenter());
    }
    $result = $qr->build();
    $result->saveToFile($path);
    // todo 此时已生成图片在指定的路径;根据自身业务对  保存到 $path的图片处理
}

3、 不使用builder生成器

use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Label\Label;
use Endroid\QrCode\Logo\Logo;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;

$writer = new PngWriter();
$qrCode = QrCode::create('https://www.itqaq.com')
    // 内容编码
    ->setEncoding(new Encoding('UTF-8'))
    // 容错等级
    ->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())
    // 内容区域大小
    ->setSize(300)
    // 内容区域外边距
    ->setMargin(10)
    // 内容圆形块尺寸模型
    ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
    // 内容颜色
    ->setForegroundColor(new Color(0, 0, 0))
    // 背景颜色
    ->setBackgroundColor(new Color(255, 255, 255));
// 二维码logo logo
$logo = Logo::create(__DIR__ . '/3.png')
    ->setResizeToWidth(50);
// 二维码下方文字 label
$label = Label::create('Label')
    ->setTextColor(new Color(255, 0, 0));
// 生成二维码数据对象(后面两个参数都是可选的)
$result = $writer->write($qrCode, $logo, $label);

实际开发中,使用最多的是根据一串普通文本生成字符串,所以我将代码做了简化,方便以后快速使用

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Encoding\Encoding;

$qrCode = QrCode::create('https://www.itqaq.com')
    // 内容编码
    ->setEncoding(new Encoding('UTF-8'))
    // 内容区域大小
    ->setSize(200)
    // 内容区域外边距
    ->setMargin(10);
// 生成二维码数据对象(后面两个参数都是可选的)
$result = (new PngWriter)->write($qrCode);

输出二维码

// 直接输出在浏览器中
// ob_end_clean(); //处理在TP框架中显示乱码问题
// header('Content-Type: ' . $result->getMimeType());
// echo $result->getString();

// 将二维码图片保存到本地服务器
// $result->saveToFile(__DIR__ . '/qrcode.png');

// 返回 base64 格式的图片
$dataUri = $result->getDataUri();
echo "<img src='{$dataUri}'>";


猜你喜欢

【PHP】thinkphp设计模式讲解
一、设计模式简介 &nbsp;首先我们来认识一下什么是设计模式: &nbsp;设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 &nbsp;设计模式不是Java的专利,我们用面向对象的方法在PHP里也能很好的使用23种设计模式。 &nbsp;那么我们常说的架构、框架和设计模式有什么关系呢? &nbsp;架构是一套体系结构,是项目的整体解决方案;框架是可供复用的半成品软件,是具体程序代码。架构一般会涉及到采用什么样的框架来加速和优化某部分问题的解决,而好的框架代码里合理使用了很多设计模式。 &nbsp;二、提炼设计模式的几个原则: &nbsp;
发表于:2024-06-24 浏览:240 TAG:
【PHP】thinkphp5支付宝服务商手机网站支付(新版sdk)
&nbsp;public&nbsp;function&nbsp;pay()&nbsp;{ &nbsp;Vendor(&#39;alipay.wappay.service.AlipayTradeService&#39;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vendor(&#39;alipay.wappay.buildermodel.AlipayTradeWapPayContentBuilder&#39;); &nbsp;&nbsp;&amp;
发表于:2023-12-27 浏览:319 TAG:
【PHP】详解PHP的Sodium加密扩展函数
Sodium 出现的目的也是为了代替Mcrypt这个原来的加密扩展。在 PHP7.2 之后,Mcrypt已经被移除,在PHP7.1时就已经被标记为过时。不过,Sodium扩展的应用也并不是很多,大部分情况下我们都会使用OpenSSL来进行加密操作,所以,我们这篇文章只做了解即可。Sodium 扩展在 PHP7.2 后是跟随 PHP 源码一起发布的,只需要在编译的时候加上 --with-sodium 即可安装成功。如果是 PHP7.2 之前的版本,需要单独安装这个扩展。同时,操作系统中也需要安装
发表于:2023-12-19 浏览:290 TAG:
【PHP】thinkphp利用缓存提高数据库查询性能
ThinkPHP是一款十分受欢迎的PHP框架,它提供了许多便捷的功能和优化的设计,使得开发者可以更高效地进行Web应用程序的开发。其中,利用缓存提高数据库查询性能是一个常见的优化手段。本文将分享一些关于如何在ThinkPHP中利用缓存提高数据库查询性能的经验。一、什么是缓存?缓存是指将经常查询的数据存储在快速访问的存储介质中,以提高数据的访问速度。在Web应用程序中,数据库是最常用的数据存储介质之一。而经常查询数据库会带来一定的性能压力。因此,利用缓存可以避免频繁地查询数据库,从而提高
发表于:2023-12-08 浏览:424 TAG:
【PHP】7个php字符串处理函数有哪些
7个php字符串处理函数有strlen()、strpos()、substr()、str_replace()、strtolower()、strtoupper()、trim()等。详细介绍:1、strlen(),用于获取字符串的长度;2、strpos(),用于查找字符串中的特定子串,返回第一次出现位置;3、substr(),用于获取字符串的子串;4、str_replace()等等。本教程操作系统:Windows10系统、PHP8.1.3版本、Dell G3电脑。在PHP中,有许多可以用于字
发表于:2023-12-04 浏览:684 TAG:
【PHP】PHP查找二维数组特定元素
在 PHP 中找到二维数组中特定的元素,最常见的方法是使用循环和条件语句进行遍历,直到找到所需的元素。也可以使用 PHP 内置的函数如 array_search() 或 array_column(),它们可以在特定条件下帮助我们在二维数组中查找某个数据或所需的元素。以下是使用循环查找一个二维数组中特定元素的例子:$people&nbsp;=&nbsp;array( &nbsp;&nbsp;array(&#39;id&#39;&nbsp;=&gt;&nbsp;1,&nbsp;&#39;name&amp;#
发表于:2024-08-28 浏览:249 TAG: #php
【PHP】用PHP从数据库到后端到前端完整实现一个中秋节祝福语项目
文章目录🚀一、前言🚀二、开发环境准备🚀三、功能实现🍁3.3.1 HTML布局🍁3.3.2 JQuery事件处理🍁3.2.1 连接数据库🍁3.2.1 获取祝福语🍁3.2.3 处理请求🍁3.2.4 配置Nginx与FPM🍁3.1.1 创建数据库及表结构🍁3.1.2 准备数据🔎3.1 准备数据库和数据🔎3.2 后端开发🔎3.3 前端开发🚀四、运行和测试🔎4.1 绑定host🔎4.2 开始测试🚀五、总结中秋佳节即将来临!在这特殊的时刻,我们特别举办一场属于程序员的中秋
发表于:2023-12-06 浏览:438 TAG:
【PHP】删除文件为什么会失败
php删除文件失败的原因:文件在删除时仍然被其他线程或进程占用。解决方法:首先手动释放文件对象,避免因为被其他线程或进程占用而导致删除失败;然后利用unlink()函数删除文件即可。原因分析:文件仍然被其他进程占用。所以我们最好释放下文件对象,避免因为被其他线程或进程占用而导致删除失败。(推荐教程:php图文教程)unlink() 函数删除文件。如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。(视频教程推荐:php视频教程)代码实现:1234567891011121314
发表于:2023-12-06 浏览:579 TAG:
【PHP】thinkphp用db还是模型
在使用thinkphp框架进行开发时,开发者常常会面临一个选择:使用数据库操作(db)还是模型(model)。数据库操作是直接对数据库进行操作,可以直接写SQL语句,操作更加灵活。模型则是通过封装操作数据库,提供了更加便于使用的增删改查方法。那么,究竟该选择使用哪种方式呢?下面就让我们来探讨一下。一、使用数据库操作1.优点(1)灵活:使用数据库操作可以灵活地编写SQL语句,可以通过拼接字符串等方式完成各种复杂的查询操作。(2)效率高:数据库操作直接面向数据库,执行起来速度比较快。(3)适用面广:
发表于:2024-03-15 浏览:310 TAG:
【PHP】workerman-jsonRpc 与 thinkphp6结合 的方法
1.下载workerman-jsonRpc的包2.将包内 vendor / workerman 下的内容放进tp的vendor目录下并加载(我先用composer装了GatewayWorker,然后把文件覆盖进去了) 3.创建一个tp的命令行,并给这个命令行添加2个自定义参数 4.将workerman-jsonrpc根目录下的start.php内容复制到你创建的命令行类的执行方法里,并把引入vendor那行删掉 5.打开workerman扩展的目录,找到Worker.php类文件 找到其中的
发表于:2024-05-27 浏览:280 TAG: