中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

小程序接入和維護(hù)微信登錄態(tài)的方法-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)小程序接入和維護(hù)微信登錄態(tài)的方法的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的成都機(jī)柜租用服務(wù)

接入流程

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

小程序接入和維護(hù)微信登錄態(tài)的方法

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

1. 調(diào)用wx.login生成code

wx.login()這個(gè)API的作用就是為當(dāng)前用戶生成一個(gè)臨時(shí)的登錄憑證,這個(gè)臨時(shí)登錄憑證的有效期只有五分鐘。我們拿到這個(gè)登錄憑證后就可以進(jìn)行下一步操作:獲取openid和session_key

wx.login({
    success: function(loginRes) {
        if (loginRes.code) {
            // example: 081LXytJ1Xq1Y40sg3uJ1FWntJ1LXyth
        }
    }
});

2. 獲取openid和session_key

我們先來介紹下openid,用過公眾號的童鞋應(yīng)該對這個(gè)標(biāo)識都不陌生了,在公眾平臺里,用來標(biāo)識每個(gè)用戶在訂閱號、服務(wù)號、小程序這三種不同應(yīng)用的標(biāo)識,也就是說每個(gè)用戶在每個(gè)應(yīng)用的openid都是不一致的,所以在小程序里,我們可以用openid來標(biāo)識用戶的性。

那么session_key是用來干嘛的呢?有了用戶標(biāo)識,我們就需要讓該用戶進(jìn)行登錄,那么session_key就保證了當(dāng)前用戶進(jìn)行會(huì)話操作的有效性,這個(gè)session_key是微信服務(wù)端給我們派發(fā)的。也就是說,我們可以用這個(gè)標(biāo)識來間接地維護(hù)我們小程序用戶的登錄態(tài),那么這個(gè)session_key是怎么拿到的呢?我們需要在自己的服務(wù)端請求微信提供的第三方接口https://api.weixin.qq.com/sns/jscode2session,這個(gè)接口需要帶上四個(gè)參數(shù)字段:

小程序接入和維護(hù)微信登錄態(tài)的方法

從這幾個(gè)參數(shù),我們可以看出,要請求這個(gè)接口必須先調(diào)用wx.login()來獲取到用戶當(dāng)前會(huì)話的code。那么為什么我們要在服務(wù)端來請求這個(gè)接口呢?其實(shí)是出于安全性的考量,如果我們在前端通過request調(diào)用此接口,就不可避免的需要將我們小程序的appid和小程序的secret暴露在外部,同時(shí)也將微信服務(wù)端下發(fā)的session_key暴露給“有心之人”,這就給我們的業(yè)務(wù)安全帶來極大的風(fēng)險(xiǎn)。除了需要在服務(wù)端進(jìn)行session_key的獲取,我們還需要注意兩點(diǎn):

session_key和微信派發(fā)的code是一一對應(yīng)的,同一code只能換取一次session_key。每次調(diào)用wx.login(),都會(huì)下發(fā)一個(gè)新的code和對應(yīng)的session_key,為了保證用戶體驗(yàn)和登錄態(tài)的有效性,開發(fā)者需要清楚用戶需要重新登錄時(shí)才去調(diào)用wx.login()

session_key是有失效性的,即便是不調(diào)用wx.login,session_key也會(huì)過期,過期時(shí)間跟用戶使用小程序的頻率成正相關(guān),但具體的時(shí)間長短開發(fā)者和用戶都是獲取不到的

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 || \'返回?cái)?shù)據(jù)字段不完整\'
            }
        } else {
            return data
        }
    });
}

3. 生成3rd_session

前面說過通過session_key來“間接”地維護(hù)登錄態(tài),所謂間接,也就是我們需要自己維護(hù)用戶的登錄態(tài)信息,這里也是考慮到安全性因素,如果直接使用微信服務(wù)端派發(fā)的session_key來作為業(yè)務(wù)方的登錄態(tài)使用,會(huì)被“有心之人”用來獲取用戶的敏感信息,比如wx.getUserInfo()這個(gè)接口呢,就需要session_key來配合解密微信用戶的敏感信息。

那么我們?nèi)绻勺约旱牡卿洃B(tài)標(biāo)識呢,這里可以使用幾種常見的不可逆的哈希算法,比如md5、sha1等,將生成后的登錄態(tài)標(biāo)識(這里我們統(tǒng)稱為\'skey\')返回給前端,并在前端維護(hù)這份登錄態(tài)標(biāo)識(一般是存入storage)。而在服務(wù)端呢,我們會(huì)把生成的skey存在用戶對應(yīng)的數(shù)據(jù)表中,前端通過傳遞skey來存取用戶的信息。

可以看到這里我們使用了sha1算法來生成了一個(gè)skey:

const crypto = require(\'crypto\');
return getSessionKey(code, appid, secret)
    .then(resData => {
        // 選擇加密算法生成自己的登錄態(tài)標(biāo)識
        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里,每次進(jìn)行用戶數(shù)據(jù)請求時(shí)會(huì)帶上skey,那么如果此時(shí)session_key過期呢?所以我們需要調(diào)用到wx.checkSession()這個(gè)API來校驗(yàn)當(dāng)前session_key是否已經(jīng)過期,這個(gè)API并不需要傳入任何有關(guān)session_key的信息參數(shù),而是微信小程序自己去調(diào)自己的服務(wù)來查詢用戶最近一次生成的session_key是否過期。如果當(dāng)前session_key過期,就讓用戶來重新登錄,更新session_key,并將新的skey存入用戶數(shù)據(jù)表中。

checkSession這個(gè)步驟呢,我們一般是放在小程序啟動(dòng)時(shí)就校驗(yàn)登錄態(tài)的邏輯處,這里貼個(gè)校驗(yàn)登錄態(tài)的流程圖:

小程序接入和維護(hù)微信登錄態(tài)的方法

下面代碼即校驗(yàn)登錄態(tài)的簡單流程:

let loginFlag = wx.getStorageSync(\'skey\');
if (loginFlag) {
    // 檢查 session_key 是否過期
    wx.checkSession({
        // session_key 有效(未過期)
        success: function() {
            // 業(yè)務(wù)邏輯處理
        },
    
        // session_key 過期
        fail: function() {
            // session_key過期,重新登錄
            doLogin();
        }
    });
) else {
    // 無skey,作為首次登錄
    doLogin();
}

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

文章名稱:小程序接入和維護(hù)微信登錄態(tài)的方法-創(chuàng)新互聯(lián)
鏈接地址:http://m.rwnh.cn/article20/gehco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計(jì)公司做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
乌鲁木齐县| 陕西省| 大厂| 桃江县| 安陆市| 南宫市| 盘山县| 黄梅县| 文水县| 班玛县| 义马市| 家居| 赫章县| 象山县| 三河市| 武穴市| 孙吴县| 盐亭县| 庄浪县| 潢川县| 济源市| 金溪县| 伊宁县| 合肥市| 新巴尔虎左旗| 滦平县| 天津市| 和林格尔县| 沽源县| 木兰县| 安仁县| 临朐县| 南木林县| 隆尧县| 五常市| 蓬安县| 吉林省| 玉田县| 延安市| 谢通门县| 河源市|