登录这块是基本每个 APP 都需要用到的技术,小程序这边的登录和其他的有点不同,本篇文章主要讲下登录这块的坑。

首先看一下文档里介绍登录的图

首先在第一个页面中调用 ws.login() 获取 code,然后在图片中写着直接将 code 发送给自己的后台,这其中少了一步调用 wx.getUserInfo 来获取一段加密串,得到这段加密串后将加密串和 code 一起发给服务器,然后服务器通过 APPID, APPSecret, code 参数请求微信服务器获得 session_key 和 openid。然后通过获得的 session_key 去解密之前发过来的加密串得到 unionid。

unionid 和 openid 是不同的,首先在小程序中获得 unionid 是需要先在微信后台绑定公众号,然后绑定小程序,才能获得 unionid 的。

unionid 和 openid 的区别在于,当我们分别有多个不同应用时,只通过 openid 去绑定微信帐号和用户帐号会帐号不统一,因为 openid 在多个应用间是不同的,然后 unionid 在多个应用间是相同的,通过 unionid 去绑定微信帐号和用户帐号能完成多个应用间的帐号统一,节约运营成本。

接下来服务器通过一段规则生成 3rd_session,并以 3rd_session为 key,session_key + openid 为 value,写入 session 存储。

服务器生成 3rd_session后,将 3rd_session 返回给客户端,客户端将 3rd_session 写入缓存。

图中写明在小程序请求时需要加上 3rd_session,这是因为小程序的请求是不支持传递 cookie 的,需要在 header 中自定义 key,将 3rd_session 作为 value 发送出去,服务器先检测 3rd_session 对应的 seesion_key 是否过期,如果过期,需要客户端重新发起 ws.login()

以上便是完整的登录请求流程。