TP6 生成二维码 dh2y/think-qrcode扩展包

最近在工作中,老板提出一个需求,把优惠券序列号生成二维码,让用户实现扫码领取优惠券,省去手动输入的麻烦。站在用户角度思考问题,这个需求非常必要,站在技术角度去思考,这个需求在可以实现的范围内。于是就开始了老板张张嘴,下属跑断腿的开发之旅。

我们的项目使用的tp6框架,自然是在网上查找相关的插件扩展包,在查询了很久资料之后,最终选择了两个扩展包,分别是:dh2y/think-qrcode:https://packagist.org/packages/dh2y/think-qrcodeendroid/qr-code : https://packagist.org/packages/endroid/qr-code. 因为项目比较大,为了稳妥起见,先单独运行一个tp6 的框架进行测试。

测试步骤,就是按照composer文档提示,执行composer安装命令

第一步:执行安装命令 composer require endroid/qr-code
第二步:按照文档说明去配置:

按照官方包说的进行配置,就可以生成二维码,甚至是生成待logo的二维码。但是,我要说但是了,我在使用过程中仍然遇到了坑,

arduino 复制代码
第一个坑:指定图像缓存位置,config配置不管用,以及fileout参数配置细节的坑
第二个坑:指定位置生成带logo二维码,logo无法添加到二维码中

以下直接上正确的代码,希望能给看到的朋友一点提醒,细节都以注释添加了。

php 复制代码
$code = new QRcode();
//如果日期文件夹不存在,创建文件夹
// 创建二维码指定到新的文件夹时,文件夹不存在,没有创建文件夹功能,所有这一步判断创建指定文件夹必须要有!!!
$uploadPath = public_path("uploads/" . date('Ymd'));
if (!is_dir($uploadPath)) {
    mkdir($uploadPath, 0777, true);
}

// 配置缓存文件夹如果有大佬实现成功,请在评论区不吝指教
// config('qrcode.cache_dir','../runtime/cache/qrcode');  // config 配置新的缓存文件夹无效,在config配置文件夹配置也是无效。 

//网上查阅资料大部分是这个官方默认的方法,胜场没有任何问题,如果你不需要更换二维码缓存文件夹可以职级使用这个
$code_path = $code->png('二维码携带的参数','',10)           //生成二维码  该行命令 生成默认文件夹位置的二维码
->logo('static/800.png')         //生成logo二维码
->text('扫码兑换农购网提货券', 28, ['center', 740], '#ff0000')   //添加文字水印
->getPath();                                //获取二维码生成的地址

//我就是需要更换保存二维码的文件夹,在outfile参数上踩坑了。爬坑很难,填坑方法就是:outfile 参数  要无必要写到图片后缀.png(.jpg)
$code_path = $code->png('123456789',"uploads/".date('Ymd').'/'.time().'.png',10)        //生成二维码
->logo('static/800.png')         //生成logo二维码
->text('扫码兑换农购网提货券', 28, ['center', 740], '#ff0000')   //添加文字水印
->getPath();                                //获取二维码生成的地址

var_dump('返回url路径',$code ->entry()); echo "<br>";
var_dump('二维码的相对路径',$code ->getPath());  echo "<br>";
return $code_path;

还有一个坑就是,指定新位置生成二维码后,想让带上logo不会生成,这一点我目前的解决办法必须修改源码,就是注释掉一行方法中的代码

ini 复制代码
namespace dh2y\qrcode;
use think\Exception;
use think\facade\Config;
use think\facade\Request;
class QRcod
{
   ........其他代码........
    public function logo($logo){
        if (!isset($logo)||$logo=='') {
            $this->error = 'logo不存在';
            return false;
        }
        $QR = imagecreatefromstring(file_get_contents($this->outfile));
        $logo = imagecreatefromstring(file_get_contents($logo));
        $QR_width = imagesx($QR);//二维码图片宽度
        $QR_height = imagesy($QR);//二维码图片高度
        $logo_width = imagesx($logo);//logo图片宽度
        $logo_height = imagesy($logo);//logo图片高度
        $logo_qr_width = $QR_width / 5;
        $scale = $logo_width/$logo_qr_width;
        $logo_qr_height = $logo_height/$scale;
        $from_width = ($QR_width - $logo_qr_width) / 2;
        //重新组合图片并调整大小
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);

        // 注释掉这行代码,这行代码会调用方法默认的缓存文件夹路径,而不是指定的文件夹路径
        // $this->outfile = $this->cache_dir.'/'.time().'.png';

        imagepng($QR, $this->outfile);
        imagedestroy($QR);
        return $this;
}

   ........其他代码........
}

当然,我也测试了开头提到的另外一种生成二维码的方法endroid/qr-code ,它在本地测试环境中使用一切都是正常的,指定生成新的二维码缓存位置,甚至在二维码下方生成一行提示"扫码兑换优惠券"都非常的让我心动。但是在开发环境使用时候,二维码就不能正常生成。我看这个扩展包的介绍,php版本要大于8.0. 目前我理解的是:线上php环境版本不够导致无法使用。

以上就是我在使用二维码生成插件时候遇到的坑,以及解决办法。 未经授权请勿转载! 加鸡腿:

相关推荐
【D'accumulation】1 分钟前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
2401_8543910811 分钟前
高效开发:SpringBoot网上租赁系统实现细节
java·spring boot·后端
Cikiss19 分钟前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
Cikiss21 分钟前
微服务实战——平台属性
java·数据库·后端·微服务
OEC小胖胖34 分钟前
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
java·spring boot·后端·spring·mybatis·web
2401_857617621 小时前
SpringBoot校园资料平台:开发与部署指南
java·spring boot·后端
计算机学姐1 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
Yvemil72 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
2401_854391082 小时前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端
虽千万人 吾往矣3 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang