:-: 
## **登錄流程**
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,來識別調用用戶。
:-: 
### **使用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 進程管理
- CentOS與Ubuntu系統區別
- 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服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS