在各類管理平台的開發過程中,審核是一個沒法規避的問題。審批問題,不僅要考慮技術實現,還要考慮使用者的使用頻率,易用性。如果使用軟體的公司利用釘釘進行審核,管理系統的審核完全可以考慮接入直接釘釘。話不多說,直接進入實現過程。
建立應用,如果不是做外包業務,選擇企業內部開發即可,選擇小程式按步驟填寫
值得注意的是,要填寫合法的ip位址作為服務位址,該位址會在你的post請求和回呼請求中使用到
#創建成功後,可以需要設定安全域名,開通需要的介面權限,釘子包含微應用的高階權限,看你開發需求選取,就不贅述了。
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; }
審批流發起前,我們需要先到釘釘工作台建立新審批
審批內容依照流程提示完成填寫表單,填寫審批過程即可,這一過程,也可以依靠釘釘的開發接口,直接完成,有需要的朋友可以查看釘釘開發文檔學習。創建完成後,你可以在url內獲取到該審批的processCode和corpId這兩個關鍵訊息,用於審批的後台操作。
建立釘釘核准的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; } } }
接受到釘子的回傳資料如下:
encrypt即為加密過的內容。
透過此類方式,我們可以輕鬆的完成資料和釘子的同步。釘釘還提供的很多其他的人員管理,考勤等功能,有興趣的可以瀏覽官方是文檔學習,值得一提的是官方的文檔對很多功能的接口二次開發的具體實現沒有說明的很清楚,但在附錄中提供了sdk,需要的朋友可以下載學習使用。
以上是tp5利用釘釘進行工作流程審批的詳細內容。更多資訊請關注PHP中文網其他相關文章!