nodejs/koa 微信小程序码生成

先准备三个依赖,酌情使用,还是比较方便的

1
2
3
4

const fs = require("fs") //Node.js 文件系统,检测以及创建小程序码图片使用
const rp = require('request-promise'); //发起POST GET 请求
const redis = require("../../config/redis"); //存储access_token 使用

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

const id = '想要传递的小程序页面参数'
const APPID = '小程序APPID'
const SECRET = '小程序SECRET'
let access_token = await redis.get("access_token") //检查redis中是否存有access_token
if (!access_token) {
//如果没有就去获取,并存到redis中
let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${SECRET}`
let res = await rp({
method: 'GET',
uri: url,
json: true
});
access_token = res.access_token
redis.set("access_token", access_token, "EX", 7200);
}

//检查是否已经获取过小程序码
const imgname = `./public/images/${id}.jpg`
let exists = await fs.existsSync(imgname)

if (!exists) {

//如果没有,使用获取到的access_token去获取小程序码
const qrcodeurl = 'https://api.weixin.qq.com/wxa/getwxacode?access_token=' + access_token
let options = {
method: 'POST',//注意为POST请求
uri: qrcodeurl,
encoding: null,
body: {
"path": `pages/product/product?id=${id}`, //想要生成的页面路径以及参数
"width": 280,//二维码大小
"is_hyaline": false //是否需要透明底色
},
json: true
}
const body = await rp(options)//发起请求
const base64Img = body.toString('base64'); // 处理返回值,base64图片编码字符串

const dataBuffer = new Buffer.from(base64Img, 'base64');
//生成本地图片
const status = await new Promise((resolve, reject) => {
fs.writeFile(imgname, dataBuffer, function (err) {
if (err) {
reject(err)
} else {
resolve('success')
}
})
})
//注意这里异步处理,如果在图片还为生成时就给与返回值,则前台图片不会显示,
//应在图片生成之后在进行 ctx.body
ctx.body = {
status: status,
code: 20000,
url: `https://www.xxx.com/images/${id}.jpg`
}
} else {

ctx.body = {
code: 20000,
url: `https://www.xxx.com/images/${id}.jpg`
}
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×