1. 程式人生 > >企業微信應用開發那些事

企業微信應用開發那些事

企業微信應用開發那些事

簡介: 本篇博文是針對本人上傳的企業微信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 等