背景
在小程式中,可以直接分享小程式到聊天視窗,但是無法分享小程式到朋友圈,但是朋友圈又是一個重要的推廣場地,所以分享小程式碼就成了重要途徑。常常被朋友圈刷屏的各種帶有小程式碼的海報,就是一個應用場景。
普通的分享小程式碼,直接在後臺放一個通用的小程式碼就可以了。但是如果需要分享一個特定路徑+引數的小程式碼就必須要藉助小程式提供的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
引數傳遞,最後在載入的時候先解析短鏈
,就可以獲取到超長引數啦~
小技巧
如果你不需要給頁面傳入引數,直接在小程式管理平臺最上方,有個工具->生成小程式碼
,填上頁面路徑就可以生成小程式碼素材啦~
結尾
最後分享一個成品~