核心接口 wx.login、wx.checkSession、wx.getWeRunData
上代码:
//获取步数 async getWxStep(){ let that = this; wx.getWeRunData({ success: res => { Utils.wxRequest({ url: API.api.getStepDecode, //服务端解析微信运动信息的接口 data: { encryptedData: res.encryptedData, iv: res.iv } }, false).then(res => { if(res.code === 12000){ if(wx.showLoading) wx.hideLoading() let i = res.data.length; that.todayPace = res.data[i-1].step //get今天的运动步数 //。。。。。业务逻辑 that.$apply() }else if(res.code == 16000){ //当解析失败的时候重新登录更新session Utils.loginAgain().then(r=>{ console.log(r) that.Init() },err=>{}) }else { Utils.showToast(res.msg) } }, err => { Utils.showToast(err.msg) }) }, fail: err=>{ Utils.showToast('获取运动信息失败'); that.$apply() } }) }; async Init(){ let that = this; Utils.wxRequest({ url: API.api.getStepIndex }, false).then((res) => { if(res.code === 12000) { //....业务逻辑 that.getWxStep(); }else { Utils.showToast(res.msg); } }, (err) => { Utils.showToast(err.msg); }) } onShow() { this.Init() } onLoad() { let that = this; Utils.showLoading() //加载页面之前先判断当前session是否过期 //如果过期就重新登录更新session wx.checkSession({ success: ()=>{ that.Init() console.log('没过期') }, fail:()=>{ Utils.loginAgain().then(res=>{ that.Init() console.log('已过期') },err=>{}) } }) };需要注意的是当前的session是否过期 wx.checkSession判断当前session是否过期,如果过期的话就重新调用登录接口,把获取到的code传给服务端,通知服务端更新session_key(前后端必须保证session_key一致才能解析成功)
//重新登录function loginAgain(){ return new Promise((res, rej)=>{ wepy.login({ success: data => { wepy.request({ url: API.api.getLogin, //开发者服务器接口地址", data: {jsCode: data.code}, //请求的参数", method: 'GET', success: r => { //缓存更新的Uid和token wx.setStorageSync('uId',r.data.data.id) wx.setStorageSync('token', r.data.data.token) res(r) }, fail: (e) => { rej(e) }, complete: () => {} }); } }) })}但是有一个问题,即时前后端session_key一致,还是有一定的几率出现解析失败的
开发者社区有朋友遇到这个问题,微信官方也也一直没有给出原因和解决方式
目前来看bug来源应该是小程序底层

出现解析失败的原因应该还是出现在session_key上,我提供的解决思路是当出现解析失败的时候,让服务端给一个特殊的状态码,根据这个状态码再去重新登录一次,这样就保证了session_key绝对同步
测试结果显示正常;
在onLoade(){}里调用一次wx.login() 不请求后台接口 , 这时客户端的session_key已更新,服务端还是旧session_key , 解析步数是后端返回异常码16000,然后重新登录后再解析,正常。。。 哟吼吼
微信小程序













