原創聲明:本文為作者原創,未經允許不得轉載,經授權轉載需注明作者和出處
微信的定位并不是 HTML5,這里很多人都有誤解。在一些實現上,并不能想當然地用 HTML5 的思路來思考。比如,微信的請求接口 wx.request 并不支持 cookie 傳遞,所以會話層不能使用傳統的 Session 方式。 ——騰訊云官方的微信小程序云端解決方案
github:https://github.com/CFETeam/weapp-session
從圖中可以看出weapp-session使用自定義 Header 來傳遞微信小程序內用戶信息,在服務內可以直接獲取用戶在微信的身份。會話層使用 Redis 作為緩存管理,比較可靠。
但是也是騰訊在推銷自己的產品!!!
以下借鑒自官方文檔:
首次請求
調用 wx.login() 和 wx.getUserInfo() 接口獲得 code、rawData 和 signature
requset 的頭部帶上 code、rawData 和 signature
保存 code 供下次調用
非首次請求
request 的頭部帶上保存的 code
如果 code 為空,跳到第 4 步
如果 code 不為空,且 rawData 不為空,需要進行簽名校驗
使用 code,appid、app_secret 請求微信接口獲得 session_key 和 openid
如果接口失敗,響應 ERR_SESSION_KEY_EXCHANGE_FAILED
使用簽名算法通過 rawData 和 session_key 計算簽名 signature2
對比 signature 和 signature2
簽名一致,解析 rawData 為 wxUserInfo
把 openid 寫入到 wxUserInfo
把 (code, wxUserInfo) 緩存到 Redis
把 wxUserInfo 存放在 request.$wxUserInfo 里
跳到第 4 步
簽名不一致,響應 ERR_UNTRUSTED_RAW_DATA
如果 code 不為空,但 rawData 為空,從 Redis 根據 code 查詢緩存的用戶信息
找到用戶信息,存放在 request.$wxUserInfo 字段里,跳到第 4 步
沒找到用戶信息(可能是過期),響應 ERR_SESSION_EXPIRED
現在也在陸陸續續的出好多第三的SESSION管理模塊,坐等開源吧,畢竟造輪子這種事情大部分人也不喜歡~