加粗的地方是本人重点🈶️疑问或者不确定的,求详细解答!
我的需求:需要在小程序一打开获取目标数据,并根据数据向用户展示信息。且我需要小程序新用户第一次打开小程序就能拿到这个数据。我需要在onLaunch时立刻调用一个接口获取数据,在获取这个数据的时机,我还没有通过 wx.login 实现登录等逻辑,拿不到 openId 等数据。
我想通过数据预拉取实现需求。在阅读文档和社区时产生如下疑问:
1.关于token设计
文档:第一次启动小程序时,调用 wx.setBackgroundFetchToken() 设置一个 TOKEN 字符串,可以跟用户态相关,会在后续微信客户端向开发者服务器请求时带上,便于给后者校验请求合法性。
1.1. 这个和用户态关联的 token 怎么设计?我理解接口调用是在微信后台(代码包下载期间)发生的,如果我设计 token=localStorage中的session缓存字段,微信发起请求时能拿到用户本地的缓存的 session 数据吗? 如果不能,我在这个时机又没有任何用户态相关的信息,怎么传啊,我不想用 code 模式(可能导致用户重复登录)。
1.2. 如何保证接口安全?后端只能将接口设计为 get接口,且只能通过 token 字段来鉴权?比如我们接口之前还有特殊的 header实现鉴权,这些都不能实现?那这个接口也太不安全(太局限)了吧? 且基于 1.1. 我也不知道到底该咋定义这个 token 更安全。
2.关于数据获取
2.1. wx.getBackgroundFetchData我这样理解对吗?wx.getBackgroundFetchData,在冷启动下载代码包期间,微信后台会调用接口。当执行到 onLaunch 时,如接口请求完成则getBackgroundFetchData返回新数据,如接口未调用完成则返回缓存数据/空数据?
2.2. wx.onBackgroundFetchData 我这样理解对吗?用于监听backgroundFetch接口调用,如果在代码执行到 onLaunch 的wx.onBackgroundFetchData事件之前已经完成请求,则监听事件不会触发,否则当请求完成会触发监听时间获取到最新的代码。
2.3. 当我数据预拉取代码上线后,用户第一次打开,只会先setBackgroundFetchToken设置这个 token,onBackgroundFetchData和getBackgroundFetchData 都不会返回数据,用户第二次冷启动才会拿到数据对吗?
综上,如果我不需要获取最新数据,仅需调用getBackgroundFetchData即可。如果我想获取最新的数据,需要同时使用这两个方法(用户第一次访问没数据),但这可能会导致重复调用数据处理方法,我这样写对吗?能不能帮我优化下面的逻辑?
App({
let targetData = {}
let dataTimeStamp = 0
onLaunch() {
wx.onBackgroundFetchData((res) => {
targetData = res.fetchedData
// 判断是不是新数据
if(res.timeStamp>dataTimeStamp){
dataTimeStamp = res.timeStamp
// 处理数据(新)
}
})
wx.getBackgroundFetchData({
fetchType: 'pre', //数据预拉取
success(res) {
targetData = res.fetchedData
// 判断是不是新数据
if(res.timeStamp>dataTimeStamp){
dataTimeStamp = res.timeStamp
// 处理数据(新 or 旧)
}
}
})
}
})

wx.setBackgroundFetchToken() 设置之后,下次启动小程序生效