企業微信應用開發那些事
阿新 • • 發佈:2018-12-07
企業微信應用開發那些事
簡介: 本篇博文是針對本人上傳的企業微信PHP-SDK進行講解的,因為當時開發企業微信時,一直沒有找到相關的參考資料,官方提供的PHP-SDK也是存在各種問題,所以在這裡介紹一下自己開發過程中遇到的問題和解決方法,如果問題或異議,歡迎討論
一、SDK修改簡介
1、企業微信的邏輯結構(設計思路)
1) PHP-SDK採用的是DI(依賴注入)容器設計模式構建的,DI可以使得程式碼降低程式碼的耦合度,但是要求開發者對各個功能類都要有一定的瞭解,因為DI容器需要開放者指定物件注入到工具類中,才能呼叫相應的功能方法來實現對應的功能,這樣說比較抽象,來個例項說明一下(以ThinkPHP5框架為例): // 使用者類 class User extends \think\Model // \think\Model是資料庫基類,Tp5的框架原始碼類 { public $name = null; public $sex = null; public $email = null; //構造方法 public function __construct($name = null, $sex = null, $email = null) { $this->name = $name; $this->sex = $sex; $this->email = $email; } // 新增使用者資料 public function addUser() { $data = [ 'username' => $this->name, 'sex' => $this->sex, 'email' => $this->email ]; return $this->insert($data); //add()方法將資料插入資料庫 // $this->insert($data); // 演示示例 2 } } //工具類 class Tool { public $obj = null; public function __construct($object) { $this->obj = $object; } //新增資料庫記錄 public function add() { return $this->obj->addUser(); //新增資料 // $this->obj->addUser(); // 演示示例 2 } } $userObj = new User(); $userObj->name = '王二麻子'; $userObj->sex = '保密'; $userObj->email = '
[email protected]'; $toolObj = new Tool($user); $toolObj->add(); 解釋: 將User類例項化為物件$userObj,併為物件$userObj屬性賦值,再將物件$userObj注入到Tool類中; 此處的Tool類,類似一箇中轉站,只負責傳遞物件,具體的功能仍由物件中的功能方法實現;以上就是一個最簡單的依賴注入模型; 2) 此SDK中, DI(依賴注入)容器 雖然可以降低程式碼耦合度,但是因為每個人使用的習慣問題, 有些人可能會將值通過進行傳遞,而不會在方法中直接return 執行結果,如 演示示例2 所示, 這樣的不足在於,當代碼因發生中斷時,屬性值會丟失,所以可以將一些必要的值進行快取,比如 介面的token值, 就可以快取在redis/memcached, 而不是存放在類的屬性中;
2、企業微信的目錄結構
1) ├─weworkapi │ ├─api 功能介面目錄 │ │ ├─datastructure 功能類目錄 │ │ │ ├─approvaldata OA資料介面 │ │ │ ├─batch 批量資料處理目錄 │ │ │ ├─checkdata 打卡資料目錄1(OA資料子集) │ │ │ ├─checkoption 打卡資料目錄2(OA資料子集) │ │ │ ├─external 外部聯絡人目錄 │ │ │ ├─invoice 電子發票目錄 │ │ │ ├─menu 自建應用主頁選單目錄 │ │ │ ├─message 自建應用訊息目錄 │ │ │ ├─oauth oAuth許可權認證目錄 │ │ │ ├─pay 企業微信支付目錄 │ │ │ ├─servicecrop 第三方服務商功能類 │ │ │ ├─servicecrop 第三方服務商功能類 │ │ │ ├─tag 標籤目錄 │ │ │ ├─user 企業成員目錄 │ │ │ ├─Agent.php 自建應用類 │ │ │ └─Department.php 企業部門類 │ │ ├─examples 測試例子目錄(僅供參考,修改後可能無效) │ │ ├─ src 工具類目錄(類似第一點中結束的Tool類作用) │ │ │ ├─API.php 工具基類 │ │ │ ├─CorpAPI.php 企業工具類 │ │ │ ├─ServiceCorpAPI.php 為服務商開放的介面,使用應用授權的token │ │ │ └─ServiceProviderAPI.php 為服務商開放的介面,使用應用授權的token │ │ │ ├─callback 回撥操作(第三方或服務商回撥的操作) │ │ │ ├─utils 異常類目錄 │ │ ├─Utils.php 公共功能類 │ │ ├─HttpUtils.php 的curl請求http引數處理類 │ │ └─... 其他的都是異常處理類 │ │ │ ├─config.php 除錯配置檔案 │ ├─README.md
3、注意
1) 修改後的PHP-SDK中 部分檔案中有
use \think\Cache;
use \think\Config;
use \think\Request;
這些類均為ThinkPHP5.*中的原始碼基類, 只要使用的是ThinkPHP5.*的框架都不會出錯,但是這些檔案中的配置需要自行新增,
A) 如本人使用的cache是redis 需要在 /application/config.php 的 cache配置中新增redis的配置資訊;
B) SDK 中有很多處載入過Config::get('wework') , 或Config::get('wework.CORP_ID');
是在config.php中添加了企業微信配置資訊(二維陣列)
'wework' => [
'CORP_ID' => '你的企業ID',
'CORP_SECRET' => '你的企業微信SECRET', // 有讀寫許可權的secret
'CORP_EXTERNAL_SECRET' => '只讀許可權的SECRET', //外部聯絡人介面使用的是隻讀許可權的secret
];
二、遇到的問題及解決方案
1) 部分程式碼出錯
A) 問題: 修改前的PHP-SDK中的Untils中有些判斷 $val == null , 導致 to_invite = false 時失效(to_invite是否邀請外部成員加入企業微信)
B) 解決方案: 使用 $valu === null 判斷, 目前已修正
2) 介面呼叫過程不清晰問題
A) 問題: 無法監控企業微信介面呼叫的情況
B)解決方法: 在企業微信介面呼叫時,將呼叫記錄寫入日誌表,目前記錄呼叫日誌的程式碼已植入/weworkapi/api/src/API.php中_addApiLogs 方法, 只需根據_addApiLogs方法的鍵名作為欄位,在資料建立一個日誌表即可
3) token和呼叫頻次的處理
A) 因為token都有時效性,一般token有效期為7200秒,且系統會限制token的呼叫頻次(限制閾值,如: 獲取token介面呼叫次數不得超過 20次/天)
B) 這個問題是出於個人建議,因為時間關係,目前還沒有在SDK實踐,就是將SDK中的access_token,provider_token,等存入快取中,(目前SDK是將這些token的值都存放在屬性中),這時token值存入快取明顯更穩定了
C) 不僅是token, 包括SDK中還涉及到獲取JS-SDK的ticket和 jsApiTicket 等值,ticket值和jsApiTicket都和token類似,因此可以考慮使用快取記錄ticket值和jsApiTicket,並設定快取有效期; 其實涉及到呼叫頻次限制的問題,都可以考慮快取進行解決
4) 另外還需注意一個重要問題,企業微信的介面呼叫次數,資料處理量也有嚴格的限制,具體請參照企業微信官方文件,
三、總結
1) SDK修改前後對比:
A) 修改前: 原SDK是以面向過程的思維處理的,可直接通過include 檔案進行呼叫,無法再框架中直接使用
B) 修改後: 依據PSR規範對部分程式碼進行修改, SDK的結構遵循Tp5的目錄格式(即PSR規範)
2) 除錯工具
1) 這一點官方文件也有,但是光從文字上很難理解,工具檔名為 devtools_resources.pak
2) 安裝方法: 將devtools_resources.pak 檔案下載到本地,並將此檔案放入企業微信安裝包路徑的根目錄下,也就是對應的版本目錄下,並重啟企業微信客戶端生效
3) 使用方法:
4) 注意:
A) 問題: 檔案按 2) 中步驟操作完後,有時按照 3) 步驟 開啟除錯工具,會發現除錯工具頁面一片空白,
B) 原因: 這說明devtools_resources.pak 檔案丟失了, 常發生在企業微信客戶端版本升級,因為升級時,舊版本號對應目錄會被清空,同時devtools_resources.pak檔案也被刪除了
C) 本地自行備份,企業微信客戶端升級後,只需將devtools_resources.pak檔案重新放入最新的版本號目錄根目錄下(建議下載完devtools_resources.pak檔案後,自行備份devtools_resources.pak檔案)
5) 下載地址: 可以到本人的上載資源中下載(老弟學習也需要下載一些積分的資源,多包涵)
3) 最後,因為目前開發暫未涉及到SDK所有內容,可能有些地方的bug還沒發現, 目前本人親試過的幾塊內容有: 外部聯絡人模組 /weworkapi/api/datastructure/external, 應用訊息傳送模組 /weworkapi/api/datastructure/message (目前實現了圖文型別,文字型別親測有用), 應用選單模組 /weworkapi/api/datastructure/menu 等