微信小程序登录解密异常

错误描述

用户登录微信小程序,初始登录会报错,接着再登录,就会登录成功。

后端catch住的异常

在这里插入图片描述

抛异常原因

小程序客户端调用微信服务器的接口顺序反了。
小程序客户端需要调用微信服务器的wx.login接口来获取code,然后调用wx.getUserInfo来获取加密数据和偏移向量iv。正确的顺序应该是先调用login,然后再调用getUserInfo。
而公司代码先调用了getUserInfo获取了解密数据,然后又调用的login,就会刷新登录态,这样获取的code换取的解密秘钥和提前获取的加密数据的加密秘钥就可能不一致的,所以无法成功解密。

错误代码

//先调用了getUserInfo,获取用户信息
  bindGetUserInfo: function (e) {
    //  console.log(e)
    wx.showToast({
      title: '加载中',
      icon: 'loading',
      duration: 3000
    });

    var that = this,
      userInfo = e.detail,
      encryptedData = userInfo.encryptedData,
      iv = userInfo.iv;
   //然后才调用了login
    wx.login({
      success: function (res) {
        //用拿到的code,从后台获取sessionId
        wx.request({
          url: sessionID,
          method: 'GET',
          data: {
            js_code: res.code,
            movieCode: movieCode
          },
          header: {
            "Content-Type": "application/x-www-form-urlencoded",
            'Accept': 'application/json'
          },
        });
     }
  });

正确代码

//先调用login
wx.login({
      success: function (res) {   
        //用拿到的code,从后台获取sessionId
        wx.request({
          url: sessionID,
          method: 'GET',
          data: {
            js_code: res.code,
            movieCode: movieCode
          },
          header: {
            "Content-Type": "application/x-www-form-urlencoded",
            'Accept': 'application/json'
          },
          success: function (res) {
            // console.log('sessionId:');
            // console.log(res.data.resultData);
            // console.log(res.data.resultData);
            var sessionId = res.data.resultData; //从后台获取到的sessionId
            wx.setStorageSync('sessionId', sessionId);

            //然后调用getUserInfo获取加密数据encryptedData和iv
            wx.getUserInfo({
              success: function(msg){
                console.log(msg);
                var encryptedData = msg.encryptedData,
                 iv = msg.iv;
                wx.request({
                  url: userInfoUrl,
                  method: 'POST',
                  data: {
                    encryptedData: encryptedData,
                    iv: iv,
                    sessionId: sessionId
                  },
         //代码不完整,参考者请注意。。。。

结语

这个问题搞了好几天,一直以为是后端的问题,一直再调整后端,直到快要放弃的时候,才发现,原来问题症结在此。所以,调用微信服务器接口的顺序一定是wx.login在前,wx.getUserInfo在后。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子松的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值