天天看点

云函数生成小程序某页面二维码

一、为什么要是用云函数生成小程序二维码呢。

     是用云函数生成小程序码,是可以脱离后端人员的接口,自己来实现的。而且通过一定的封装调用起来也是蛮方便的。而且这个功能应用的场景还是蛮多的。

二、下面简单说一下步骤

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页面,并且是无参数的。