利用雲函式來實現獲取特定路徑+引數的小程式碼

Bug開發者發表於2020-04-06

背景

在小程式中,可以直接分享小程式到聊天視窗,但是無法分享小程式到朋友圈,但是朋友圈又是一個重要的推廣場地,所以分享小程式碼就成了重要途徑。常常被朋友圈刷屏的各種帶有小程式碼的海報,就是一個應用場景。

普通的分享小程式碼,直接在後臺放一個通用的小程式碼就可以了。但是如果需要分享一個特定路徑+引數的小程式碼就必須要藉助小程式提供的API來實現了。

此次來和大家說一說如何利用雲函式來實現獲取特定路徑+引數的小程式碼。

介面

雲函式為我們提供了三種獲取小程式碼的API

名稱 功能說明
wxacode.createQRCode 獲取小程式二維碼,適用於需要的碼數量較少的業務場景
wxacode.get 獲取小程式碼,適用於需要的碼數量較少的業務場景
wxacode.getUnlimited 獲取小程式碼,適用於需要的碼數量極多的業務場景

前兩個都有數量限制,無法滿足一些類似詳情分享的場景,所以留給我們的道路只有wxacode.getUnlimited介面了。

先來看一下這個介面的主要引數:

屬性 說明
scene 最大32個可見字元,只支援數字,大小寫英文以及部分特殊字元:!#$&'()*+,/:;=?@-._~,其它字元請自行編碼為合法字元(因不支援%,中文無法使用 urlencode 處理,請使用其他編碼方式)
page 必須是已經發布的小程式存在的頁面(否則報錯),例如 pages/index/index, 根路徑前不要填加 /,不能攜帶引數(引數請放在scene欄位裡),如果不填寫這個欄位,預設跳主頁面

其他引數就不一一列舉了,有需要可以直接去官方文件檢視。 根據上面的引數,我們可以指定任意page,而且還可以傳入頁面引數,最終在小程式頁面載入的時候,通過options來獲取到scene,從而做資料載入。

實現

雲函式

先來看一下雲函式如何配置。 新建一個雲函式qrcode後,在config.json中配置如下:

{
  "permissions": {
    "openapi": [
      "wxacode.getUnlimited"
    ]
  }
}
複製程式碼

然後在index.js中加入如下程式碼:

// 雲函式入口檔案
const cloud = require('wx-server-sdk')

cloud.init()

// 雲函式入口函式
exports.main = async(event, context) => {
  try {
    let param = {
      // 小程式傳入的 scene 引數
      scene: event.scene,
      // 可以換成任意 page
      page: 'pages/index/index',
    };
    // 呼叫介面
    var result = await cloud.openapi.wxacode.getUnlimited(param)
    return result
  } catch (err) {
    return err
  }
}
複製程式碼

然後部署到雲端,雲函式部分就完成了。

小程式

再來看看小程式端如何呼叫:

requestQrcode(scene) {
    let that = this;
    wx.cloud.callFunction({
        name: 'qrcode',
        data: {
          scene: scene
        }
      })
      .then((res) => {
        let path = wx.env.USER_DATA_PATH + '/' + res.requestID + '.jpg'
        if (res.result.contentType == 'image/jpeg') {
          // 返回的結束是 base64 編碼的二進位制流
          // 這裡直接儲存到檔案
          wx.getFileSystemManager()
            .writeFile({
              filePath: path,
              data: res.result.buffer,
              encoding: 'base64',
              success: (res) => {
              },
              fail: (res) => {
              }
            })
        } else {
          // 異常處理
        }
      })
  },
複製程式碼

最終在頁面的onLoad(options)中可以這樣獲取到小程式碼傳遞的引數scene

onLoad: function(options) {
  let scene = options.scene;
},
複製程式碼

這樣就完成了利用雲函式來生成特定路徑+引數的小程式碼了,後面就可以利用這個小程式碼來繪製海報。

問題

不知道你是否注意到scene引數有一個限制,最大32個可見字元,有時候很容易就超出了,那豈不是就沒法用了?

沒有什麼可以難倒程式設計師!如果有,那一定是需求不合理~

短鏈,一個很好的方案。把所有的引數生成一個唯一的短鏈,作為scene引數傳遞,最後在載入的時候先解析短鏈,就可以獲取到超長引數啦~

小技巧

如果你不需要給頁面傳入引數,直接在小程式管理平臺最上方,有個工具->生成小程式碼,填上頁面路徑就可以生成小程式碼素材啦~

結尾

最後分享一個成品~

利用雲函式來實現獲取特定路徑+引數的小程式碼

掃碼關注,獲取第一手文章

相關文章