引言

最近有一个生成很多小程序码的需求,生成的小程序码还要嵌入在指定的图片模板上,就去找轮子,没找到合适的轮子。。无奈之下就决定去撸一个。目前已经完成并发布npm。

Github:github.com/Jon-Millent…

需求

如下图

  • 生成带参数的小程序二维码
  • 要指定尺寸和位置到模板图上
  • 要批量生成若干张

开始干活

生成带参数的小程序二维码

通过官方文档,列出了生成小程序二维码的三种模式

  • createWXAQRCode 获取小程序二维码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制。官方说明

  • getWXACode 获取小程序码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制。 官方说明

  • getWXACodeUnlimit 获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。 官方说明

这些接口都要通过access_token来换取。让我们造个类

let AngerWechat = require('anger-wechat') // 微信操作辅助库(自己写的)class miniQrcode {// 存放三种模式的接口constructor(config) {this.mode = {'getWXACode': 'https://api.weixin.qq.com/wxa/getwxacode','getWXACodeUnlimit': 'https://api.weixin.qq.com/wxa/getwxacodeunlimit','createWXAQRCode': 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode',}// 初始化微信辅助库this.$wx = new AngerWechat({appId: this.config.appId, // appId 必传appSecret: this.config.appSecret, // appSecret 必传})// 临时数据存放文件,用于存放access_token,因为access_token有2个小时的生存期,避免重复获取this.databasePath = path.join(__dirname, '../', 'database.json')}
}
复制代码

实现核心方法

   // 生成核心方法async getWxQrcodeInfo(concatConfig){// 获取已经存放的文件里的access_token,如果有的话并且有效的话就不用再掉接口let innerDatabase = this.getDatabase() // 如果本地的数据没有access_token 或者超过2个小时 就去请求获取if(!innerDatabase.access_token ||  ((new Date().getTime() - innerDatabase.create_time) > 7200000) ) {let accessInfo = await this.$wx.getGlobalAccessToken()// 获取access_token然后写入文件// 具体代码省略}// 获取到access_token去请求接口let qrcodeInfo  = await this.postMan(this.getApiUrl(innerDatabase.access_token, concatConfig.mode), // 根据mode来区调用接口concatConfig.config // 用户传的参数)let returnData = {}if(qrcodeInfo.type.indexOf('image') !== -1) { //类型是图片的就是获取成功了// 请求成功 保存图片returnData = {code: 200,image: qrcodeInfo.data,error: null}} else {returnData = {code: 500,error: JSON.stringify(qrcodeInfo.data.toString()),image: null}}return returnData}
复制代码

写好后让我们测试一下

    let qrocode = new miniQrcode({appId: 'xxx',appSecret: 'xxx'});let info = await qrocode.getWxQrcodeInfo({mode: 'getWXACode',config: {path: `pages/index/main?id=123456`},})fs.writeFileSync(`./output-juejin-test1.png`, info.image, 'utf8');
复制代码

效果:

如何测试参数?我在这个已经发布的小程序里面加了个彩蛋,就是长按红色圈出区域两次即可调出控制台看参数

将二维码合成到模板图片里面

这个操作依赖于sharp

const sharp = require('sharp');class miniSharp {constructor(templateUrl){this.templateUrl = templateUrl}// 重置图片大小async resizeQrcode(imageBuffer, config){return new Promise(resolve => {sharp(imageBuffer).resize(config.width, config.width).toBuffer().then(function(outputBuffer) {resolve(outputBuffer)});})}// 合并图片async concatImage(buffer, config){return new Promise(resolve => {sharp(this.templateUrl).overlayWith(buffer, {top: config.top,left: config.left}).toBuffer().then(function(outputBuffer) {resolve(outputBuffer)});})}// 主函数async renderImage(qrcodeBuffer, config){let resizeQrcodeBuffer = await this.resizeQrcode(qrcodeBuffer, config)let concatQrocdeBuffer = await this.concatImage(resizeQrcodeBuffer, config)return concatQrocdeBuffer}}module.exports = miniSharp复制代码

测试一下

    let qrocode = new miniQrcode({appId: 'xxxx',appSecret: 'xxx'});let mySharp = new miniSharp('./template.png');let info = await qrocode.getWxQrcodeInfo({mode: 'getWXACode',config: {path: `pages/index/main?id=123456`},})let renderBuffer = await mySharp.renderImage(info.image, // 二维码图片的 buffer 数组 { width: 200, // 重新设置二维码宽度left: 362, // x轴偏移top: 53 // y轴偏移})fs.writeFileSync(`./output-juejin-test1.png`, renderBuffer, 'utf8');
复制代码

批量处理

正常情况下,批量生成100张需要62.556秒,平均每张需要0.62556秒,1万张大概需要 1.73小时。 批量示例代码

关于调试

使用微信开发者工具可以进行模拟参数调试

测试接口

这里我提供了一个测试接口,可以带参数生成线上的小程序码,用来调试

[get] http://wx.toolos.cc 参数

  • mode 必传 [createWXAQRCode | getWXACode | getWXACodeUnlimit] 之一

注意

  • 其他参数对应上面的文档的mode对应的参数,path 或者 page 需要 encodeURIComponent 一下
  • 目前小程序只有一个路径 pages/index/main
  • 线上服务器配置低

示例

http://wx.toolos.cc/?mode=createWXAQRCode&path=pages%2Findex%2Fmain
复制代码

关于参数模式

createWXAQRCode & getWXACode

这两种生成的参数,生成二维码数量有限,参数直接跟在path路径后面,例如:

let info = await qrocode.getWxQrcodeInfo({mode: 'createWXAQRCode',config: {page: `pages/index/main?sgr=521314&i=loveyou`},
})
复制代码

getWXACodeUnlimit

这个可以生成无限个,但是只能携带有局限性的参数scene,在这里推荐一种解析方式 key:value-key:value

let info = await qrocode.getWxQrcodeInfo({mode: 'getWXACodeUnlimit',config: {page: `pages/index/main`,scene: 'i:loveyou-sgr:521314'},
})
复制代码

解析示例

onLoad (query) {// scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scenethis.scene = decodeURIComponent(query.scene)this.queryJson = JSON.stringify(query)// 尝试解析  scene 格式: shop:1-id:2try {let oneArr = this.scene.split('-')let twoJson = {}for(let i=0; i<oneArr.length; i++) {let target = oneArr[i].split(':')twoJson[target[0]] = target[1]}this.twoJson = JSON.stringify(twoJson)} catch(e) {this.twoJson = e}},
复制代码

在开发者工具中例如下面模拟

批量生成100万张小程序码?了解一下。相关推荐

  1. 微信小程序如何批量生成带参数的小程序码,无需开发

    工作中遇到一个需求,批量生成小程序码,但是通过微信公众平台生成只能一次生成一张,如果通过小程序提供是接口去调用太费事了而且文档不全面,所以最终找到了一个第三方的网站-草料二维码生成器,使用后还不错,分 ...

  2. 基于thinkphp6的上传excel批量生成带参数的小程序码功能

    前言 最近公司说要帮人生成一批一店一码的小程序码,本来想找第三方生成一下就好了,奈何数量有点多,满足此需求的只有某料二维码,但某料二维码批量上传生成小程序码需要小程序的管理员授权,因为某些原因,拿不到 ...

  3. PHP生成带参数的小程序码

    生成小程序码并携带参数 我们平时在开发微信小程序时,会遇到如下场景,需要制作某个推广链接,然后需要生成一个专属小程序码,扫描这个专属二维码时,获取到推广的链接携带的参数跳转到指定的界面.这个看似很难, ...

  4. php 生成微信小程序码(可携带参数) 永久有效,数量暂无限制

    官方文档入口 一.首先要先获取 access_token,把拿到的token存放在redis中  a.php文件 /*** 获取小程序全局唯一后台接口调用凭据 accessToken* access_ ...

  5. 微信小程序通过云函数生成带参数的小程序码

    小程序云开发还是挺强大啊,以前动不动就需要后端攻城狮进行操作,现在没后端啥事了,但是头发却开始紧张了啊!o(╥﹏╥)o 公众平台模式: 在没有用云函数时,只能先在微信公众平台去生成带参数的小程序码,接 ...

  6. Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)

    目录 前言 操作流程 1.注册微信小程序 2.通过后台获取小程序码 注意事项 时序图理解 方案实现步骤 前言 很多业务场景之下我们需要实现微信扫码登录检测登录状态的需求,或需要同步网站与小程序的用户信 ...

  7. 小程序码之拉新推广需求实现

    需求场景 公司产品小程序需要做推广,用户通过小程序生成自己的小程序推广海报(海报内容包含小程序码及一些其他信息),新用户通过扫描他人分享的海报小程序码进入小程序并授权注册,则此用户与推广者绑定为被推光 ...

  8. 小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈

    小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈 一.概述 需要用到的生成二维码组件(可自行下载添加到小程序根目录utils里):https://github.com/demi52 ...

  9. 微信小程序 生成小程序码 + Java后台

    微信小程序 生成小程序码 首先看下效果图: 微信小程序已经上线很久了.现在才开始把代码拷进来 因为真的很忙 ---- 先看代码吧.首先是小程序端的内容: 怕麻烦 全部拷进去吧 这块的需求就是完成分享小 ...

最新文章

  1. 切换不了摄像头 高拍仪_手机摄像头模组支架保护膜的变革之路
  2. Python 之杀不死的Shell子进程
  3. matlab中多边形滤波器,几种常见空间滤波器MATLAB实现
  4. python写错了怎么撤回_python新手常见错误汇总
  5. python测验2_测验2: Python基础语法(上) (第4周)
  6. jsonobject修改key的值_JSONObject(org.json)的一点修改
  7. 左手用R右手Python系列之——表格数据抓取之道
  8. BXP无盘的更新操作详解(大镜像)(转)
  9. Jetson nano : PWM风扇调速。
  10. java Outlook的日程_使用Outlook进行日程安排的方法
  11. 无监督学习 半监督学习 #博学谷IT学习技术支持#
  12. react-router-dom v6 使用
  13. vs2015中提示未能找到类型或命名空间名Word
  14. java日志(四)--jcl和log4j及log4j2使用
  15. 农产品商铺商城小程序(JavaSSM+微信小程序)
  16. 苹果13mini和苹果13参数对比选哪个 苹果13mini和苹果13的区别
  17. 好用的Google浏览器插件
  18. android自动化测试辅助工具Weinre
  19. DHCP和交换机的工作原理
  20. 2019年定义区块链领域的7个法律问题(下篇)

热门文章

  1. Hazelcast集群服务(2)——Hazelcast基本配置
  2. 码农必读的 7 本计算机书
  3. IIS日志作用与分析
  4. 转载的SSO文章,很基础
  5. 感受JTable 与 JTableModel
  6. php tp5支付宝app支付,支付宝APP支付 统一下单 php服务端 tp5
  7. equals和hashCode
  8. kafka+zookeeper内外网双网卡配置(针对不同网段)
  9. MySQL等值连接的介绍
  10. 把第三方jar包放入本地仓库