在企業微信中如何獲取unionId?

1.概念科普

微信開放和公衆平臺的定位

  • 微信開放平臺是爲了讓第三方應用投入微信的懷抱而設計的,比如第三方的移動應用(Android/IOS)、網站等;微信爲了開疆拓土,擴大自己的影響力。
  • 微信公衆平臺是爲了讓程序員利用微信生態技術開發公衆號、小程序而建立的,是一個技術提供平臺;這纔是微信開發生態起家的根據地,基於此,逐步發展壯大。

appId,openId, unionId三者的區別

  • appId

    appId是微信生態應用的唯一標識,在微信開放平臺和微信公衆平臺註冊應用,都能獲得appId。

通過微信公衆平臺註冊一個公衆號A,公衆號A就會獲得一個應用唯一標識appId_A

通過微信公衆平臺註冊一個小程序B,小程序B就會獲得一個應用唯一標識appId_B

通過微信開放平臺註冊一個移動應用C,移動應用C就會獲得一個應用唯一標識appId_C

  • openId

微信公衆號和小程序都是在微信公衆平臺管理的,爲了識別用戶,每個微信公衆號或小程序會給用戶生成一個openId。 接着上面的例子說,公司在微信公衆平臺註冊了一個小程序A和一個公衆號B,那麼一個微信用戶A在小程序A和公衆號B的openId分別爲

微信用戶A在公衆號A中的openId爲openId_A

微信用戶A在小程序B中的openId爲openId_B

  • unionId

微信開放平臺是用來管理移動應用, 網站應用,公衆號,第三方應用(給別的公司開發小程序和公衆號)的, 爲了識別不同應用之間用戶的唯一性。微信開放平臺給每個微信用戶生成了唯一的標識unionId。由於這些應用是綁定在開放平臺下的,所以開放平臺還會爲哪些沒有微信用戶openId的應用類型(如移動應用,網站應用)生成openId, 還是套用上面的例子,將appId,openId,unionId串起來就是

微信用戶A在公衆號A (appid_A) 中的身份標識openId是openId_A, unionId是 unionId_A

微信用戶A在小程序B (appid_B) 中的身份標識openId是openId_B, unionId是 unionId_A

微信用戶A在移動應用C(appid_C)中的的身份標識openId是openId_C, unionId是 unionId_A

說到這裏,你可能會比較好奇,移動應用(Android/IOS),網站應用爲什麼要接入微信開放平臺,其實官方的宣傳已經說得清清楚楚,明明白白。看下圖紅框中的文字。 image.png

2. 如何在企業微信中獲取微信用戶的unionId?

2.1 爲什麼要在企業微信中獲取unionId?

前面講了同一個用戶對於同一個微信開放平臺下的不同應用unionid的用途。對於企業微信,也是同理。如果企微中沒有unionid,一個企業有一個小程序,客戶既在微信中使用了,也在企微中使用了,會被認爲是同一企業下的兩個客戶。按照常理, 同一個微信用戶在同一個公司主體下的所有微信生態產品中,身份應該有一個唯一的標識,一個客戶使用了一個企業的微信小程序或是公衆號,又同時添加了企業微信,那麼這個微信客戶在同一個主體企業下的多個小程序和公衆號應用中,不能被認爲是多個客戶。企微中的unionid就是用來標識同一個企微的多個微信小程序和公衆號微信客戶的唯一身份。僅從unionid這一點來說,企業微信相當於一個功能縮小版的微信開放平臺,與微信開發平臺相比,僅支持打通同一個企業主體下的微信小程序與公衆號。

2.2 登陸企微管理後臺,綁定公衆號或微信小程序開發者ID

管理員掃碼登陸企微管理後臺,切換到客戶與上下游tab下,點擊API,會顯示微信開發者ID-綁定操作入口。筆者已經綁定過了,所以顯示的是解除綁定操作按鈕。 image.png

點擊綁定按鈕後,會跳轉到微信公衆平臺要求掃碼進行綁定公衆號。需要注意的是,綁定時必須選擇與企微賬號同主體的公衆號,如果主體未認證或不一致,則會提示無法進行綁定。

2.3 調用服務端--獲取用戶詳情接口

接口文檔路徑: 企業內部開發--服務端API--客戶聯繫--客戶管理--獲取用戶詳情

請求方式: GET(HTTPS
請求地址: https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=ACCESS_TOKEN&external_userid=EXTERNAL_USERID&cursor=CURSOR

返回數據:

 
JSON
複製代碼
{
	"errcode": 0,
	"errmsg": "ok",
	"external_contact":{
        "external_userid":"woAJ2GCAAAXtWyujaWJHDDGi0mACHAAA",
        "name":"李四",
        "position":"Manager",
        "avatar":"http://p.qlogo.cn/bizmail/IcsdgagqefergqerhewSdage/0",
        "corp_name":"騰訊",
        "corp_full_name":"騰訊科技有限公司",
        "type":2,
        "gender":1,
        "unionid":"ozynqsulJFCZ2z1aYeS8h-nuasdAAA",
        "external_profile":{}
    },
    "follow_user":[],
    "next_cursor":"NEXT_CURSOR"
}

獲取unionid的限制條件,客戶必須是微信客戶,第三方不能獲取。 image.png 獲取用戶詳情返回數據中,有我們需要的unionid, 可有一個問題,從接口請求地址可以看出,需要三個參數,其中access_token是公共參數,cursor參數是人數多於500時才需傳值,而外部聯繫人external_userid這個參數,獲取比較費事。

2.4 在企微客戶端調用getCurExternalContact JS-SDK獲取external_userid

所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調用JS-SDK,wx.config需要傳遞的參數signature獲取需要四步:

  1. 使用appId和appSecret獲取access_token;
  2. 使用access_token獲取jsapi_ticket ;
  3. 用時間戳、隨機數、jsapi_ticket和要訪問的url按照簽名算法拼接字符串;
  4. 對第三步的字符串進行SHA1加密,得到簽名。

細節請參考JS-SDK使用權限簽名算法, 這個參數時效性是2小時,一般在後端實現簽名參數邏輯。

 
php
複製代碼
wx.config({
  beta: true,// 有wx.invoke調用形式的jsapi,這個參數要設置成true
  debug: true, // 開啓調試模式,調試通過之後要設置成false。
  appld: 'wwa77dc796ae73feaa', // 必填,企業微信的corpID
  timestamp: '1648630619', // 必填,生成簽名的時間靚
  nonceStr: 'Wm3WZYTPz0wzccnW', // 必填,生成簽名的隨機串
  signature: 'eebbd49ce2470bb8874d9705239fa7e0b45f6ff0', // 必填,簽名,
  jsApiList: ['getCurExternalContact'] // 必填,需要使用的JS接口列表,凡是要調用的接口都需要傳進來
});

通過agentConfig注入自建應用的調用權限,wx.config與wx.agentConfig的簽名計算是不一致的,config參與簽名計算的tikcet獲取接口是https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN,agentconfig參與簽名計算的ticket的獲取接口是https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=ACCESS_TOKEN&type=agent_config,兩個的簽名是不同的。wx.config和wx.agentConfig的其它差別參見 企微官方文檔

 
javascript
複製代碼
wx.agentConfig({
  corpid: 'lwwa77dc796ae73feaa', // 必填,企業微信的corpid,必須與當前登錄的企業一致
  agentid: '1000010', // 必填,企業微信的應用id 
  timestamp: '1648630619', //必填,生成簽名的時間戳
  nonceStr: 'WmSWZYTPzOwzccnW', // 必填,生成簽名的隨機串
  signature: 'be91b8822fIf8525694458714c31eaddelbbd272', // 必填,簽名
  jsApiList: ['getCurExternalContact'], // 必填,傳入需要使用的接口名稱 
  success: function(res){
    callback(res);
  },
  // ...
 });

調用getCurExternalContact獲取外部聯繫人id,需要注意的是,目前支持的入口有限,好在外部單聊工具欄配置的h5應用頁面(如下圖所示)可以使用,通過工作臺進入h5應用頁面無法調用此接口。

image.png

 
ini
複製代碼
wx.invoke('getCurExternalContact', {}, function(res){
  if(res.err_msg == "getCurExternalContact:ok"){
     userId  = res.userId ; //返回當前外部聯繫人userId
  }else {
    /錯誤處理
  }
});

把外部聯繫人externalUserId參數通過接口傳遞給後端,後端去調用企微服務獲取用戶詳情接口,將unionId返回給前端,前端頁面就能判斷這個微信用戶的唯一性了。

參考文獻


作者:去僞存真
鏈接:https://juejin.cn/post/7190306422943383613
來源:稀土掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

 

https://juejin.cn/post/7190306422943383613

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章