收藏
回答

解密有概率出现41003的问题

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug 群分享 工具 6.6.7 2.0.0

在登陆的时候,如果隔一段时间,再点击登陆按钮,第一次会失败,服务解密那里41003,第二次才能成功


在获取群分享的open_gid也一样,用户第一次点击分享卡片进来是可以的,后面再点击就41003了 这是我群分享的写法

this.share_tk();
share_tk: function () {
   var shareTicket = wx.getStorageSync('shareTicket');
   var shop_id = wx.getStorageSync('shop_id');
   if (!util.isNotEmpty(shareTicket)) {
     return;
   }
   var t = this;
   wx.getShareInfo({
     shareTicket: shareTicket,
     success: function (res) {
       wx.checkSession({
         success: function (e) {
           var session_key = wx.getStorageSync('session_key');
           t.ajax_share(res.encryptedData, res.iv, session_key);
         },
         fail: function () {
           wx.login({
             success: function (lres) {
               if (lres.code) {
                 var post_data = {
                   m: 'mall',
                   c: 'ApiLogin',
                   a: 'get_session',
                   code: lres.code,
                 };
                 util.ajax(post_data, function (data) {
                   wx.setStorageSync('session_key', data.data);
                   t.ajax_share(encryptedData, iv, data.data);
                 }, null, true);
               }
 
             }
           });
 
         }
       })
 
     }
   })
 },
//分享函数
 ajax_share: function (encryptedData, iv, session_key) {
   var shareTicket = wx.getStorageSync('shareTicket');
   var shop_id = wx.getStorageSync('shop_id');
   var token = wx.getStorageSync('token');
   var t = this;
   console.log('发送分享信息');
   var post_data = {
     m: 'Share',
     c: 'ApiIndex',
     a: 'share_shop',
     shop_id: shop_id,
     encryptedData: encryptedData,
     iv: iv,
     session_key: session_key,
     token: token
   };
   util.ajax(post_data, function (data) {
     wx.removeStorageSync('shareTicket');
     console.log(data);
   }, function (data) {
     wx.login({
       success: function (lres) {
         if (lres.code) {
           post_data = {
             m: 'mall',
             c: 'ApiLogin',
             a: 'get_session',
             code: lres.code,
           };
           util.ajax(post_data, function (data) {
             wx.setStorageSync('session_key', data.data);
             post_data = {
               m: 'Share',
               c: 'ApiIndex',
               a: 'share_shop',
               shop_id: shop_id,
               encryptedData: encryptedData,
               iv: iv,
               session_key: data.data,
               token: token
             };
             util.ajax(post_data, function (data) {
               console.log('第二次成功');
               wx.removeStorageSync('shareTicket');
             }, function (data) {
               console.log('第二次失败');
             }, true);
           }, null, true);
         }
 
       }
     });
   }, true);
 },


回答关注问题邀请回答
收藏

2 个回答

  • 武曲心
    武曲心
    2018-07-15

    我觉得还是微信官方有bug,用open-type="getUserInfo"的bindgetuserinfo方法拿到的e.detail里面encryptedData和iv会有这个问题,这几天遇到这问题了,我是在方法里面再调用wx.getUserInfo,用这里获取的encryptedData和iv解密就没这问题。




    2018-07-15
    有用
    回复 2
    • 苦咖啡
      苦咖啡
      2018-07-20

      我试试你的方法

      2018-07-20
      回复
    • 苦咖啡
      苦咖啡
      2018-07-20

      我用你这个方法解决了登陆的解密问题,不过那个群发的问题不能用这个啊,小程序真麻烦

      2018-07-20
      回复
  • Smilence
    Smilence
    2018-07-12

    看起来是login呼叫顺序的问题。

    你的login在callback中呼叫,每次呼叫login会刷新code,随之session_key也会改变。

    导致你在解密数据时,用新的获得的session去解密旧的,当然会出错啦。


    验证这个问题也简单,你可以把提交的数据都打印出来,对比一下第一次失败和第二次成功的数据,看一下两次的key。

    2018-07-12
    有用
    回复 3
    • 苦咖啡
      苦咖啡
      2018-07-12

      首先万分感谢您的热心,我是把每次登陆获取到seesion_key保存在本地了,使用的时候先调用checkSession都是有效的,没有进到Login里面。。这个分享看的比较乱,我帖我登陆的你看看,或者能贴你登陆的写法我看看嘛?

      login: function (e) {
        var t = this;
        if (t.data.load == 0) {
          return;
        }
        t.setData({
          load: 0
        });
        setTimeout(function () {
          t.setData({
            load: 1
          });
        }, 2000)
        var res = e.detail;
        if (res.errMsg.indexOf('ok') <= -1) {
          return false;
        }
        var userInfo = res.userInfo;
       
       
        wx.login({
          success: function (lg) {
            if (lg.code) {
               
              var post_data = {
                code: lg.code,
                m: 'mall',
                c: 'ApiLogin',
                a: 'index',
                key: app.globalData.key,
                reginfo: userInfo,
                encryptedData: res.encryptedData,
                iv: res.iv,
              };
              var shop_id = wx.getStorageSync('shop_id');
              if (util.isNotEmpty(shop_id)) {
                post_data.shop_id = shop_id;
              }
              wx.request({
                url: app.globalData.url +"?m=mall&c=ApiLogin&a=index",
                method: 'POST',
                data: post_data ,
                success: function (res) {
                  wx.setStorageSync('token', res.data.data.token);
                  wx.setStorageSync('uinfo', res.data.data.uinfo);
                  wx.setStorageSync('share_title', res.data.data.share_title);
       
                  wx.setStorageSync('session_key', res.data.data.session_key);
                  var to_url = wx.getStorageSync('to_url');
                  if (util.isNotEmpty(to_url) == true && to_url != "pages/login/login") {
                    wx.redirectTo({
                      url: to_url
                    })
                  } else {
                    wx.redirectTo({
                      url: "/pages/index/index"
                    })
                  }
       
                }
              })
            } else {
              console.log('登录失败!' + res.errMsg)
            }
          }
        });
        return;
       
      },


      2018-07-12
      回复
    • Smilence
      Smilence
      2018-07-12

      我们的模块化程度太高,将login做成了component,代码贴出来估计有点晕。

      我刚才说的你可以追踪服务器端post数据,第一次失败和第二次成功数据对比。

      另外我大胆猜测一下,你们登录是在开发者工具中刷新以后,第一次登录失败第二次登录成功。

      下面附上代码。


      methods: {
          autoLogin(){
            this.isAuthorized().then(authorized => {
              const shouldUseOpenData = weapp.canIUse('button.open-type.getUserInfo')
               
              this.setData({
                shouldUseOpenData: !authorized && shouldUseOpenData
              })
       
              if(authorized){
                return weapp.requireAuth().then(data => this.component.onLoad(data))
              }
            })
          },
       
          // on-tap screen or tap getUserInfo button
          onTapLogin(e){
            const {loading, shouldUseOpenData} = this.data
            if(loading){
              return
            }
       
            const {detail:{errMsg}} = e
            if(shouldUseOpenData === true && errMsg === 'getUserInfo:ok'){
              return weapp.requireAuth().then(data => this.component.onLoad(data))
            }
       
            this.autoLogin()
          },
       
          isAuthorized(){
            return weapp.getSetting().then(({authSetting}) => {
              return authSetting['scope.userInfo'] === true
            }).catch((err)=>console.log(err)) /* eslint no-console:0 */
          }
        }


      2018-07-12
      1
      回复
    • 苦咖啡
      苦咖啡
      2018-07-12回复Smilence

      你们大厂来的把,代码真看得懵~~~~我post过去数据看每次都是不一样的 你有时间能中文解释下你们登陆判断流程最好了,小弟冰天雪地跪拜了开发者工具中刷新以后,第一次登录失败第二次登录成功(的确是这样) 我的问题跟这个帖子的问题是一样的https://developers.weixin.qq.com/blogdetail?action=get_post_info&docid=000a4e620e0040e75fb6772985b800&highline=41003

      2018-07-12
      回复
登录 后发表内容