tp5利用釘釘進行工作流審批

在各類管理平臺的開發過程中,審批是一個沒法規避的問題。審批問題,不僅僅要考慮技術實現,還要考慮用戶的使用頻率,易用性。如果使用軟件的公司利用釘釘進行審批考核,管理系統的審批完全可以考慮接入直接釘釘。話不多說,直接進入實現過程。

釘釘權限設置

創建應用,如果不是做外包業務,選擇企業內部開發即可,選擇小程序按步驟填寫

tp5利用釘釘進行工作流審批tp5利用釘釘進行工作流審批

值得注意的是,要填寫合法的ip地址作為服務地址,該地址會在你的post請求和回調請求中使用到

tp5利用釘釘進行工作流審批

創建成功后,可以需要設置安全域名,開通需要的接口權限,釘釘包含微應用的高級權限,看你開發需求選取,就不贅述了。

tp5利用釘釘進行工作流審批

ACCESS_TOKEN的獲取

在你的小程序創建完成后,可以查看到AppKey和AppSecret,利用cURL的get請求,我們可以輕松獲取到ACCESS_TOKEN。ACCESS_TOKEN有效時間為7200秒,可以做用服務器緩存,減少重復請求。

??/** ????*?釘釘access_token獲取 ????*?@param?? ????*?@return?access_token ????*/ ????public?static?function?getAccessToken(){ ????????if(empty(cache('dd_access_token'))){ ????????????$AppKey?=?config('ding_app_key'); ????????????$AppSecret?=?config('ding_app_secret'); ????????????$url?=?"https://oapi.dingtalk.com/gettoken?appkey=".$AppKey."&appsecret=".$AppSecret; ????????????$re?=?file_get_contents($url); ????????????$obj=json_decode($re); ????????????//dump($obj); ????????????$access_token?=?$obj->access_token; ????????????cache('dd_access_token',?$access_token,7200); ????????}else{ ????????????$access_token?=?cache('dd_access_token'); ????????} ????????return?$access_token; ????}

發起審批

審批流發起前,我們需要先到釘釘工作臺創建新審批

tp5利用釘釘進行工作流審批

審批內容按照流程提示完成填寫表單,填寫審批過程即可,這一過程,也可以依靠釘釘的開發接口,直接完成,有需要的朋友可以查看釘釘開發文檔學習。創建完成后,你可以在url內獲取到該審批的processCode和corpId這兩個關鍵信息,用于審批的后臺操作。

tp5利用釘釘進行工作流審批

創建釘釘審批的post請求如下,

?public?function?index() ????{ ????????$access_token?=?ApiService::getAccessToken(); ????????//通過審批創建的url獲得 ????????$data['process_code']?=?'PROC-VFYJYF2V-84X3UYTT455XP7KENI603-0EWMMGTJ-I'; ????????$data['originator_user_id']?=?'093208556229304103'; ????????//部門id ????????$data['dept_id']?=?'105672100'; ????????$form_component_values=array(); ????????$form_component_values[]=['name'=>'單行輸入框','value'=>'123'] ????????$form_component_values[]=['name'=>['開始時間','結束時間'],'value'=>['2019-02-19','2019-02-25']]; ????????$form_component_values[]=['name'=>'圖片','value'=>['http://pic.58pic.com/58pic/15/68/59/71X58PICNjx_1024.jpg','http://img.juimg.com/tuku/yulantu/140218/330598-14021R23A410.jpg']]; ????????$data['form_component_values']?=?$form_component_values; ????????$data=?json_encode($data); ????????$timeout?=?5000; ????????$http_header?=?[ ????????????????'Content-Type:?application/json;' ????????]; ????????$ch?=?curl_init(); ????????curl_setopt?($ch,?CURLOPT_URL,?$token); ????????curl_setopt?($ch,?CURLOPT_POST,?1); ????????curl_setopt?($ch,?CURLOPT_POSTFIELDS,?$data); ????????curl_setopt?($ch,?CURLOPT_HEADER,?false); ????????curl_setopt?($ch,?CURLOPT_HTTPHEADER,$http_header); ????????curl_setopt?($ch,?CURLOPT_SSL_VERIFYPEER,false); ????????curl_setopt?($ch,?CURLOPT_CONNECTTIMEOUT,?$timeout); ????????curl_setopt?($ch,?CURLOPT_RETURNTRANSFER,?1); ????????$result?=?curl_exec($ch); ????????if?(false?===?$result)?{ ????????????$result?=??curl_errno($ch); ????????} ????????curl_close($ch); ????????return?$result; ????}

表單(form_component_values)注意

表單控件采用key/value的形式,其中key是每個控件對應的名字,value可以是普通字符串,也可以是json字符串。http_header選擇’Content-Type: application/json;’當你需要填寫部門的時候,可以使用釘釘自帶的部門下拉組件,傳值傳部門id(dept_id)即可,可以利用獲取部門id接口獲取

回調變更

配置和編寫回調接口,是實現本地數據和釘釘審批數據同步的重要方法。必須要通過回到注冊才能使用。注冊事件回調接口的時候,釘釘服務器會向您“注冊回調接口”時候設置的url(接收回調的url)發起POST請求,用來測試url的合法性。收到消息后,需要返回經過加密后的字符串“success”的json數據,否則釘釘服務器將認為url不合法,居然實現在后面會提到。

????/** ????*?注冊回調 ????*? ????*?@param?? ????*?@return? ????*/ ????public?static?function?register_call_back(){ ????????$token?=?config('ding_token'); ????????$aes_key?=?config('ding_aes_key'); ????????//獲取access_token ????????$token?=?self::getAccessToken(); ????????//注冊url ????????$url?=?"https://oapi.dingtalk.com/call_back/register_call_back?access_token=".$token; ????????//?call_back_tag:需要注冊的內容 ????????//?token:加解密需要用到的token,自定義 ????????//?aes_key:數據加密密鑰。用于回調數據的加密,長度固定為43個字符,從a-z,?A-Z,?0-9共62個字符中選取,您可以隨機生成 ????????//?url:你本地的回調地址,必須是可以外網訪問 ????????$data?=?array('call_back_tag'=>['bpms_task_change','bpms_instance_change'],'token'=>?$token,'aes_key'=>?$aes_key,'url'=>config('ding_callback')); ????????return?self::curl_post($url,$data); ????}? 類似的,你還可以進行回調地址注冊的查詢和內容 ????/** ????*?查詢回調 ????*? ????*?@param?? ????*?@return? ????*/ ????public?static?function?get_call_back(){ ????????$token?=?self::getAccessToken(); ????????$url?=?"https://oapi.dingtalk.com/call_back/get_call_back?access_token=".$token; ????????$re?=?file_get_contents($url); ????????return?$re; ????}? ????/** ????*?更新回調 ????*? ????*?@param?? ????*?@return? ????*/ ????public?static?function?update_call_back(){ ????????$token?=?self::getAccessToken(); ????????$url?=?"https://oapi.dingtalk.com/call_back/update_call_back?access_token=".$token; ????????$data?=?array('call_back_tag'=>['bpms_instance_change'],'token'=>'123456','aes_key'=>'lfqrojwt31jnvdb5li2arj0f1qz4g8g6eqw45swgyak','url'=>config('ding_callback')); ????????return?self::curl_post($url,$data); ????}

在完成注冊后,釘釘就回會在審批的過程事件中訪問我們設置的url地址,后臺開發者可以通過解析過濾推送過來的內容完成本地服務器審批數據同步。

解析數據過程,需要用到加解密庫,釘釘官方提供下載地址如下https://github.com/injekt/openapi-demo-php/tree/master/isv/crypto

回調地址實現? ? ? ?

?public?function?callback(){ ????????????//token和aes_key就是你注冊地址的時填寫的內容 ????????????$token?=?config('ding_token'); ????????????$aes_key?=?config('ding_aes_key'); ????????????//suite_key在內部應用使用CorpId即可,官方文檔沒有明確說明 ????????????$suite_key?=?config('ding_suite_key'); ????????????$signature?=?$_GET["signature"]; ????????????$timeStamp?=?$_GET["timestamp"]; ????????????$nonce?=?$_GET["nonce"]; ????????????$postdata?=?file_get_contents("php://input"); ????????????$postList?=?json_decode($postdata,true); ????????????$encrypt?=?$postList['encrypt']; ????????????//使用官方提供的加解密 ????????????$crypt?=?new?DingtalkCrypt(); ????????????$crypt->DingtalkCrypt($token,?$aes_key,?$suite_key); ????????????$msg?=?""; ????????????$errCode?=?$crypt->DecryptMsg($signature,?$timeStamp,?$nonce,?$encrypt,?$msg); ????????????if?($errCode?!=?0){ ????????????}else{ ????????????????/** ?????????????????*?創建成功后的回調推送 ?????????????????*/ ????????????????$eventMsg?=?json_decode($msg); ????????????????$eventType?=?$eventMsg->EventType; ????????????????/** ?????????????????*?工作流變動 ?????????????????*/ ????????????????if("bpms_instance_change"?===?$eventType){ ????????????????????/** ?????????????????????*?編寫你需要的內容 ?????????????????????*/? ????????????????}??????????? ????????????????$res?=?"success"; ????????????????$encryptMsg?=?""; ????????????????$errCode?=?$crypt->EncryptMsg($res,?$timeStamp,?$nonce,?$encryptMsg); ????????????????if?($errCode?==?0){ ????????????????????echo?$encryptMsg; ????????????????}? ????????????} ????????}

接受到釘釘的返回數據如下:

tp5利用釘釘進行工作流審批

encrypt即為加密過的內容。

總結

通過此類方式,我們可以容易的完成數據和釘釘的同步。釘釘還提供的很多其他的人員管理,考勤等功能,有興趣的可以瀏覽官方是文檔學習,值得一提的是官方的文檔對很多功能的接口二次開發的具體實現沒有說明的很清楚,但是在附錄中提供了sdk,需要的朋友可以下載學習使用。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享