微信小程序登錄邏輯梳理

官方文檔

文檔相關地址:

用戶登錄
獲取用戶數據
用戶數據的簽名驗證和加解密

登錄時序圖.png

微信兩個api所拿到的信息:login和getUserInfo

返回的信息.png

注冊/登錄

小程序端:

通過上面wx.login和wx.getUserInfo兩個api拿到相應的信息,并通過上方接口傳給自己的服務器.
需要傳輸的信息有7個參數:

appid  小程序唯一標識
secret  小程序的 app secret
js_code  //wx.login登錄時獲取的 code,用于后續(xù)獲取session_key

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

//下面兩個參數是用于解密獲取openId和UnionId的
encryptedData  包括敏感數據在內的完整用戶信息的加密數據
iv 加密算法的初始向量

當然,可以精簡為以下三個參數.
其余的簽名校驗的參數可省略,而appid和secret可以直接寫在服務器.

js_code //  wx.login登錄時獲取的 code,用于后續(xù)獲取session_key
encryptedData  包括敏感數據在內的完整用戶信息的加密數據
iv 加密算法的初始向量

服務端處理邏輯

相關的信息傳輸給服務器后,服務器

1.先根據js_code去微信服務器拿到session_key
2.(此步可省略)使用 sha1( rawData + sessionkey )拿到字符串,判斷與signature值是否相同,如果相同則用戶信息無誤,可進行下一步.如果不同,則說明用戶信息被篡改或過期.
3.然后根據解密算法自行解密(輸入參數為appId,sessionKey,encryptedData,iv,返回一個jsonObj),拿到openId和unionId等信息,執(zhí)行服務器端的注冊/登錄操作.
4.注冊/登錄操作邏輯完成后,將我們服務器的sessionId(或其他token),以及用戶信息返回給客戶端.

其中,服務器去獲取session_key的請求為:

(小寫為固定寫好的,大寫為待替換的)
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

返回:

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

相關解密算法:

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

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

需要服務器返回的信息:

sessionId/token 登錄狀態(tài)標識
userInfo: jsonObject,用戶在我們平臺上的信息,其內容與getPersonalInfo接口返回的相同.

最后,將登錄操作封裝成方法,需要處調用即可

//最終供外面調用的方法
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 = 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 = 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();
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,688評論 19 139
  • 給提問的開發(fā)者的建議:提問之前先查詢 文檔、通過社區(qū)右上角搜索搜索已經存在的問題。 寫一個簡明扼要的標題,并且...
    極樂叔閱讀 14,643評論 0 3
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 14,360評論 0 15
  • 2017.02.06 版本 tabBar tabBar 是一個數組,只能配置最少2個、最多5個 tab,tab 按...
    Vincent_Du閱讀 1,266評論 0 2
  • Android開發(fā)在保證性能的前提下,UI必須要酷酷的可以為你的應用加分不少,自定義View的方法中組合控件是經常...
    Smart_Arvin閱讀 420評論 0 0

友情鏈接更多精彩內容