自我介紹
我是IT果果日記,微信公眾號請搜索 IT果果日記
一個普通的技術宅,定期分享技術文章,歡迎點贊、關注和轉發(fā),請多關照。
首先,我們要了解什么是微信小程序登錄?它的作用是什么?
用戶登錄
微信小程序登錄是為了讓開發(fā)者的服務器獲取用戶的openId以及session_key的令牌。
請不要將微信小程序的用戶登錄理解為傳統(tǒng)意義上的登錄。雖然從大的方向上講,登錄都是為了確認用戶的身份、拿到用戶的唯一身份標識,但是微信小程序的登錄流程和傳統(tǒng)的賬號密碼流程不太一樣。當你進入小程序后,不需要輸入任何賬號密碼,開發(fā)者服務器就可以獲取你的openId標識。微信小程序的登錄流程遠比傳統(tǒng)的賬號密碼登錄要復雜。
微信小程序提供了wx.login(OBJECT)方法用于用戶登錄。wx.login方法的主要目的是拿到用戶的openId和用戶本次登錄的session_key。
openId是用戶對于當前小程序的身份標識,類似于我們自己產(chǎn)品里的用戶id號,只不過在微信里有自己的用戶賬戶體系,你可以使用這個openId作為用戶的身份標識。當然,也可以建立一套自己的用戶標識,不過當你需要調用微信開放接口(比如支付、發(fā)送模板消息)時,還是必須知道用戶的openId。
session_key是本次用戶登錄的會話密鑰,通常用來對用戶的通信數(shù)據(jù)進行加解密。
到目前為止,如果對于openId和session_key的概念還很模糊,不知道這兩者的用處,沒有關系,在后面的篇幅里我們將陸續(xù)講解和使用這兩個參數(shù)。
首先要在開發(fā)者服務器拿到openId和session_key。圖1所示為獲取openId和session_key的流程圖。這張圖非常重要。

圖1 登錄并獲取session_key和openId的流程圖
要獲取session_key和openId,首先需要在小程序中調用wx.login,并獲取code;隨后將code發(fā)送到開發(fā)者服務器,并同appid和appsecret一起發(fā)送到微信服務器,微信服務器會返回我們需要的session_key和openId。
我們結合具體代碼看看,實現(xiàn)上述流程并最終拿到session_key和openId。
wx.login({
success: res => {
// 發(fā)送 res.code 到后臺換取 openId, sessionKey, unionId
console.log('code:' + res.code);
wx.request({
url:"http://localhost:8080/wxopen/getOpenIdAndSessionKey",
data:{
code: res.code
},
success: function (res) {
console.log(res.data);
}
})
}
})
這里調用了wx.login方法,這個方法沒有參數(shù),只有回調函數(shù)。success回調函數(shù)是當微信服務器成功返回結果時調用的函數(shù)。
先來看success回調函數(shù)返回參數(shù)的參數(shù)說明。
errMsg 錯誤消息。
code 開發(fā)者需要將code發(fā)送到開發(fā)者服務器后臺,使用code換取session_key api,將code換成openId和session_key。
重點是返回值code。code是一把鑰匙,是得到openId和session_key的關鍵。code有效期只有5分鐘,如果在5分鐘之內還沒有用code換取openId和session_key,那么就不能再使用了。
可不可以直接在小程序內部用code去微信服務器換取openId和session_key呢?理論上是可以的,但這完全沒有意義。無論出于安全性還是實用性,都應該將code發(fā)送到開發(fā)者服務器由開發(fā)者服務器獲取openId和session_key。
所以,我們在wx.login的success回調函數(shù)中再次發(fā)起了一個wx.request請求,將code發(fā)送到了本地服務器中。在編寫后端接口代碼前,首先來學習如何使用code調用微信服務器獲取openId和session_key。
微信提供了一個https接口用于code換取openId以及session_key。接口地址如下:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
需要以下4個參數(shù)才能正確調用該接口:
appid 小程序唯一標識。
secret 小程序的app secret。
js_code 登錄時獲取的code。
grant_type 填寫為authorization_code。
appid和secret均來自于微信小程序賬號,是2個固定的字符串;js_code是我們在小程序客戶端調用wx.login時返回的code;grant_type固定為authorization_code即可。下面編寫服務端代碼。
Map<String,Object> map = new HashMap<>(7);
map.put("appid",wxAppId);
map.put("secret",wxSecret);
map.put("js_code", param.getCode());
map.put("grant_type",grantType);
WxCode2SessionRet sessionRet = null;
try{
String url = "https://api.weixin.qq.com/sns/jscode2session";
String info = HttpUtil.get(url, map);
sessionRet = JSON.parseObject(info, WxCode2SessionRet.class);
log.info("openid = {}, session_key = {}", sessionRet.getOpenid(),
sessionRet.getSession_key());
} catch (Exception e){
log.error("code2session失敗", e);
return null;
}
WxCode2SessionRet.java
@Data
public class WxCode2SessionRet implements Serializable {
private String openid;
private String session_key;
private String unionid;
private String errcode;
private String errmsg;
}
以上代碼請開發(fā)者自行將appid和appsecret替換為自己的appid和secret。看到后端代碼,開發(fā)者可能就會明白為什么不能在小程序客戶端中換取openId和session_key。因為調用換取接口需要敏感數(shù)據(jù)appid和appsecret,特別是secret,一定不可以放在客戶端中,這也是騰訊不允許的,是不會通過微信小程序審核的。
要特別注意,以上代碼為了演示效果,所以將拿到的openId以及session_key返回到了客戶端。但在真實的項目中,將session_key和openId返回客戶端是極其危險的,也完全沒有必要。因為需要使用session_key和openId的場景都會被放置在服務器進行,所以將這兩個參數(shù)返回小程序中沒有任何意義,反而會增加數(shù)據(jù)泄露的風險。
session_key肯定是有失效期的。要注意的是,在session_key的有效期內,開發(fā)者最好不要重復調用wx.login接口、不斷用code換取session_key,而應該將session_key保存在服務器中。等到session_key失效后,再重新獲取新的session_key。
那么如何知道session_key是否已經(jīng)過期呢?小程序提供了一個wx.checkSession(OBJECT)用來校驗session_key是否過期。只有在session_key確實過期后,才會再次調用wx.login。wx.checkSession的使用非常簡單,下面直接給出示例代碼。如圖2所示。

圖2 檢查 session 是否過期
這里還要注意,wx.login得到的code只能使用一次,一旦你使用code換取了openId和session_key,這個code就會馬上失效,不能再次使用。當然,如果5分鐘內這個code還沒有被使用,那么也會失效。
總結
微信小程序用戶登錄主要做了兩件事情:
客戶端調用微信小程序登錄接口wx.login獲取code;
調用服務器端接口,服務端接口帶上code參數(shù)和本地保存的appId、secret,從微信服務器獲取到openId和session_key
另外,session_key有過期時間,我們可以通過調用wx.checkSession(OBJECT)接口校驗session_key何時過期。
那么,拿到了 openId 和 session_key 該怎么使用呢?關注我不迷路,答案在我的其他文章里可以找到。
請聯(lián)系我
我是IT果果日記,微信公眾號請搜索 IT果果日記
一個普通的技術宅,定期分享技術文章,歡迎點贊、關注和轉發(fā),請多關照。
微信公眾號 IT果果日記
https://gitee.com/chenzhaoplus
https://github.com/chenzhaoplus文章來源:http://www.zghlxwxcb.cn/news/detail-627122.html
https://blog.csdn.net/cz285933169?spm=1010.2135.3001.5421文章來源地址http://www.zghlxwxcb.cn/news/detail-627122.html
到了這里,關于微信小程序授權登錄流程的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!