一、为什么要是用云函数生成小程序二维码呢。
是用云函数生成小程序码,是可以脱离后端人员的接口,自己来实现的。而且通过一定的封装调用起来也是蛮方便的。而且这个功能应用的场景还是蛮多的。
二、下面简单说一下步骤
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页面,并且是无参数的。