小程式如何存取和維護微信登入態?
為了方便小程式應用程式使用微信登入態進行授權登錄,微信小程式提供了登入授權的開放介面。乍看文檔,感覺文檔上講的非常有道理,但是實現起來又真的是摸不著頭腦,不知道如何管理和維護登入態。本文就來手把手的教導大家在業務裡如何接入和維護微信登入態。
存取流程
這裡官方文件上的流程圖已經夠清晰,我們直接就該圖展開詳述和補充。
首先大家看到這張圖,一定會注意到小程式進行通訊互動的不隻小程式前端和我們自己的服務端,微信第三方服務端也參與其中,那麼微信服務端在其中扮演著怎樣的角色呢?我們一起來串一遍登入鑑權的流程就明白了。
1. 呼叫wx.login產生code
wx.login()這個API的作用就是為目前使用者產生一個暫時的登入憑證,這個暫時登入憑證的有效期限只有五分鐘。我們拿到這個登入憑證後就可以進行下一步操作:取得openid和session_key
wx.login({ success: function(loginRes) { if (loginRes.code) { // example: 081LXytJ1Xq1Y40sg3uJ1FWntJ1LXyth } } });
#2. 取得openid和session_key
我們先介紹下openid,用過公眾號的童鞋應該對這個標識都不陌生了,在公眾平台裡,用來標識每個用戶在訂閱號、服務號、小程式這三種不同應用的唯一標識,也就是說每個用戶在每個應用程式的openid都是不一致的,所以在小程式裡,我們可以用openid來識別使用者的唯一性。
那麼session_key是用來幹嘛的呢?有了使用者標識,我們就需要讓該使用者登入,那麼session_key就保證了目前使用者進行會話操作的有效性,而這個session_key是微信服務端給我們所發的。也就是說,我們可以用這個識別來間接維護我們小程式使用者的登入態,那麼這個session_key是怎麼拿到的呢?我們需要在自己的服務端請求微信提供的第三方介面https://api.weixin.qq.com/sns/jscode2session,這個介面需要帶四個參數欄位:
從這幾個參數,我們可以看出,要請求這個介面必須先呼叫wx.login()來取得到使用者目前會話的code。那為什麼我們要在服務端來請求這個介面呢?其實是出於安全性的考量,如果我們在前端透過request呼叫此接口,就不可避免的需要將我們小程式的appid和小程式的secret暴露在外部,同時也將微信服務端下發的session_key暴露給“有心之人”,這對我們的業務安全造成極大的風險。除了需要在服務端進行session_key的獲取,我們還需要注意兩點:
session_key和微信派發的code是一一對應的,同一code只能換取一次session_key。每次呼叫wx.login(),都會下發一個新的code和對應的session_key,為了確保使用者體驗和登入態的有效性,開發者需要清楚使用者需要重新登入時才去呼叫wx.login()
session_key是有失效的,即使是不呼叫wx.login,session_key也會過期,過期時間跟用戶使用小程式的頻率成正相關,但具體的時間長短開發者和用戶都是獲取不到的
function getSessionKey (code, appid, appSecret) { var opt = { method: \'GET\', url: \'https://api.weixin.qq.com/sns/jscode2session\', params: { appid: appid, secret: appSecret, js_code: code, grant_type: \'authorization_code\' } }; return http(opt).then(function (response) { var data = response.data; if (!data.openid || !data.session_key || data.errcode) { return { result: -2, errmsg: data.errmsg || \'返回数据字段不完整\' } } else { return data } }); }
3. 產生3rd_session
#前面說過透過session_key來「間接」地維護登入態,所謂間接,也就是我們需要自己維護使用者的登入態訊息,這裡也是考慮到安全性因素,如果直接使用微信服務端派發的session_key來作為業務方的登錄態使用,會被“有心之人”用來獲取用戶的敏感信息,比如wx.getUserInfo( )這個介面呢,就需要session_key來配合解密微信用戶的敏感資訊。
那麼我們如果生成自己的登錄態標識呢,這裡可以使用幾種常見的不可逆的哈希演算法,例如md5、sha1等,將生成後的登錄態標識(這裡我們統稱為\' skey\')傳回前端,並在前端維護這份登入態標識(一般是存入storage)。而在服務端呢,我們會把生成的skey存在用戶對應的資料表中,前端透過傳遞skey來存取用戶的資訊。
可以看到這裡我們使用了sha1演算法來產生了一個skey:
const crypto = require(\'crypto\'); return getSessionKey(code, appid, secret) .then(resData => { // 选择加密算法生成自己的登录态标识 const { session_key } = resData; const skey = encryptSha1(session_key); }); function encryptSha1(data) { return crypto.createHash(\'sha1\').update(data, \'utf8\').digest(\'hex\') }
4. checkSession##
前面我们将skey存入前端的storage里,每次进行用户数据请求时会带上skey,那么如果此时session_key过期呢?所以我们需要调用到wx.checkSession()这个API来校验当前session_key是否已经过期,这个API并不需要传入任何有关session_key的信息参数,而是微信小程序自己去调自己的服务来查询用户最近一次生成的session_key是否过期。如果当前session_key过期,就让用户来重新登录,更新session_key,并将最新的skey存入用户数据表中。
checkSession这个步骤呢,我们一般是放在小程序启动时就校验登录态的逻辑处,这里贴个校验登录态的流程图:
下面代码即校验登录态的简单流程:
let loginFlag = wx.getStorageSync(\'skey\'); if (loginFlag) { // 检查 session_key 是否过期 wx.checkSession({ // session_key 有效(未过期) success: function() { // 业务逻辑处理 }, // session_key 过期 fail: function() { // session_key过期,重新登录 doLogin(); } }); ) else { // 无skey,作为首次登录 doLogin(); }
推荐:《小程序开发教程》
以上是小程式如何存取和維護微信登入態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

隨著行動互聯網技術和智慧型手機的普及,微信成為了人們生活中不可或缺的一個應用。而微信小程式則讓人們可以在不需要下載安裝應用程式的情況下,直接使用小程式來解決一些簡單的需求。本文將介紹如何使用Python來開發微信小程式。一、準備工作在使用Python開發微信小程式之前,需要先安裝相關的Python函式庫。這裡推薦使用wxpy和itchat這兩個函式庫。 wxpy是一個微信機器

實作微信小程式中的卡片翻轉特效在微信小程式中,實現卡片翻轉特效是一種常見的動畫效果,可以提升使用者體驗和介面互動的吸引力。以下將具體介紹如何在微信小程式中實現卡片翻轉的特效,並提供相關程式碼範例。首先,需要在小程式的頁面佈局檔案中定義兩個卡片元素,一個用於顯示正面內容,一個用於顯示背面內容,具體範例程式碼如下:<!--index.wxml-->&l

小程式能用react,其使用方法:1、基於「react-reconciler」實作一個渲染器,產生一個DSL;2、建立一個小程式元件,去解析和渲染DSL;3、安裝npm,並執行開發者工具中的建構npm;4、在自己的頁面中引入包,再利用api即可完成開發。

本站10月31日消息,今年5月27日,螞蟻集團宣布啟動“漢字拾光計劃”,最近又迎來新進展:支付寶上線“漢字拾光-生僻字”小程序,用於向社會徵集生僻字,補充生僻字庫,同時提供不同的生僻字輸入體驗,以幫助完善支付寶內的生僻字輸入方法。目前,用戶搜尋「漢字拾光」、「生僻字」等關鍵字就可以進入「生僻字」小程式。在小程式裡,使用者可以提交尚未被系統辨識輸入的生僻字圖片,支付寶工程師確認後,將會對字庫進行補錄入。本站注意到,使用者也可以在小程式體驗最新的拆字輸入法,這項輸入法針對讀音不明確的生僻字設計。用戶拆

uniapp如何實現小程式和H5的快速轉換,需要具體程式碼範例近年來,隨著行動網路的發展和智慧型手機的普及,小程式和H5成為了不可或缺的應用形式。而uniapp作為一個跨平台的開發框架,可以在一套程式碼的基礎上,快速實現小程式和H5的轉換,大大提高了開發效率。本文將介紹uniapp如何實現小程式和H5的快速轉換,並給出具體的程式碼範例。一、uniapp簡介unia

這篇文章給大家帶來了關於微信小程式的相關問題,其中主要介紹瞭如何在小程式中用公眾號範本訊息,下面一起來看一下,希望對大家有幫助。

實現思路x01服務端的建立首先,在服務端,使用socket進行訊息的接受,每接受一個socket的請求,就開啟一個新的線程來管理訊息的分發與接受,同時,又存在一個handler來管理所有的線程,從而實現對聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務端簡單多了,客戶端的作用只是對消息的發送以及接受,以及按照特定的規則去輸入特定的字符從而實現不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個線程,一個是專門用於接受消息,一個是專門用於發送消息的至於為什麼不用一個呢,那是因為,只

PHP與小程式的地理位置定位與地圖顯示地理位置定位與地圖顯示在現代科技中已經成為了必備的功能之一。隨著行動裝置的普及,人們對於定位和地圖顯示的需求也越來越高。在開發過程中,PHP和小程式是常見的兩種技術選擇。本文將為大家介紹PHP與小程式中的地理位置定位與地圖顯示的實作方法,並附上對應的程式碼範例。一、PHP中的地理位置定位在PHP中,我們可以使用第三方地理位
