小程序的分享票據,可以理解為每一次分享的一個唯一ID。有什么用處呢?太有用處了,比如分享到群。
怎么獲取這個shareTickets呢?有兩種方式
1、分享的回調里
onShareAppMessage: function (res) {
if (res.from === 'button') {
// 來自頁面內轉發按鈕
console.log(res.target)
}
return {
title: '自定義轉發標題',
path: '/page/user?id=123',
success: function(res) {
res.shareTickets // 單聊是沒有的
},
fail: function(res) {
// 轉發失敗
}
}
}
2、app的onLaunch
App({
onLaunch(res){
res.shareTickets
}
})
注意必須要在分享前調用wx.showShareMenu方法,否則是不會帶分享票據。
最初的版本是只有這兩個地方可以獲取分享票據的。但是這個的設計是極其不合理,為什么呢?因為onLaunch的回調場景有限制。
當小程序初始化完成時,會觸發 onLaunch(全局只觸發一次)
全局只執行一次,所以第二次進來是不會執行。當然我們有辦法,可以緩存shareTickets。可是,一旦在群里多次分享,shareTickets的管理就變得極其蛋疼,可能會取不到第二第三次分享的shareTickets。
這是個很大的坑,后面官方又在onShow的回調中加入了獲取shareTickets的邏輯,這次應該可以避免這個問題。
分享票據的有效期
官網文檔沒有明確的說明有效期,實際操作過程又遇坑。getShareInfo是用shareTickets去換取加密信息,這個加密信息有什么用?獲取群ID。
換回的encryptedData和iv加密信息傳給后臺處理解密。
encryptedData才會有有效期,有效期過期了怎么辦?重新getShareInfo是無效的,必須重新wx.login。
我們的請求流程是這樣:
- 進入小程序頁面,onShow
- wx.login成功
- 獲取shareTickets
- getShareInfo換取encryptedData
- 請求CGI,POST發送encryptedData
- 后臺處理請求,返回給前端
- 如果encryptedData失效
- 重新wx.login
- 繼續后面的邏輯
一個完整的請求鏈太長了,導致用戶體驗并不太好。我不知道小程序框架設計有沒有考慮這一點。
層層回調嵌套,簡直反人類。
getShareInfo
這個有什么坑呢,不能頻繁請求,應該算是一個坑吧。千萬不要在setInterval這里面調用這個接口。先緩存住加密encryptedData數據,如果過期,則重新getShareInfo。
即使不過期,也不要頻繁請求,因為getShareInfo耗時200-300ms,等不起。
單聊和群聊
單聊是無法獲取到shareTickets,總覺得以shareTickets來區分單聊和群聊場景是不太合理的事情。
不要說還有sence的值,那個只在onLaunch回調里面才有。
shareTickets用處就是可以在群里玩小程序。比如常見的群公告,群打卡。說白了,就是讓普通開發者拿到群ID。具體小程序,大家可以搜搜看。