公司业务开展,最近完成了一个微信小程序的开发。场景是这样:同一微信开放平台下拥有相同主体的APP和微信小程序来完成一样的业务,用户进入app或者微信小程序时必须获取用户的unionid来确认当前的用户身份,完成登陆。小程序“获取用户信息”api(getUserInfo)的调用方式和以前相比有了较大更新,优雅的实现用户受权和登陆很是重要,如下是我在微信小程序受权登陆相关流程在开发时候的实现思路和总结,分享以下。html
说明:ajax
在关注者与公众号产生消息交互后,公众号可得到关注者的OpenID(加密后的微信号,每一个用户对每一个公众号的OpenID是惟一的。对于不一样公众号,同一用户的openid不一样)。—— 微信公众平台开发者文档
你能够简单的理解为小程序
openid = hash(uid + app_id)
若是开发者拥有多个移动应用、网站应用、和公众账号(包括小程序),可经过unionid来区分用户的惟一性,由于只要是同一个微信开放平台账号下的移动应用、网站应用和公众账号(包括小程序),用户的unionid是惟一的。换句话说,同一用户,对同一个微信开放平台下的不一样应用,unionid是相同的。 UnionID机制说明
若是开发者在多个移动应用、网站应用和公众账号之间有统一用户帐号的需求,须要前往微信开放平台(open.weixin.qq.com)绑定公众号后,即可利用UnionID机制来知足上述需求。后端
用户在开放平台的惟一标识符微信小程序
你能够简单的理解为:api
unionid = hash(uid + 开放平台id)
总结下
微信针对不一样的用户在不一样的应用下都有惟一的一个openId, 可是要想肯定用户是否是同一个用户,就须要靠unionid来区分。通常本身的后台都会有本身的一个用户表,每一个用户有不一样的userid。也就是说同一个用户在同一个微信开放平台下的相同主体的应用对应着相同的userid,unionid以及不一样的openid。因此在用户登陆进来的时候,咱们只能靠微信返回给咱们的unionid去判断是否是同一个用户,在去关联咱们的用户表,拿到对应的userid。服务器
绑定了开发者账号的小程序,能够经过下面3种途径获取UnionID。微信
当用户知足条件2和3时,开发者能够直接经过wx.login获取到该用户的unionid, 不然必须调用接口wx.getUserInfo
,额外须要注意的事就是妥善处理用户拒绝受权的状况。session
使用 wx.getSetting 获取用户的受权状况app
在真实的业务场景中,咱们但愿,用户进入小程序时,未登陆状况下能够正常浏览商品,对小程序有个基本的认知,不要直接弹出框要求用户受权,不然会干扰用户,致使新用户的流失,当用户须要使用一些高级功能和场景,这个时候再去要求用户受权,这样用户受权的概率会大大提升。
将登陆的逻辑封装ajax
流程:
封装的意义
再也不关注当前接口是否须要登陆,用户是否已受权,全部请求直接调用ajax()
,在必要的时候完成一切登陆以及受权流程。小程序入口页面增长,业务拓展的时候,你只须要专一于业务实现。