微信小程序解析运动步数时小概率解析出错问题解决

核心接口  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来源应该是小程序底层

微信小程序解析运动步数时小概率解析出错问题解决_第1张图片

微信小程序解析运动步数时小概率解析出错问题解决_第2张图片

 细看微信小程序官方文档关于session_key的说明

微信小程序解析运动步数时小概率解析出错问题解决_第3张图片微信小程序解析运动步数时小概率解析出错问题解决_第4张图片

出现解析失败的原因应该还是出现在session_key上,我提供的解决思路是当出现解析失败的时候,让服务端给一个特殊的状态码,根据这个状态码再去重新登录一次,这样就保证了session_key绝对同步

测试结果显示正常;

在onLoade(){}里调用一次wx.login() 不请求后台接口 , 这时客户端的session_key已更新,服务端还是旧session_key , 解析步数是后端返回异常码16000,然后重新登录后再解析,正常。。。  哟吼吼

你可能感兴趣的:(微信小程序解析运动步数时小概率解析出错问题解决)