微信小程序受权登陆

公司业务开展,最近完成了一个微信小程序的开发。场景是这样:同一微信开放平台下拥有相同主体的APP和微信小程序来完成一样的业务,用户进入app或者微信小程序时必须获取用户的unionid来确认当前的用户身份,完成登陆。小程序“获取用户信息”api(getUserInfo)的调用方式和以前相比有了较大更新,优雅的实现用户受权和登陆很是重要,如下是我在微信小程序受权登陆相关流程在开发时候的实现思路和总结,分享以下。html

1、微信小程序登陆流程时序

登陆流程时序

说明:ajax

  1. 小程序调用wx.login() 获取 临时登陆凭证code ,并回传到开发者服务器
  2. 开发者服务器以code换取 用户惟一标识openid 和 会话密钥session_key。
  3. 临时登陆凭证code只能使用一次

什么是openid?

在关注者与公众号产生消息交互后,公众号可得到关注者的OpenID(加密后的微信号,每一个用户对每一个公众号的OpenID是惟一的。对于不一样公众号,同一用户的openid不一样)。—— 微信公众平台开发者文档
  • 普通用户的标识,对当前公众号惟一
  • 不一样的公众号,同一个用户,openid不一样

你能够简单的理解为小程序

openid = hash(uid + app_id)

什么是unionid?

若是开发者拥有多个移动应用、网站应用、和公众账号(包括小程序),可经过unionid来区分用户的惟一性,由于只要是同一个微信开放平台账号下的移动应用、网站应用和公众账号(包括小程序),用户的unionid是惟一的。换句话说,同一用户,对同一个微信开放平台下的不一样应用,unionid是相同的。 UnionID机制说明

若是开发者在多个移动应用、网站应用和公众账号之间有统一用户帐号的需求,须要前往微信开放平台(open.weixin.qq.com)绑定公众号后,即可利用UnionID机制来知足上述需求。后端

  • 一个微信开放平台账号下能够有多个移动应用,网站应用,公众帐号和小程序
  • 只要是同一个微信开放平台账号下的移动应用、网站应用和公众账号(包括小程序),用户的unionid是惟一的。

用户在开放平台的惟一标识符微信小程序

你能够简单的理解为:api

unionid = hash(uid + 开放平台id)

总结下
微信针对不一样的用户在不一样的应用下都有惟一的一个openId, 可是要想肯定用户是否是同一个用户,就须要靠unionid来区分。通常本身的后台都会有本身的一个用户表,每一个用户有不一样的userid。也就是说同一个用户在同一个微信开放平台下的相同主体的应用对应着相同的userid,unionid以及不一样的openid。因此在用户登陆进来的时候,咱们只能靠微信返回给咱们的unionid去判断是否是同一个用户,在去关联咱们的用户表,拿到对应的userid。服务器

2、微信小程序如何获取unionid?

绑定了开发者账号的小程序,能够经过下面3种途径获取UnionID。微信

  1. 调用接口wx.getUserInfo,从解密数据中获取UnionID。注意本接口须要用户受权,请开发者妥善处理用户拒绝受权后的状况。
  2. 若是开发者账号下存在同主体的公众号,而且该用户已经关注了该公众号。开发者能够直接经过wx.login获取到该用户UnionID,无须用户再次受权。
  3. 若是开发者账号下存在同主体的公众号或移动应用,而且该用户已经受权登陆过该公众号或移动应用。开发者也能够直接经过wx.login获取到该用户UnionID,无须用户再次受权。

当用户知足条件2和3时,开发者能够直接经过wx.login获取到该用户的unionid, 不然必须调用接口wx.getUserInfo,额外须要注意的事就是妥善处理用户拒绝受权的状况。session

3、登陆最佳实践

  1. 调用 wx.login 获取 code。
  2. 使用 wx.getSetting 获取用户的受权状况app

    • 若是用户已经受权,直接调用 API wx.getUserInfo 获取用户最新的信息;
    • 用户未受权,在界面中显示一个按钮提示用户登入,当用户点击并受权后就获取到用户的最新信息。
  3. 将获取到的用户数据连同wx.login返回的code一同传给后端

封装ajax()

在真实的业务场景中,咱们但愿,用户进入小程序时,未登陆状况下能够正常浏览商品,对小程序有个基本的认知,不要直接弹出框要求用户受权,不然会干扰用户,致使新用户的流失,当用户须要使用一些高级功能和场景,这个时候再去要求用户受权,这样用户受权的概率会大大提升。
将登陆的逻辑封装ajax
流程:

封装的意义
再也不关注当前接口是否须要登陆,用户是否已受权,全部请求直接调用ajax(),在必要的时候完成一切登陆以及受权流程。小程序入口页面增长,业务拓展的时候,你只须要专一于业务实现。

参考资料

相关文章
相关标签/搜索