ホームページ > 記事 > PHPフレームワーク > tp5 はワークフローの承認に DingTalk を使用します
さまざまな管理プラットフォームの開発プロセスにおいて、承認は避けられない問題です。承認の問題では、技術的な実装だけでなく、使用頻度やユーザーの使いやすさも考慮する必要があります。ソフトウェアを使用している企業が承認と評価に DingTalk を使用している場合、承認管理システムは DingTalk に直接接続されていると考えることができます。早速、実装プロセスに入りましょう。
アプリケーションを作成します。アウトソーシング事業を行っていない場合は、会社の内部開発を選択してください。ミニ プログラムを選択し、手順を入力します。
サービス アドレスとして有効な IP アドレスを入力する必要があることに注意してください。このアドレスはポスト リクエストとコールバック リクエストで使用されます
作成が成功したら、安全なドメイン名を設定し、必要なインターフェイス権限をアクティブ化できます。DingTalk には、マイクロアプリケーション用の高度な権限が含まれています。これは開発のニーズに依存するため、ここでは説明しません詳細に入ります。
ACCESS_TOKEN の取得
アプレットが作成されると、AppKey と AppSecret が表示され、curl の get リクエストを使用して簡単に取得できます。アクセストークン。 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; }
承認フローを開始する前に、DingTalk ワークベンチに移動して新しい承認を作成する必要があります
承認内容はプロセスに従います フォームに記入して承認プロセスに記入するよう求められます。このプロセスは、DingTalk の開発インターフェイスを利用して直接完了することもできます。必要な友人は、DingTalk の開発ドキュメントから学ぶことができます。作成が完了すると、承認のバックグラウンド操作に使用される、URL 内の承認 processCode と corpId の 2 つの重要な情報を取得できます。
次のように DingTalk 承認の投稿リクエストを作成します。
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)
# に注意してください。 ## フォームコントロール キー/値の形式を採用します。キーは各コントロールに対応する名前で、値は通常の文字列または JSON 文字列です。 http_header selects 'Content-Type: application/json;' 部門を入力する必要がある場合は、DingTalk 独自の部門ドロップダウン コンポーネントを使用して、部門 ID (dept_id) を値で渡すことができます。部門 ID の取得インターフェイスを使用できます。##コールバックの変更
/** * 注册回调 * * @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); }
登録が完了すると、DingTalk は承認プロセス イベント中に設定した URL アドレスにアクセスします。バックエンド開発者は、プッシュされたコンテンツを解析してフィルタリングすることで、ローカル サーバーの承認データの同期を完了できます。
データの解析プロセスには暗号化ライブラリと復号化ライブラリの使用が必要です。DingTalk の公式ダウンロード アドレスは次のとおりです
https://github.com/injekt/openapi-demo-php/tree/master/ isv/cryptopublic 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; } } }
DingTalk から受信した戻りデータは次のとおりです。
encrypt は暗号化されたコンテンツ。
概要
以上がtp5 はワークフローの承認に DingTalk を使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。