微信的OpenID和UnionID到底的哪些秘密

程序員讀書俱樂部 發佈 2021-08-03T09:17:12.307151+00:00

話不多說,直奔主題,當然也不是談論什麼驚天大秘密,只是公開的小秘密。OpenID: 相當於用戶在應用(小程序、公眾號、小遊戲)里的userid,這個id在本應用里固定不變,但是不同應用的OpenID不一樣。比如在抖音小程序的OpenID是1,在頭條小程序的OpenID是2。

話不多說,直奔主題,當然也不是談論什麼驚天大秘密,只是公開的小秘密。

OpenID: 相當於用戶在應用(小程序、公眾號、小遊戲)里的userid,這個id在本應用里固定不變,但是不同應用的OpenID不一樣。比如在抖音小程序的OpenID是1,在頭條小程序的OpenID是2。

開發者可以通過微信官方提供的登錄能力方便地獲取OpenID。官方流程如下圖。


  1. 小程序前端通過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)
    }
  }
})
  1. 開發者伺服器通過前端傳過來的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針對主體的。

關鍵字: