关于小程序授权登录及获取unionId的方法总结

小程序官方文档(https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html)中有如下一段话,介绍了获取UnionID需要满足的条件:

关于小程序授权登录及获取unionId的方法总结_第1张图片

除了第1条,其它条件基本上可以总结为:需要用户关注或授权过微信公众号或移动应用。也就是说,如果一个公司只有小程序一个产品,没有公众号,也没有其它移动应用,开发者就无法获取UnionID了。但是现实的情况是,很多初创公司刚开始会优先开发小程序,没有精力去做公众号或app等产品。按照官方的说法,开发者只能获取到用户的openID,无法获取UnionID。一旦小程序发布上线,用户注册时,数据库只能以openID作为用户的唯一标识生成新用户记录。一开始没什么问题,但是在将来的某个时候,公司开始研发并上线了公众号和app的产品,用户在使用这些产品注册并登录时,他们会有不同的openID,即使他们之前已经在小程序上注册过。这时,系统无法确认这些用户和之前登录过小程序的用户是否为同一个用户,因为数据库是以openID作为用户的唯一标识的,同一个微信用户在不同的应用中的openID是不同的。

对于以上情况,只能使用第1条规则才能获取UnionID了。这条规则需要去微信开放平台(https://open.weixin.qq.com)完成小程序的绑定。

完成以上两个步骤之后,剩下的就是开发的工作了。基本的步骤分为两步。第一步,客户端先调用wx.login方法进行登录,拿到code字段。然后通过button的方式引导用户进行授权,再通过API的方式调用wx.getUserInfo获取关键信息(最重要的两个字段是iv和encryptedData)。第二步,客户端将第一步中的code、iv和encryptedData发送给服务器,服务器利用code从微信服务获得session_key字段(访问服务接口code2session,参考文档地址在https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html),然后将iv、encryptedData、session_key和appId这几个字段糅合在一起进行解密,解密后得到的文本内容中就会看到UnionID的信息了。

对于客户端,这里解释一下为什么需要预先获取授权,以及通过API方式调用wx.getUserInfo时需要注意的问题。我们知道,小程序客户端获取用户信息,有两种方式。一种是通过button的open-type属性设置为getUserInfo,用户点击这个button后,会回调一个自定义的方法,用户的信息就通过这个回调方法的参数传进去。但是这种方式获取到的用户信息并不会包含敏感数据,如前面提到的iv和encryptedData字段。如果需要获取这些敏感数据字段,就必须通过API方式来调用wx.getUserInfo方法,调用这个方法的时候,需要传入一个withCredentials参数,其值为true,这样才会在返回结果中包含iv和encryptedData字段。根据小程序官方的最新规则,如果事先没有获得用户的授权,则在调用这个方法时会直接返回失败的结果。所以调用这个方法之前,必须先让用户授权。另一方面,只有事先调用了wx.login并成功登录了之后,withCredentials参数才会起作用。这也就解释了为什么需要先login,然后授权,再调用wx.getUserInfo。更具体的说明可以查看一下wx.getUserInfo接口的定义(https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html)。

关于小程序授权登录及获取unionId的方法总结_第2张图片

另外,对于服务端,这里也解释说明一下。服务端获取用户的UnionID并不一定非要对iv和encryptedData进行解密来获取。如果用户关注或授权过公众号,或授权过移动应用,那么在通过code获取session_key的返回结果中可能就直接得到UnionID了。所以,服务端需要先判断一下是否已经返回了UnionID,如果没有,再进行解密操作,这样做能提高运行时的效率。

你可能感兴趣的:(微信小程序)