:-: ![](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()`重新生一次。
- PHP
- PHP 核心架构
- PHP 生命周期
- PHP-FPM 详解
- PHP-FPM 配置优化
- PHP 命名空间和自动加载
- PHP 运行模式
- PHP 的 Buffer(缓冲区)
- php.ini 配置文件参数优化
- 常见面试题
- 常用函数
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常见问题
- MySQL 索引
- 事务
- 锁机制
- Explain 使用分析
- MySQL 高性能优化规范
- UNION 与 UNION ALL
- MySQL报错:sql_mode=only_full_group_by
- MySQL 默认的 sql_mode 详解
- Redis
- Redis 知识
- 持久化
- 主从复制、哨兵、集群
- Redis 缓存击穿、穿透、雪崩
- Redis 分布式锁
- RedisBloom
- 网络
- 计算机网络模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常见几种网络攻击方式
- Nginx
- 状态码
- 配置文件
- Nginx 代理+负载均衡
- Nginx 缓存
- Nginx 优化
- Nginx 配置 SSL 证书
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 进程管理
- Java
- 消息队列
- 运维
- RAID 磁盘阵列
- 逻辑分区管理 LVM
- 业务
- 标准通信接口设计
- 业务逻辑开发套路的三板斧
- 微信小程序登录流程
- 7种Web实时消息推送方案
- 用户签到
- 用户注册-短信验证码
- SQLServer 删除同一天用户重复签到
- 软件研发完整流程
- 前端
- Redux
- 其他
- 百度云盘大文件下载
- 日常报错记录
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客户端无法连接SVN服务器,主机积极拒绝