中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

小程序接入和維護微信登錄態的方法

發布時間:2020-12-15 11:21:57 來源:億速云 閱讀:329 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關小程序接入和維護微信登錄態的方法的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

接入流程

這里官方文檔上的流程圖已經足夠清晰,我們直接就該圖展開詳述和補充。

小程序接入和維護微信登錄態的方法

首先大家看到這張圖,肯定會注意到小程序進行通信交互的不止是小程序前端和我們自己的服務端,微信第三方服務端也參與其中,那么微信服務端在其中扮演著怎樣的角色呢?我們一起來串一遍登錄鑒權的流程就明白了。

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();
}

感謝各位的閱讀!關于小程序接入和維護微信登錄態的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富锦市| 漳平市| 民权县| 黑河市| 错那县| 南川市| 邹城市| 安图县| 昂仁县| 恭城| 泉州市| 三都| 芦溪县| 汉川市| 揭西县| 富平县| 白水县| 河北区| 交口县| 东港市| 涿鹿县| 葫芦岛市| 通化市| 沁水县| 金坛市| 宝清县| 灵武市| 乃东县| 临邑县| 临猗县| 柳州市| 嵊泗县| 巩留县| 龙门县| 综艺| 治县。| 右玉县| 乐陵市| 西盟| 凤城市| 永定县|