多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
:-: ![](https://img.kancloud.cn/09/ac/09acd8c24332e91dd9defbac05e1d4e1_748x755.png) ## **登录流程** 1. 小程序前端调用 [`wx.login`](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html) 获取**临时登录凭证 `code` **,并回传到开发者服务器(服务端)。 2. 服务端通过小程序 **appId,appSecert**,以及刚获取的 `code` 调用 [`auth.code2Session`](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html) 接口,换取**用户唯一标识 OpenID**,用户在微信开放平台帐号下的**唯一标识UnionID**(若当前小程序已绑定到微信开放平台帐号) 和**会话密钥 session_key**。 3. 如果数据库中有匹配当前 `openid` 的信息,执行登录操作;如果数据库中没有匹配当前`openid`的信息,执行注册操作(将刚才返回的信息写入数据库)。 4. 服务端生成个一个**自定义的登录态**(token或session),来保存微信服务器返回的登录态相关信息(`session_key`、`openid`、`unionid`),并且做关联处理,然后返回给小程序客户端。 5. 小程序客户端接收到返回的**自定义登录态**信息,登录成功。将后端返回的信息存储至小程序缓存 **storage**中。 6. 小程序客户端访问业务接口的时候,携带之前保存的**自定义登录态**信息对服务端业务接口进行访问。 7. 服务端业务接口接收到请求,先校验**自定义登录态**,然后返回相关信息。如果校验登录态超时,告知小程序客户端需要重新登录; ## **登录态** **程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法。** WEB服务器通过浏览器携带的cookie获取session来判断是否是同一用户(或浏览器);Restful服务通过客户端传过来唯一ID,来识别调用用户。 :-: ![](https://img.kancloud.cn/33/3e/333ea3f3090ce76113eabb1578d5aed8_640x346.png) ### **使用sessionkey来维护登录态** 小程序用户身份的标识使用 openid,如果是多平台的可以使用 unionid。同一个用户这两个id 是永久不变的,就算用户删除了小程序,下次用户进入小程序,开发者依旧可以通过后台的记录标识出来。 在实际使用中用到`session_key`的场景不多。比如用户信息 `openid `和`unionid`获取、用户手机号的获取。前者是`wx.login()`中通过`code`就能获取到,用`session_key`来解密的场景基本上就很少了。 但是获取用户手机号时要使用**有效的** `session_key`,使用之前需要 `wx.checkSession()` 来检查是否过期, 如果过期调用 `wx.login` 重新登录。 把`session_key`保存到服务器上,一般是不在网络传输,建立自己的 `session_id `或 `token` 和生成的`session_key`的对应关系。然后把生成的session_id 或 token传输到小程序客户端,在小程序本地缓存。在需要使用`session_key`的场景时先使用`wx.checkSession()`判定一下有没有过期,如果没有过期就把本地的`session_id `传输到服务端,服务端根据`session_id `查询对应的`session_key`,进行后继的业务操作。如果本地判定已经过期,那就先`wx.login()`重新生一次。