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

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

相关推荐
千寻girling几秒前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
南极企鹅2 分钟前
springBoot项目有几个端口
java·spring boot·后端
Luke君607974 分钟前
Spring Flux方法总结
后端
define95278 分钟前
高版本 MySQL 驱动的 DNS 陷阱
后端
忧郁的Mr.Li42 分钟前
SpringBoot中实现多数据源配置
java·spring boot·后端
暮色妖娆丶1 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_2 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
Java后端的Ai之路2 小时前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway
野犬寒鸦2 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
Honmaple3 小时前
OpenClaw 实战经验总结
后端