微信小程序登录流程整理

最近在开发微信小程序,发现小程序的登录流程和PC端略有差异,于是抽时间整理了一下登录流程。

登录流程时序
img

首先,简单介绍下小程序登录的几个步骤。

1、点击登录按钮

2、获取微信sessionKey数据

​ 1)调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

​ 2)调用 auth.code2Session 接口,换取 用户唯一标识 OpenID会话密钥 session_key

3、获取用户信息的加密数据(调用前需要 用户授权 scope.userInfo)

​ 1)wx.getSetting() 获取用户的当前授权设置

​ 2)wx.getUserInfo() 获取用户信息, object.success 回调函数的返回值如下:

4、调用后端登录接口,绑定用户。

wx.getSetting() 调用成功返回结果如下:

属性类型说明
authSettingAuthSetting用户授权结果
subscriptionsSettingSubscriptionsSetting用户订阅消息设置,接口参数withSubscriptions值为true时才会返回。

wx.getUserInfo() 调用成功返回结果如下:

属性类型说明
userInfoUserInfo用户信息对象,不包含 openid 等敏感信息
rawDatastring不包括敏感信息的原始数据字符串,用于计算签名
signaturestring使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见 用户数据的签名验证和加解密
encryptedDatastring包括敏感数据在内的完整用户信息的加密数据,详见 用户数据的签名验证和加解密
ivstring加密算法的初始向量,详见 用户数据的签名验证和加解密
cloudIDstring敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据,详细见云调用直接获取开放数据

整个登录流程的js代码如下:

1、点击登录按钮
loginClick() {
    if (this.userName == "" || this.password == "") {
        WechatUtil.showToast("请输用户名密码");
        return;
    }
    wx.showLoading({ title: "正在登录中..." });
    this.login(this.userName, this.password);
    wx.hideLoading();
},
async login() {
	// 1、获取微信sessionKey数据
    let res = await this.getWxSessionByCode();
    if (res.code !== 0) {
     	wx.showToast({ title: res.message, icon: "none" });
        return false;
    }
    let wxSessionInfoVO = res.value;
    let sessionKey = wxSessionInfoVO.sessionKey;
    let openId = wxSessionInfoVO.openId;
    // 2、获取用户信息的加密数据
    let getUserInfoRes = await this.getUserInfoFromWx();
    let userInfo = getUserInfoRes.userInfo;
    if (!userInfo) {
       WechatUtil.showToast("获取用户信息失败");
       return false;
    }
    //3、绑定用户,调用后端登录接口
    let accountByEncryData = {
        appId: this.$store.state.appId, //小程序appId
        loginName: this.userName, //用户名
        password: this.password, //密码
        sessionKey: sessionKey,
        encryptedData: getUserInfoRes.encryptedData, //wx.getUserInfo的返回值 加密数据
        iv: getUserInfoRes.iv //wx.getUserInfo的返回值 加密算法的初始向量
    };
    let successd = await this.loginByAccountAndEncryData(accountByEncryData);
    return successd;
}
2、获取微信sessionKey数据

根据getWxCode返回的code,调用后端接口获取openid和session_key

// 获取微信sessionKey和openId
async getWxSessionByCode() {
	const wxCodeRes = await this.getWxCode();
     const params = { 
         code: wxCodeRes.code, 
         appId: this.$store.state.appId  
     };
    const res = await loginService.getWxSessionByCode(params);
    return res;
}

接口返回的数据结构如下:

{
	code: 0,
    message: "操作成功"     
    value: {
        openId: "obXSv4rgXCppd1MBHFXDyNAhZz7k"
        sessionKey: "4ti+o+fgFITR2DnpcHAIgg=="
        unionId: null
    }
}

调用微信接口获取登录凭证(code),通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等

// 获取登录凭证code 有效期5分钟,且只能使用一次
getWxCode() {
	return new Promise((resolve, reject) => {
        let reqObj = {
          success: res => {
            resolve(res);
          },
          fail: res => {
            reject(res);
          }
        };
        wx.login(reqObj);
    });
}
3、 获取用户加密信息

包含加密数据UnionId,需要提前进行用户授权 、并且调过wx.login接口

    async getUserInfoFromWx() {
      try {
          // 获取用户是否授权微信 获取用户信息
        let settingRes = await this.getAuthorizeSetting();
        if (!settingRes.authSetting["scope.userInfo"]) {
          WechatUtil.showToast("授权失败");
          return null;
        }
        return new Promise((resolve, reject) => {
          let getUserInfoOpt = {
            withCredentials: true,
            success: res => {
              resolve(res);
            },
            fail: res => {
              reject(res);
            }
          };
          // 必须是在用户已经授权的情况下调用
          wx.getUserInfo(getUserInfoOpt);
        });
      } catch (e) {
        WechatUtil.showToast("微信服务器异常");
      }
    }

wx.getUserInfo官网介绍

获取用户的授权设置。返回值中只会出现小程序已经向用户请求过的权限

 // 获取用户是否授权微信 获取用户信息
    getAuthorizeSetting() {
      return new Promise((resolve, reject) => {
        let reqObj = {
          success: res => {
            resolve(res);
          },
          fail: res => {
            reject(res);
          }
        };
        wx.getSetting(reqObj);
      });
    }

wx.getSetting官网介绍

4、调用后端登录接口,绑定用户
async loginByAccountAndEncryData(params) {
      let res = await loginService.loginByAccountAndEncryData(params);
      if (res.code != 0) {
        WechatUtil.showToast(res.message, 1000);
        return false;
      }
      this.$store.state.userId = res.value;
      this.$store.state.logouted = false;
      wx.setStorageSync("userId", res.value);
      wx.reLaunch({ url: "/pages/home/main" }); //登录成功跳转首页
},
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值