本文介绍如何使用 Node.js 后端服务生成微信小程序带参数二维码。主要步骤包括通过 AppID 和 Secret 获取 Access Token,随后调用接口生成二进制流格式的二维码图片。文中提及了 Token 有效期管理及在 Express 环境中可能遇到的兼容性问题,并提供了核心代码实现参考。
Node.js 生成微信小程序带参数二维码
Node.js 实现微信小程序带参数二维码生成代码
根据项目需求,我们需要获取带有特定参数的小程序页面二维码。因此,查阅官方文档成为首要任务。
以往主要开发前端业务,此次首次尝试使用 Node.js 编写后端逻辑,由组长安排进行实践。
获取 Access Token
第一步是获取 Access Token。通过发送 GET 请求,在 URL 中拼接 grant_type、appid 和 secret 参数,即可成功获取 Token。需注意,小程序的 Token 有效期为 7200 秒(即 2 小时),且每日获取次数有限。对于业务量较小的场景,未采用中控服务器定时刷新并缓存 Token 的策略,而是每次请求时重新获取。
生成二维码及注意事项
获取 Token 后,即可发起请求以生成二维码。需要注意的是,微信接口返回的是二进制流数据,此前缺乏前端开发经验,对二进制流处理不熟悉,经过查阅资料及调试才解决该问题。此外,在 Express 框架的使用中也遇到了一些异常,原有代码无法生成二维码,而新建的 Express 项目则能正常运行,具体原因未明。
具体实现代码如下:
var fs = require('fs');
var request = require('request');
var wx_conf = require('../../conf/wx_conf');//这里放了微信appid跟appSecret,文件没有引入进来,要用的时候,改一下吧。
var AccessToken = {
grant_type: 'client_credential',
appid: wx_conf.appId,
secret: wx_conf.appSecret
}
var wx_gettoken_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=' + AccessToken.grant_type + '&appid=' + AccessToken.appid + '&secret=' + AccessToken.secret;
//请求二维码的参数
var postData = {
path: "pages/index/index",
width: 430
}
var createQrcode = {
create: function() {
console.log('fn:create');
this.getToken();
},
//获取微信的token
getToken: function() {
console.log('fn:getToken');
var that = this;
new Promise((resolve, reject) => {
console.log('进入Promise方法了');
request({
method: 'GET',
url: wx_gettoken_url
}, function(err, res, body) {
if (res) {
resolve({
isSuccess: true,
data: JSON.parse(body)
});
} else {
console.log (err);
reject({
isSuccess: false,
data: err
});
}
})
}).then(proData => {
that.getQrcode(proData);
});
},
//生成二维码
getQrcode: function(proData) {
console.log ('fn:getQrcode');
if (proData.isSuccess) {
postData = JSON.stringify(postData);
request({
method: 'POST',
url: 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=' + proData.data.access_token,
body: postData
}).pipe(fs.createWriteStream('./public/images/index.png'));//路径自己定义吧
} else {
console.log('Promise请求数据出错');
}
}
}
module.exports = createQrcode;//暴露对象,调用create方法既可以创建二维码
感谢阅读,希望本文内容能对大家有所帮助,感谢支持。