微信官方文档:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
1.调用wx.login(Object object)获取用户登录凭证code(有效期五分钟,只能用一次,就像手机验证码的作用),将code传给后台换取用户登录态信息(openid、session_key、...),这个登录态信息仅仅是微信用户的身份信息,还不是支持后台业务的登录信息,我们需要把openid和session_key缓存起来备用,避免频繁调用wx.login刷新session_key导致后台解密encryptedData失败。
1-1 openid:某微信用户的唯一标识;
1-2 session_key:某微信用户本次登录的会话密钥,就像token,它有有效期,并且可能会被wx.login() disabled掉(当超过刷新session_key的最短周期后,调用wx.login会导致保存在后台的session_key过期失效)。
2.点授权手机号按钮获取用户手机号(这个接口只能获取到微信用户加密的手机号,而没有微信用户信息),将openid、session_key、encryptedData(包含用户手机号的加密数据)、iv(加密算法初始向量)作为参数调用后台登录接口换取自定义登录态(token和userInfo),此时后台仅保存了微信用户的手机号。
3.我们需要进一步使用微信开放能力获取用户信息(昵称、头像、性别, ...)保存到后台数据库得到最完整的用户信息,同样的这些用户信息也是加密的encryptedData(包含用户信息的加密数据),需要使用session_key解密。
3-1 后台需要为用户添加一个是能否已经绑定某一微信用户的open_id的字段,如果未绑定才去绑定。
3-2 因为session_key具有有效性(用户频繁使用,则可能一直有效;越久未使用越可能失效),所以在点击获取用户信息按钮之后 and 调用后台接口保存用户信息之前,我们需要调用wx.checkSession()判断session_key是否已经失效,如果调用成功(当前session_key未失效)则可以直接调用后台绑定用户信息接口,如果调用失败(当前session_key已失效),则需要重新获取session_key,再调用后台绑定用户信息接口。
注意⚠️:需要重新登录时(未取得session_key 或者 session_key失效),才调用wx.login。
Tip.登录调用的是getphonenumber(不包含用户信息),绑定用户信息调用的是getUserInfo(不包含手机号),因为是互不包含,所以分成两步绑定用户的完整信息。