微信小程序授权登录第一次总是失败,第二次登录便正常了

微信小程序授权登录第一次总是失败,第二次登录便正常了

在这里插入图片描述

错误流程

调用 用户点击授权用户信息按钮 ===> 调用wx.login( )生成code发送给后台生成session_key解密 ===> 用户点击授权手机号按钮

问题原因:
先获取了授权信息的 iv与encryptedData ,后 获取的 code 发送给后台生成 session_key, 然后这个session_key因为是后生成的,没有办法解密之前获取的iv, 需要先生成code给后台, 再获取iv与encryptedData, 这样 后台就可以解密了

简单说,就是前台先生成了密码,后生成的钥匙, 后面的钥匙开不了前面的锁, 必须先有钥匙,再有锁。

正确流程

正确的流程就是把第一步和第二部颠倒一下,我们可以在登录页一开始加载的时候便调用login方法去获取code

完整代码

util.racePromise是我封装的请求办法,读者使用时可以替换为wx.request()正常请求

const app = getApp();
const util = require('../../utils/util')
const proRequest = util.wxPromisify(wx.request)

Page({
  data: {
      //判断小程序的API,回调,参数,组件等是否在当前版本可用。
      canIUse: wx.canIUse('button.open-type.getUserInfo'),
  },

  onLoad: function() {
      this.login();
  },

  bindGetUserInfo: function(e) {
      if (e.detail.userInfo) {
          //用户按了允许授权按钮
        this.setData({
            iv:e.detail.iv, 
            encryptedData:e.detail.encryptedData
        })
        app.globalData.userInfo = e.detail.userInfo;
        wx.setStorageSync('userInfo',  e.detail.userInfo);
        this.updateUserInfo();
      } else {
          //用户按了拒绝按钮
          wx.showModal({
              title: '提醒',
              content: '您点击了拒绝授权,将会影响您的功能使用!',
              showCancel: false,
              confirmText: '返回授权',
              success: function(res) {
                  // 用户没有授权成功,不需要改变 isHide 的值
                  if (res.confirm) {
                      console.log('用户点击了“返回授权”');
                  }
              }
          });
      }
  },

  
  login(){
    this.goLogin();
  },

  goLogin(){
    wx.login({
        success: res => {
            util.racePromise(proRequest({
                url:`${util.URL}/api/common/login`,
                method:'POST',
                data:{
                    code:res.code
                }
            })).then(res=>{
                wx.setStorageSync('token',  res.data.data.token);
            }).catch(err=>{
                console.log(err);
            })
        }
    });
  },

   // 首次更新用户信息
   updateUserInfo(e){
    wx.checkSession({
        success:() => {
          //session_key 未过期,并且在本生命周期一直有效
          util.racePromise(proRequest({
                url:`${util.URL}/api/user/info`,
                method:'POST',
                data:{
                    iv:this.data.iv,
                    encryptedData:this.data.encryptedData
                },
                header:{
                    'Authorization':wx.getStorageSync('token')
                }
            })).then(res=>{
                wx.showToast({
                    title: '登录成功!请稍等',
                    icon:'none'
                })
                setTimeout(()=>{
                    wx.redirectTo({
                        url: '../getphone/getPhone',
                    })
                }, 500)
            }).catch(err=>{
                console.log(err);
            })
        },
        fail:()=> {
          // session_key 已经失效,需要重新执行登录流程
          wx.showToast({
            title: '登录信息过期~ 从新登录中……',
            icon:'none'
          })
          this.goLogin();
        }
      })

    
  }

  
})
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值