最近公司要開發企業微信端的 Worktile,以前做的是企業微信內部應用,所以只適用于私有部署客戶,而對于公有云客戶就無法使用,所有就準備開發企業微信的第三方應用,本文主要介紹在調研階段遇到的山珍海味。
開發之前你需要前注冊為第三方服務商,然后用第三方服務商的賬號創建應用,創建之后只需要管理員授權應用,第三方服務商即可為用戶提供服務。
一、注冊第三發服務商
登陸服務商官網,注冊成為服務商,并登陸服務商管理后臺。
二、配置開發信息
在創建應用之前,首先要配置好通用開發參數
在填寫系統事件接收 url 時,要正確響應企業微信驗證 url 的請求。這個可以參考企業微信后臺,自建應用的接收消息的 api 設置。
在企業的管理端后臺,進入需要設置接收消息的目標應用,點擊“接收消息”的“設置API接收”按鈕,進入配置頁面。
要求填寫應用的 URL、Token、EncodingAESKey 三個參數
- URL 是企業后臺接收企業微信推送請求的訪問協議和地址,支持 http 或 https 協議(為了提高安全性,建議使用 https)。
- Token 可由企業任意填寫,用于生成簽名。
- EncodingAESKey 用于消息體的加密,是 AES 密鑰的 Base64 編碼。
2.1 驗證 url 有效性
當點擊保存的時候,企業微信會發生一條 get 請求到填寫的 url
比如 url 設置的是https://api.worktile.com, 企業微信將發送如下驗證請求:
請求地址:https://api.worktile.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS×tamp=13500001234&nonce=123412323&echostr=ENCRYPT_STR
2.1.1 通過參數 msg_signature 對請求進行校驗
首先要把剛才配置時隨機生成的 token, timestamp, nonce, msg_encrypt 進行 sha1 加密,這里我們可以直接使用 npm 模塊 sha1 進行加密,然后判斷得到的 str 是否和 msg_signature 相等。
function sha1(str) { const md5sum = crypto.createHash(\’sha1\’); md5sum.update(str); const ciphertext = md5sum.digest(\’hex\’); return ciphertext;}function checkSignature(req, res, encrypt) { const query = req.query; console.log(\’Request URL: \’, req.url); const signature = query.msg_signature; const timestamp = query.timestamp; const nonce = query.nonce; let echostr; console.log(\’encrypt\’, encrypt); if (!encrypt) { echostr = query.echostr; } else { echostr = encrypt; } console.log(\’timestamp: \’, timestamp); console.log(\’nonce: \’, nonce); console.log(\’signature: \’, signature); // 將 token/timestamp/nonce 三個參數進行字典序排序 const tmpArr = [token, timestamp, nonce, echostr]; const tmpStr = sha1(tmpArr.sort().join(\’\’)); console.log(\’Sha1 String: \’, tmpStr); // 驗證排序并加密后的字符串與 signature 是否相等 if (tmpStr === signature) { // 原樣返回echostr參數內容 const result = _decode(echostr); console.log(\’last\’, result); console.log(\’Check Success\’); return result; } else { console.log(\’Check Failed\’); return \’failed\’; }}
2.1.2 解密 echostr 得到 msg 并返回
密文解密過程:
- 對剛才生成的 AESKey 進行 base64 解碼
const EncodingAESKey = \’21IpFqj8qolJbaqPqe1rVTAK5sgkaQ3GQmUKiUQLwRe\’;let aesKey = Buffer.from(EncodingAESKey \’=\’, \’base64\’);
- 對 AESKey 進行 aes-256-cbc 解密
function _decode(data) { let aesKey = Buffer.from(\’21IpFqj8qolJbaqPqe1rVTAK5sgkaQ3GQmUKiUQLwRe\’ \’=\’, \’base64\’); let aesCipher = crypto.createDecipheriv(\”aes-256-cbc\”, aesKey, aesKey.slice(0, 16)); aesCipher.setAutoPadding(false); let decipheredBuff = Buffer.concat([aesCipher.update(data, \’base64\’), aesCipher.final()]); decipheredBuff = PKCS7Decoder(decipheredBuff); let len_netOrder_corpid = decipheredBuff.slice(16); let msg_len = len_netOrder_corpid.slice(0, 4).readUInt32BE(0); const result = len_netOrder_corpid.slice(4, msg_len 4).toString(); return result; // 返回一個解密后的明文-}function PKCS7Decoder (buff) { var pad = buff[buff.length – 1]; if (pad < 1 || pad > 32) { pad = 0; } return buff.slice(0, buff.length – pad);}
- 然后返回 result 即可
res.end(result);
2.2 回調 url 驗證失敗問題
驗證 URL 時,經常會碰到 URL 驗證失敗的問題,解決思路是借助微信企業號接口調試工具
三、創建應用
四、測試應用
應用創建成功后,服務商可以授權 10 個測試企業
從企業微信應用市場發起授權時,企業微信給剛才應用設置的指令回調 url 發送一個 post 請求,比如:
https://api.worktile.com/worktile?msg_signature=b99605616153ffbfbe6ebbb500bd211e67ed714d×tamp=1551076894&nonce=1551709703,直接返回成功即可。
各個事件的回調,服務商在收到推送后都必須直接返回字符串 “success”,若返回值不是 “success”,企業微信會把返回內容當作錯誤信息。
app.post(\’/worktile\’, function (req, res) { console.log(\’req.body\’, req.body); res.send(\’success\’);});
測試應用注意事項
- 用于安裝測試的企業微信帳號需服務商自行注冊,每個應用支持同時添加 10 個測試企業微信賬號
- 安裝測試的企業微信帳號使用的是當前的應用配置信息,后續的修改不會進行同步;如需更新應用信息請重新授權安裝
- 同一企業微信帳號,不支持同時安裝測試應用和正式發布的應用
五、應用上線
已認證企業微信的服務商,可進入應用管理—點擊提交上線—勾選應用—提交上線。
六、用戶網頁授權登錄
6.1 構造第三方應用網頁授權鏈接
如果第三方應用需要在打開的網頁里面攜帶用戶的身份信息,第一步需要構造如下的鏈接來獲取 code:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
企業員工點擊后,頁面將跳轉至 redirect_uri?code=CODE&state=STATE,第三方應用可根據 code 參數獲得企業員工的 corpid 與 userid。code 長度最大為 512 字節。
6.2 獲取訪問用戶身份
請求方式:GET(HTTPS)
請求地址:https://qyapi.weixin.qq.com/cgi-bin/service/getuserinfo3rd?access_token=SUITE_ACCESS_TOKEN&code=CODE
6.2.1 獲取第三方應用的 suite_access_token
請求方式:POST(HTTPS)
請求地址: https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token
由于第三方服務商可能托管了大量的企業,其安全問題造成的影響會更加嚴重,故 API 中除了合法來源 IP 校驗之外,還額外增加了 suite_ticket 作為安全憑證。
獲取 suite_access_token 時,需要 suite_ticket 參數。suite_ticket 由企業微信后臺定時推送給“指令回調 URL”,每十分鐘更新一次,見推送 suite_ticket。
suite_ticket 實際有效期為 30 分鐘,可以容錯連續兩次獲取 suite_ticket 失敗的情況,但是請永遠使用最新接收到的 suite_ticket。
通過本接口獲取的 suite_access_token 有效期為 2 小時,開發者需要進行緩存,不可頻繁獲取。
6.2.2 獲取推送 suite_ticket
企業微信服務器會定時(每十分鐘)推送 ticket。ticket 會實時變更,并用于后續接口的調用。
請求方式:POST(HTTPS)
請求地址:https://api.ninesix.cc/worktile?msg_signature=87276aaf15a13e1eb2ebb6d93732ca668c3ddef8×tamp=1551850300&nonce=1551051655
在發生授權、通訊錄變更、ticket 變化等事件時,企業微信服務器會向應用的“指令回調 URL”推送相應的事件消息,nodejs 接收到的是 xml,解析后拿到 encrypt 字段,然后使用上面配置通用開發參數的 url 時用的解密方式,就可以得到 suite_ticket。
6.3 獲取用戶敏感信息
請求方式:POST(HTTPS)
請求地址:https://qyapi.weixin.qq.com/cgi-bin/service/getuserdetail3rd?access_token=SUITE_ACCESS_TOKEN
返回結果:{ \”errcode\”: 0, \”errmsg\”: \”ok\”, \”corpid\”: \”wwxxxxxxyyyyy\”, \”userid\”: \”lisi\”, \”name\”: \”李四\”, \”mobile\”: \”15913215421\”, \”gender\”: \”1\”, \”email\”: \”xxx@xx.com\”, \”avatar\”: \”http://shp.qpic.cn/bizmp/xxxxxxxxxxx/0\”, \”qr_code\”: \”https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=vcfc13b01dfs78e981c\”}
七、用戶授權成功
首頁
詳情頁
八、給用戶發消息
我們可以給推送文本、圖片、視頻、文件、圖文等類型。
請求方式:POST(HTTPS)
請求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
推送的時候需要 access_token 和 應用的 agentId,第三方服務商,可通過接口 獲取企業授權信息 獲取該參數值,其實可以直接通過 獲取企業永久授權碼直接取到這兩個值。
在我們測試安裝應用成功之后,企業微信會 post 一條請求給指令回調 URL,通過上面的解密方式,可以解析到 xml 中的 auth_code
然后通過https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token=SUITE_ACCESS_TOKEN和 auth_code 可以獲取到 access_token 和 agentId,返回的 agent 是一個數組,但僅舊的多應用套件授權時會返回多個agent,對新的單應用授權,永遠只返回一個 agent。
再通過 access_token 和 agentId 就可以愉快的給用戶發送消息了。
當點擊鏈接時,可以跳到指定任務或者日程等,只不過返回時還是在企業微信的消息模塊,并不能自動打開第三方應用,客服回復不支持這么做。
九、注意事項
- api 可能有時效性,如有差異,以 官方 api 為準。
- 完整 demo
文章來自Worktile官方博客,點擊【了解更多】查看更多優質文章
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。