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环境版本不够导致无法使用。

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

相关推荐
程序员爱钓鱼28 分钟前
Python 编程实战:环境管理与依赖管理(venv / Poetry)
后端·python·trae
w***488228 分钟前
Spring Boot3.x集成Flowable7.x(一)Spring Boot集成与设计、部署、发起、完成简单流程
java·spring boot·后端
程序员爱钓鱼30 分钟前
Python 编程实战 :打包与发布(PyInstaller / pip 包发布)
后端·python·trae
IT_陈寒1 小时前
Redis 性能提升30%的7个关键优化策略,90%开发者都忽略了第3点!
前端·人工智能·后端
Victor3561 小时前
Redis(137)Redis的模块机制是什么?
后端
Victor3561 小时前
Redis(136)Redis的客户端缓存是如何实现的?
后端
不知更鸟6 小时前
Django 项目设置流程
后端·python·django
黄昏恋慕黎明8 小时前
spring MVC了解
java·后端·spring·mvc
G探险者10 小时前
为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
数据库·后端·mysql
百锦再10 小时前
第18章 高级特征
android·java·开发语言·后端·python·rust·django