一、为什么要是用云函数生成小程序二维码呢。
是用云函数生成小程序码,是可以脱离后端人员的接口,自己来实现的。而且通过一定的封装调用起来也是蛮方便的。而且这个功能应用的场景还是蛮多的。
二、下面简单说一下步骤
1、创建云函数,在函数中填写程序的appid和秘钥(下面我会贴上我的代码)
2.到控制台创建一个名为 access_token 的数据集合,用于给 wx-js-utils 类库缓存 access_token 的数值。
代码中我将生成的二维码直接放置在云存储的qr文件夹下。(这个可以自己进行)
3.上传云函数到服务器并部署服务
4、页面直接调用
三、下面贴一下我的代码详情
云端代码:(云函数的index.js文件,需要自行填入秘钥和appid)
// 云函数入口文件 const cloud = require('wx-server-sdk'); const SECRET = "秘钥", //小程序的秘钥 bucketPrefix ="存放的id"; //其中 bucketPrefix 为文件存储 fildID 的前半部分。 // 设置文件夹名称 设置名称加'/' const filename ="qr/"; // 初始化云能力 cloud.init() async function getQR(method, path, fileID) { const { APPID, } = cloud.getWXContext(); // 字符串的处理 let filename2 = `${path}_${fileID}`.replace(/\//g, '_'); filename2 = filename2.replace(/\?/g,'-') try { await cloud.downloadFile({ fileID: bucketPrefix + filename + filename2 }) console.log('get from cos!!!') return { fileID: bucketPrefix + filename + filename2} } catch (e) { console.log('get cos failed, invoke api generate!') const { WXMINIUser, WXMINIQR } = require('wx-js-utils') // 获取access_token const wXMINIUser = new WXMINIUser({ appId: APPID, secret: SECRET }) const access_token = await wXMINIUser.getCacheAccessToken() console.log('access_token: ', access_token) // 生成小程序码 const wXMINIQR = new WXMINIQR() const qrResult = await wXMINIQR[method]({ scene: '?code=123', access_token, path, is_hyaline: true }) await cloud.uploadFile({ cloudPath: filename + filename2, fileContent: qrResult }) return { fileID: bucketPrefix + filename + filename2 } } } /** * 根据类型生成对应的二维码 * @param {String} type 取值有square,mina,unlimitmina */ async function getQRByType(type = 'limit', path ="pages/index/index") { switch (type) { case 'square': return await getQR('getQR', path, 'square.png') case 'limit': return await getQR('getMiniQRLimit', path, 'limit.png') default: return await getQR('getMiniQR', path, 'mini.png') } } // 云函数入口函数 exports.main = async (event) => await getQRByType(event.type, event.path)
页面的js文件:
const regeneratorRuntime = require('../../libs/runtime') Page({ data: { title: 'qrcode', step: 1, counterId: '', openid: '', count: null, queryResult: '', }, onCreateSquare() { this.create('square') }, onCreateLimit() { this.create('limit', "pages/form/register/register?action=modification& openid=oIxZX4zWD2QBU8FDgeaiRbuzo6lA") }, async create(type = 'square', path) { wx.showLoading({ title: '加载中', }) try { const res = await wx.cloud.callFunction({ name: 'wxaqrcode', data: { type, path, } }) wx.hideLoading() const result = res.result if (result.code) { wx.showToast({ title: result.msg, icon: 'none' }) return } this.setData({qrSource: result.fileID}) } catch (err) { wx.hideLoading() console.log('err',err) wx.showToast({ title: '生成失败!', icon: 'none', duration: 3000 }) } }, })
函数说明:create(),这个函数存在两个参数,第一个参数是生成二维码的类型的,第二个是二维码的路基和参数连接,直接编写即可。如果不传参的话,目前生成的pages/index/index页面,并且是无参数的。
