背景
爲其他公司開發一個小程序,這個小程序要只能在企業微信裏面訪問,不能通過普通微信訪問。
企業微信裏只有授權的用戶可以使用該小程序。
之所以要整理這樣一個流程,是因爲微信那邊的文檔太分散了,亂七八糟的,我也是花了很長時間才把這個流程理順。
問題分析
首先,這裏面需要解決幾個問題:
1、只在企業微信裏使用,不能在普通小程序使用
判斷當前運行環境
2、只有授權的用戶可以使用該小程序
權限校驗
1:普通微信,使用賬號+密碼登陸,審覈專用,可限制賬號權限
2:企業微信,校驗企業id,校驗用戶id,有權限的才允許使用
3、控制搜索
在小程序管理後臺設置「不允許被搜索」
4、控制分享
小程序裏面關閉分享
OK,做到以上幾點,就實現了只有企業微信裏授權的用戶,才能夠在企業微信的 工作臺
看到該小程序。
處理流程
好,既然問題已經明確了,那我們就搞起。
1、小程序基礎功能開發,提交審覈
對,沒看錯,先提交審覈,因爲只有審覈通過的小程序才能被企業微信綁定。所以,先把小程序的基礎功能做出來,可以限制一部分功能,總之,就是先讓這個小程序上架。同時,在小程序的管理後臺設置「不允許被搜索」,避免不必要的麻煩。
2、企業微信關聯小程序
進入企業微信後臺 -> 應用管理 -> 小程序 -> 關聯小程序,然後使用小程序管理員的微信掃碼,按照指引操作即可。
3、獲取關聯小程序的 Secret,設置可見範圍
上一步的小程序頁面會出現剛纔關聯的小程序,點擊進入,然後就看到 secret 及可見範圍。
這個 secret 相當於該小程序訪問該企業微信數據的令牌,請妥善保存。
可見範圍就是授權,哪些用戶能看到這個小程序,被設置可見的人將會在自己企業微信的工作臺看到該小程序。
4、修改小程序
好了,到重頭戲了。
4.1、判斷運行環境
小程序需要判斷當前的運行環境(普通微信 or 企業微信),需要判斷使用當前小程序的用戶是否有權限使用。
var isWxWork = false;
wx.getSystemInfo({
success(res) {
console.log(res.environment);
isWxWork = res.environment == 'wxwork';
if (!isWxWork) {
// 當前環境不是企業微信,怎麼處理你隨便
return;
}
// 當前環境是企業微信,執行登陸,獲取用戶 code,用於後面的權限校驗
wx.qy.login({
success: function (res) {
if (res.code) {
console.log(res.code);
// 這裏可以將 res.code 通過請求發送給後臺,讓後臺做權限校驗
} else {
console.log('登錄失敗!' + res.errMsg);
}
}
});
}
})
4.2、權限校驗
後臺需要調用以下幾個接口來進行權限校驗。
1、獲取 access_token
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=xxxx&corpsecret=xxxx
請求方式:GET
這個接口和普通微信獲取 token 的方法類似。
其中,corpid
在企業微信管理後臺->我的企業->企業信息->企業ID;corpsecret
就是我們上一步關聯小程序後獲取的 secret。
返回內容如下:
{
"errcode": 0,
"errmsg": "ok",
"access_token": "xxxxxx",
"expires_in": 7200
}
2、獲取 userid
https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token=xxx&js_code=xxx&grant_type=authorization_code
請求方式:GET
其中,access_token
是我們前一步 gettoken 獲取到的;js_code
是前面判斷運行環境時獲取到的 res.code
;grant_type
固定傳 authorization_code
返回內容如下:
{
"userid": "bottle",
"session_key": "xxxxx",
"corpid": "xxxxxx",
"deviceid": "xxxxxx",
"errcode": 0,
"errmsg": "ok"
}
這裏的 corpid
可以用來初步校驗當前用戶是否有權限,因爲無論哪個公司的人,只要他用企業微信,使用這個小程序,都會返回這樣的結果,你需要根據 corpid
是否是你授權的企業的ID來校驗,如果不是,直接返回無權限就可以,不用進行下一步。
當然 corpid
也可以用於處理一個小程序關聯多家公司的情況,不過這是另一個問題了。這裏簡單提一嘴,因爲是給其他公司開發的小程序,所以我們這個小程序也關聯了兩個企業,一個我們公司,一個對方公司,這樣也方便我們測試,只需要給我們自己的測試人員授權就可以讓他們使用完全相同的環境進行測試了。
3、獲取用戶信息(判斷權限)
https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=xxx&userid=xxx
請求方式:GET
其中,access_token
是我們前一步 gettoken 獲取到的;userid
就是我們上一步獲取到的 userid
。
返回內容如下:
- 有權限
{
"errcode": 0,
"errmsg": "ok",
"userid": "xxx",
"name": "xxx",
"department": [],
"position": "",
"mobile": "xxx",
"gender": "2",
"email": "",
"avatar": "http://p.qlogo.cn/bizmail/xxx/0",
"status": 1,
"isleader": 0,
"extattr": {
"attrs": []
},
"telephone": "",
"enable": 1,
"hide_mobile": 0,
"order": [],
"qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx",
"alias": "",
"is_leader_in_dept": []
}
- 無權限
{
"errcode": 60011,
"errmsg": "no privilege to access/modify contact/party/agent , hint: [1564556097_7_8d45297bd21be3702ff430560e1f0652], from ip: 118.113.1.217, more info at https://open.work.weixin.qq.com/devtool/query?e=60011",
"department": [],
"order": [],
"is_leader_in_dept": []
}
OK,後面根據有權限還是無權限,執行不同的操作就可以了,這裏不再贅述。
參考資料
企業微信API(小程序):https://work.weixin.qq.com/api/doc#90000/90136/90289
企業微信接口調試工具:https://work.weixin.qq.com/api/devtools/devtool.php