美文网首页
小程序第一次登录失败,第二次成功问题

小程序第一次登录失败,第二次成功问题

作者: 每天进步一点点5454 | 来源:发表于2021-12-10 11:08 被阅读0次
    • 微信小程序授权登录第一次总是失败,第二次登录便正常了

    错误流程

    调用 用户点击授权用户信息按钮 ===> 调用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();
            }
          })
    
        
      }
    
      
    })
    

    相关文章

      网友评论

          本文标题:小程序第一次登录失败,第二次成功问题

          本文链接:https://www.haomeiwen.com/subject/fvrcfrtx.html