微信小程序登錄邏輯整理 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

微信小程序登錄邏輯整理

發表時(shí)間:2021-4-30

發布人(rén):融晨科技

浏覽次數:108

官方文檔

文檔相關地(dì / de)址:

用戶登錄 
獲取用戶數據 
用戶數據的(de)簽名驗證和(hé / huò)加解密

登錄時(shí)序圖.png

微信兩個(gè)api所拿到(dào)的(de)信息:login和(hé / huò)getUserInfo

返回的(de)信息.png

注冊/登錄

小程序端:

通過上(shàng)面wx.login和(hé / huò)wx.getUserInfo兩個(gè)api拿到(dào)相應的(de)信息,并通過上(shàng)方接口傳給自己的(de)服務器. 
需要(yào / yāo)傳輸的(de)信息有7個(gè)參數:

appid  小程序唯一标識
secret  小程序的(de) app secret
js_code  //wx.login登錄時(shí)獲取的(de) code,用于(yú)後續獲取session_key

//下面兩個(gè)參數用戶服務器端簽名校驗用戶信息的(de)
signature 使用 sha1( rawData + sessionkey ) 得到(dào)字符串,用于(yú)校驗用戶信息。
rawData  不(bù)包括敏感信息的(de)原始數據字符串,用于(yú)計算簽名。

//下面兩個(gè)參數是(shì)用于(yú)解密獲取openId和(hé / huò)UnionId的(de)
encryptedData  包括敏感數據在(zài)内的(de)完整用戶信息的(de)加密數據
iv 加密算法的(de)初始向量

當然,可以(yǐ)精簡爲(wéi / wèi)以(yǐ)下三個(gè)參數. 
其餘的(de)簽名校驗的(de)參數可省略,而(ér)appid和(hé / huò)secret可以(yǐ)直接寫在(zài)服務器.

js_code //  wx.login登錄時(shí)獲取的(de) code,用于(yú)後續獲取session_key
encryptedData  包括敏感數據在(zài)内的(de)完整用戶信息的(de)加密數據
iv 加密算法的(de)初始向量

服務端處理邏輯

相關的(de)信息傳輸給服務器後,服務器

1.先根據js_code去微信服務器拿到(dào)session_key 
2.(此步可省略)使用 sha1( rawData + sessionkey )拿到(dào)字符串,判斷與signature值是(shì)否相同,如果相同則用戶信息無誤,可進行下一步.如果不(bù)同,則說(shuō)明用戶信息被篡改或過期. 
3.然後根據解密算法自行解密(輸入參數爲(wéi / wèi)appId,sessionKey,encryptedData,iv,返回一個(gè)jsonObj),拿到(dào)openId和(hé / huò)unionId等信息,執行服務器端的(de)注冊/登錄操作. 
4.注冊/登錄操作邏輯完成後,将我們服務器的(de)sessionId(或其他(tā)token),以(yǐ)及用戶信息返回給客戶端.

其中,服務器去獲取session_key的(de)請求爲(wéi / wèi):

(小寫爲(wéi / wèi)固定寫好的(de),大(dà)寫爲(wéi / wèi)待替換的(de)) 
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

返回:

    //正常返回的(de)JSON數據包
    {
          "openid": "OPENID",
          "session_key": "SESSIONKEY"
          "expires_in": 2592000
    }
    //錯誤時(shí)返回JSON數據包(示例爲(wéi / wèi)Code無效)
    {
        "errcode": 40029,
        "errmsg": "invalid code"
    }

相關解密算法:

https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

注意:示例代碼中有node,c++,php,python的(de),沒有java的(de).

需要(yào / yāo)服務器返回的(de)信息:

sessionId/token 登錄狀态标識
userInfo: jsonObject,用戶在(zài)我們平台上(shàng)的(de)信息,其内容與getPersonalInfo接口返回的(de)相同.

最後,将登錄操作封裝成方法,需要(yào / yāo)處調用即可

//最終供外面調用的(de)方法
function login(){
    console.log('logining..........');
    //調用登錄接口
    wx.login({
        success: function (e) {
            console.log('wxlogin successd........');
            var code = e.code;
            wx.getUserInfo({
                success: function (res) {
                    console.log('wxgetUserInfo successd........');
                    var encryptedData = https://www.wxapp-union.com/encodeURIComponent(res.encryptedData);
                    thirdLogin(code,encryptedData,res.iv);//調用服務器api
                }
            })
        }
    });
}

function  thirdLogin(code,encryptedData,iv){
    var url ="eeee/xxx/login/ttttt";
    var params = new Object();
    params.code = code;
    params.encryptedData = https://www.wxapp-union.com/encryptedData;
    params.iv =iv;

    buildRequest(new Object(),url,params,{
        onPre: function(page){},
        onSuccess:function (data){
            console.log('my  login successd........');
            console.log(data);
            getApp().globalData.session_id = data.session_id;
            getApp().globalData.uid = data.uid;
            getApp().globalData.isLogin = true;
        },
        onError : function(msgCanShow,code,hiddenMsg){
        }
    }).send();
}

相關案例查看更多