小程序官方文檔中說(shuō)道:
調(diào)用wx.login接口獲取登錄憑證(code)進(jìn)而換取用戶登錄態(tài)信息,包括用戶的唯一標(biāo)識(shí)(openid)及本次登錄的會(huì)話密鑰(session_key)。調(diào)用wx.getUserInfo接口將返回的數(shù)據(jù)會(huì)包含 encryptedData, iv 等敏感信息。用戶數(shù)據(jù)的加解密通訊需要依賴會(huì)話密鑰完成。
UnionID機(jī)制說(shuō)明:
如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用、和公眾帳號(hào)(包括小程序),可通過(guò)unionid來(lái)區(qū)分用戶的唯一性,因?yàn)橹灰峭粋€(gè)微信開(kāi)放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào)(包括小程序),用戶的unionid是唯一的。換句話說(shuō),同一用戶,對(duì)同一個(gè)微信開(kāi)放平臺(tái)下的不同應(yīng)用,unionid是相同的。
小程序登錄主要作用是獲取用戶信息,主要用到兩個(gè)API,一個(gè)是wx.login獲取用戶的jscode,再通過(guò)服務(wù)器端用jscode去獲取用戶的openid與session_key。openid是用戶在小程序公眾平臺(tái)的唯一標(biāo)識(shí),注意,是小程序公眾平臺(tái)內(nèi),而不是所有公眾平臺(tái)內(nèi),即如果在服務(wù)號(hào)或訂閱號(hào)公眾平臺(tái),就可能會(huì)有跟此用戶同樣openid的用戶,如果要微信所有公眾平臺(tái)某個(gè)用戶的唯一標(biāo)識(shí),就只能用unionid了。session_key是用戶的密鑰,用于解密用戶敏感數(shù)據(jù)。另一個(gè)wx.getuserInfo就是為了獲取到用戶的加密敏感數(shù)據(jù)與偏移量iv,偏移量再加上之前的session_key就能解密用戶的敏感數(shù)據(jù)了。
官方提供的登錄流程圖:

下面是主要步驟流程:
步驟流程結(jié)合的詳細(xì)流程圖:

小程序客戶端發(fā)起的調(diào)用:
wx.login({
success: function (res) {
var jscode = res.code;
wx.getUserInfo({
success: function (res) {
var option = {
url: config.ghost+config.UrlApi.app_userlogin_url,
method:'POST',
data: {
"obj":{
"encryptedData": res.encryptedData,
"iv": res.iv,
"jscode": jscode
},
"UserCode": "",
"EncryptUserCode": config.gencryptCusCode,
"AppType":config.gapptype,
"CompanyKey":config.gcompanyKey,
"ShopID":config.gshopID
}
};
utils.ClientRequest(option,
function (res) {
console.log(res);
if(res.data.Body.Code=="1"){
//成功
var resData = res.data.Body.Data;
//初始化
that.setConfigUser(resData);
//把Clientkey存緩存
storage.setStorageData(config.storageKey.Userkey,resData.clientkey);
} else{
console.log(res);
wx.navigateTo({url: "../loginfail/loginfail"});
}
},
function (res) {
console.log(res);
wx.navigateTo({url: "../loginfail/loginfail"});
}
);
},
fail: function () { // 拒絕操作
wx.naviga
|