亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解nodejs 開發企業微信第三方應用入門教程

2024-05-06 16:49:01
字體:
來源:轉載
供稿:網友

最近公司要開發企業微信端的 Worktile,以前做的是企業微信內部應用,所以只適用于私有部署客戶,而對于公有云客戶就無法使用,所有就準備開發企業微信的第三方應用,本文主要介紹在調研階段遇到的山珍海味。

開發之前你需要前注冊為第三方服務商,然后用第三方服務商的賬號創建應用,創建之后只需要管理員授權應用,第三方服務商即可為用戶提供服務。

一、注冊第三發服務商

登陸 服務商官網 ,注冊成為服務商,并登陸服務商管理后臺。

二、配置開發信息

在創建應用之前,首先要配置好通用開發參數

nodejs,企業微信,第三方應用

在填寫系統事件接收 url 時,要正確響應企業微信驗證 url 的請求。這個可以參考企業微信后臺,自建應用的接收消息的 api 設置。

在企業的管理端后臺,進入需要設置接收消息的目標應用,點擊“接收消息”的“設置API接收”按鈕,進入配置頁面。

nodejs,企業微信,第三方應用

要求填寫應用的 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

 

參數 說明
msg_signature 企業微信加密簽名,msg_signature 結合了企業填寫的 token、請求中的 timestamp、nonce 參數、加密的消息體
timestamp 時間戳
nonce 隨機數
echostr 加密的字符串。需要解密得到消息內容明文,解密后有random、msg_len、msg、receiveid 四個字段,其中 msg 即為消息內容明文

 

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 驗證失敗的問題,解決思路是借助微信企業號 接口調試工具

三、創建應用

nodejs,企業微信,第三方應用

四、測試應用

應用創建成功后,服務商可以授權 10 個測試企業

nodejs,企業微信,第三方應用

從企業微信應用市場發起授權時,企業微信給剛才應用設置的 指令回調 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');});

測試應用注意事項

  1. 用于安裝測試的企業微信帳號需服務商自行注冊,每個應用支持同時添加 10 個測試企業微信賬號
  2. 安裝測試的企業微信帳號使用的是當前的應用配置信息,后續的修改不會進行同步;如需更新應用信息請重新授權安裝
  3. 同一企業微信帳號,不支持同時安裝測試應用和正式發布的應用

五、應用上線

已認證企業微信的服務商,可進入應用管理—點擊提交上線—勾選應用—提交上線。

六、用戶網頁授權登錄

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

 

參數 必須 說明
appid 第三方應用 id(即 ww 或 wx 開頭的 suite_id)。注意與企業的網頁授權登錄不同
redirect_uri 授權后重定向的回調鏈接地址,請使用 urlencode 對鏈接進行處理 ,注意域名需要設置為第三方應用的可信域名
response_type 返回類型,此時固定為:code
scope 應用授權作用域。snsapi_base:靜默授權,可獲取成員的基礎信息(UserId與DeviceId);snsapi_userinfo:靜默授權,可獲取成員的詳細信息,但不包含手機、郵箱等敏感信息;snsapi_privateinfo:手動授權,可獲取成員的詳細信息,包含手機、郵箱等敏感信息。
state 重定向后會帶上 state 參數,企業可以填寫 a-zA-Z0-9 的參數值,長度不可超過 128 個字節
#wechat_redirect 終端使用此參數判斷是否需要帶上身份信息

 

nodejs,企業微信,第三方應用

企業員工點擊后,頁面將跳轉至 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

 

參數 必須 說明
access_token 第三方應用的 suite_access_token,參見“獲取第三方應用憑證”
code 通過成員授權獲取到的 code,最大為 512 字節。每次成員授權帶上的 code 將不一樣,code 只能使用一次,5 分鐘未被使用自動過期。

 

 6.2.1 獲取第三方應用的 suite_access_token

請求方式:POST(HTTPS)

請求地址: https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token

 

參數 是否必須 說明
suite_id 以 ww 或 wx 開頭應用 id(對應于舊的以 tj 開頭的套件 id)
suite_secret 應用 secret
suite_ticket 企業微信后臺推送的 ticket

 

由于第三方服務商可能托管了大量的企業,其安全問題造成的影響會更加嚴重,故 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。

nodejs,企業微信,第三方應用

6.3 獲取用戶敏感信息

請求方式:POST(HTTPS)

請求地址: https://qyapi.weixin.qq.com/cgi-bin/service/getuserdetail3rd?access_token=SUITE_ACCESS_TOKEN

{  "user_ticket": "USER_TICKET"}

 

參數 必須 說明
access_token 第三方應用的 suite_access_token,參見“獲取第三方應用憑證”
user_ticket 成員票據

 

返回結果:

{  "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"}

七、用戶授權成功

首頁

nodejs,企業微信,第三方應用

詳情頁

nodejs,企業微信,第三方應用

八、給用戶發消息

我們可以給推送文本、圖片、視頻、文件、圖文等類型。

請求方式:POST(HTTPS)

請求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN

推送的時候需要 access_token 和 應用的 agentId,第三方服務商,可通過接口 獲取企業授權信息 獲取該參數值,其實可以直接通過獲取企業永久授權碼 直接取到這兩個值。

在我們測試安裝應用成功之后,企業微信會 post 一條請求給指令回調 URL,通過上面的解密方式,可以解析到 xml 中的 auth_code

nodejs,企業微信,第三方應用

然后通過 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 就可以愉快的給用戶發送消息了。

nodejs,企業微信,第三方應用

當點擊鏈接時,可以跳到指定任務或者日程等,只不過返回時還是在企業微信的消息模塊,并不能自動打開第三方應用,客服回復不支持這么做。

九、注意事項

api 可能有時效性,如有差異,以官方 api 為準。

完整 demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品中文字幕在线观看| 亚洲最大福利视频| 亚洲自拍偷拍区| 亚洲理论在线a中文字幕| 日韩精品在线观看网站| 久久久视频精品| 亚洲女同精品视频| 亚洲a∨日韩av高清在线观看| 久久躁日日躁aaaaxxxx| 久久男人的天堂| 91久久久久久久久| 中文字幕亚洲综合久久筱田步美| 69av在线视频| 亚洲最大的成人网| 91国语精品自产拍在线观看性色| 亚洲成年人在线| 亚洲电影免费观看高清完整版在线| 精品久久久久久久大神国产| 欧美大全免费观看电视剧大泉洋| 自拍偷拍免费精品| 欧美精品www在线观看| 国产视频久久久久| 亚洲福利小视频| 7777kkkk成人观看| 国产精品视频99| 亚洲图片制服诱惑| 久久久久久亚洲精品中文字幕| 精品久久久久久国产91| 亚洲电影免费观看高清完整版在线观看| 欧美孕妇毛茸茸xxxx| 国产精品久久久久久影视| 91沈先生在线观看| 亚洲18私人小影院| 亚洲理论在线a中文字幕| 亚洲国产日韩欧美在线99| 日韩美女av在线免费观看| 亚洲香蕉av在线一区二区三区| 国产在线拍偷自揄拍精品| 国产偷国产偷亚洲清高网站| 久久精品电影网| 日韩欧美综合在线视频| 国产欧亚日韩视频| 国产精品海角社区在线观看| 亚洲精品在线观看www| 欧美—级a级欧美特级ar全黄| 日韩av在线直播| 成人免费高清完整版在线观看| 亚洲午夜久久久影院| 岛国av一区二区| 亚洲视频综合网| 亚洲视频在线观看免费| 国产日产欧美a一级在线| 欧美最猛性xxxxx免费| 国产在线视频91| 亚洲欧美精品中文字幕在线| 欧美一级片一区| 成年无码av片在线| 精品国产福利在线| 欧美福利小视频| 午夜精品久久久久久99热软件| 2020久久国产精品| 亚洲最新av在线网站| 中文字幕av日韩| 青草成人免费视频| 国产精品久久久久久久久久东京| 日韩亚洲精品视频| 国产免费成人av| 久久久视频精品| 国产精品青青在线观看爽香蕉| 欧美性猛交xxxxx水多| 欧美激情女人20p| 国产视频一区在线| 国产精品电影网站| 亚洲欧美一区二区三区在线| 欧洲亚洲免费在线| 国产精品网站视频| 国产精品福利在线观看网址| 最新日韩中文字幕| 久久人人爽国产| 国产一区二区在线免费视频| 日韩极品精品视频免费观看| 91在线视频导航| 91精品国产91久久| 日韩av男人的天堂| 亚洲欧美中文另类| 国产精品视频一| 国产精品18久久久久久首页狼| 日本国产一区二区三区| 欧美激情在线有限公司| 久久视频精品在线| 欧美裸体男粗大视频在线观看| 性欧美在线看片a免费观看| 国产精品一区二区三| 国产成人精品综合| 久久久久www| 最近2019年日本中文免费字幕| 亚洲人成网站色ww在线| 97香蕉超级碰碰久久免费软件| 亚洲国产日韩欧美在线动漫| 日本精品久久久久久久| 欧美国产高跟鞋裸体秀xxxhd| 精品国产乱码久久久久久虫虫漫画| 欧美电影在线观看高清| 成人网在线观看| 日韩精品亚洲元码| 日韩欧美视频一区二区三区| 国产一区二区三区免费视频| 九九久久久久久久久激情| 中文日韩在线视频| 国模吧一区二区三区| 一区国产精品视频| 亚洲国产又黄又爽女人高潮的| 欧美大尺度在线观看| 日韩视频在线免费观看| 久久精品99无色码中文字幕| 欧美壮男野外gaytube| 亚洲欧美另类国产| 日韩精品在线看| 亚洲码在线观看| 国产一区二区三区在线视频| 欧美国产极速在线| 亚洲福利视频久久| 国产精品久久婷婷六月丁香| 91精品久久久久久久久不口人| 日本一本a高清免费不卡| 亚洲性线免费观看视频成熟| 国产精品入口免费视| 精品久久中文字幕| 亚洲欧美日韩久久久久久| 亚洲视频在线观看免费| 国产精自产拍久久久久久蜜| 久久精品成人动漫| 国产欧美在线观看| 91精品国产九九九久久久亚洲| 亚洲偷欧美偷国内偷| 欧美午夜无遮挡| 国产精品入口日韩视频大尺度| 国产欧美婷婷中文| 国产精品久久久久久久久久久久久| 性欧美xxxx| 国外成人在线视频| 欧美日本黄视频| 亚洲国产精品久久91精品| 国产成人亚洲综合91精品| 爱福利视频一区| 亚洲直播在线一区| 欧美在线视频播放| 日韩国产精品亚洲а∨天堂免| 欧美—级a级欧美特级ar全黄| 日韩精品视频免费专区在线播放| 欧美另类99xxxxx| 亚洲精品日韩在线| 日本精品性网站在线观看| 日韩女优人人人人射在线视频| 成人a级免费视频| 亚洲精品之草原avav久久| 最近2019年中文视频免费在线观看| 亚洲娇小xxxx欧美娇小| 亚洲free性xxxx护士白浆| 日韩激情视频在线| 成人免费福利视频| 久久综合久中文字幕青草| 日韩有码在线视频| 国产成人啪精品视频免费网|