微信小程序登錄邏輯整理
發表時(shí)間:2021-4-30
發布人(rén):融晨科技
浏覽次數:108
官方文檔
文檔相關地(dì / de)址:
用戶登錄
獲取用戶數據
用戶數據的(de)簽名驗證和(hé / huò)加解密
微信兩個(gè)api所拿到(dào)的(de)信息:login和(hé / huò)getUserInfo
注冊/登錄
小程序端:
通過上(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();
}