話不多說,直奔主題,當然也不是談論什麼驚天大秘密,只是公開的小秘密。
OpenID: 相當於用戶在應用(小程序、公眾號、小遊戲)里的userid,這個id在本應用里固定不變,但是不同應用的OpenID不一樣。比如在抖音小程序的OpenID是1,在頭條小程序的OpenID是2。
開發者可以通過微信官方提供的登錄能力方便地獲取OpenID。官方流程如下圖。
- 小程序前端通過wx.login()獲取一個用戶的臨時code(有效期五分鐘),然後通過wx.request()接口發送到開發者伺服器。
wx.login({
success (res) {
if (res.code) {
//發起網絡請求
wx.request({
url: 'https://test.com/onLogin',
data: {
code: res.code
}
})
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
- 開發者伺服器通過前端傳過來的code,再加上appid+appsecret請求微信伺服器,獲取用戶OpenID和session_key。其中session_key是有有效期的,至於多少開發者不知道。之後開發者伺服器可以根據用戶標識來生成自定義登錄態,用於後續業務邏輯中前後端交互時識別用戶身份。官方建議不要把openid和session_key給小程序前端,而是在後端把他們作為value存到緩存中,把key傳給前端。前端在調用接口的時候帶上key。後端通過key獲取到value,來維護用戶身份。
請求地址:
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
- 為什麼每個應用的OpenID不一樣,如果每個微信用戶在不同的應用中OpenID,豈不是更好維護。
其實還是為了安全,如果OpenID一樣,首先我們就可以通過OpenID做一些營銷,就比如我們現在收到的垃圾簡訊,因為我們對外界暴露的手機號只有一個。但是如果我們給每個商家留的手機號不一樣,簡訊只收這個商家的,那我們就少了許多垃圾簡訊。再有就是,幾個微信大號有上億的粉絲,如果讓他們掌握了OpenID,也就是間接地掌握了微信用戶的一些信息。微信肯定是不允許這樣的。
UnionID:一個主體(公司)下的用戶唯一標識。之前講的抖音和頭條的OpenID不一樣。既然他們都屬於字節跳動,為什麼登陸授權了頭條,再用抖音的時候還需要登陸授權呢。就是老生常談的SSO。UnionID就是為了解決這個問題而生。主要主體擁有了用戶的UnionID,就可以自己授權用戶登陸主體下的其他應用。當然用戶在每個主體里的UnionID也是不一樣的。
用戶可以通過如下方式獲取UnionID。
1. 調用接口 wx.getUserInfo,從解密數據中獲取 UnionID。注意本接口需要用戶授權,請開發者妥善處理用戶拒絕授權後的情況。
2. 如果開發者帳號下存在同主體的公眾號,並且該用戶已經關注了該公眾號。開發者可以直接通過 wx.login + code2Session 獲取到該用戶 UnionID,無須用戶再次授權。
3. 如果開發者帳號下存在同主體的公眾號或移動應用,並且該用戶已經授權登錄過該公眾號或移動應用。開發者也可以直接通過 wx.login + code2Session 獲取到該用戶 UnionID ,無須用戶再次授權。
4. 用戶在小程序(暫不支持小遊戲)中支付完成後,開發者可以直接通過getPaidUnionId接口獲取該用戶的 UnionID,無需用戶授權。注意:本接口僅在用戶支付完成後的5分鐘內有效,請開發者妥善處理。
5. 小程序端調用雲函數時,如果開發者帳號下存在同主體的公眾號,並且該用戶已經關注了該公眾號,可在雲函數中通過 cloud.getWXContext 獲取 UnionID。
6. 小程序端調用雲函數時,如果開發者帳號下存在同主體的公眾號或移動應用,並且該用戶已經授權登錄過該公眾號或移動應用,也可在雲函數中通過 cloud.getWXContext 獲取 UnionID。
總結 : OpenID的是針對單個應用的,UnionID針對主體的。