ホームページ  >  記事  >  PHPフレームワーク  >  tp5 はワークフローの承認に DingTalk を使用します

tp5 はワークフローの承認に DingTalk を使用します

发呆的路
发呆的路オリジナル
2020-05-07 14:45:156731ブラウズ

さまざまな管理プラットフォームの開発プロセスにおいて、承認は避けられない問題です。承認の問題では、技術的な実装だけでなく、使用頻度やユーザーの使いやすさも考慮する必要があります。ソフトウェアを使用している企業が承認と評価に DingTalk を使用している場合、承認管理システムは DingTalk に直接接続されていると考えることができます。早速、実装プロセスに入りましょう。

DingTalk 権限設定

アプリケーションを作成します。アウトソーシング事業を行っていない場合は、会社の内部開発を選択してください。ミニ プログラムを選択し、手順を入力します。

tp5 はワークフローの承認に DingTalk を使用しますtp5 はワークフローの承認に DingTalk を使用します

サービス アドレスとして有効な IP アドレスを入力する必要があることに注意してください。このアドレスはポスト リクエストとコールバック リクエストで使用されます

tp5 はワークフローの承認に DingTalk を使用します

作成が成功したら、安全なドメイン名を設定し、必要なインターフェイス権限をアクティブ化できます。DingTalk には、マイクロアプリケーション用の高度な権限が含まれています。これは開発のニーズに依存するため、ここでは説明しません詳細に入ります。

tp5 はワークフローの承認に 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 ワークベンチに移動して新しい承認を作成する必要があります

tp5 はワークフローの承認に DingTalk を使用します

承認内容はプロセスに従います フォームに記入して承認プロセスに記入するよう求められます。このプロセスは、DingTalk の開発インターフェイスを利用して直接完了することもできます。必要な友人は、DingTalk の開発ドキュメントから学ぶことができます。作成が完了すると、承認のバックグラウンド操作に使用される、URL 内の承認 processCode と corpId の 2 つの重要な情報を取得できます。

tp5 はワークフローの承認に DingTalk を使用します

次のように 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 の取得インターフェイスを使用できます。

##コールバックの変更

コールバック インターフェイスの構成と作成は、ローカル データと DingTalk 承認データの同期を実現するための重要な方法です。使用するには登録に戻る必要があります。イベント コールバック インターフェイスを登録すると、DingTalk サーバーは、「コールバック インターフェイスの登録」時に設定された URL (コールバックを受け取る URL) に対して POST リクエストを開始し、URL の正当性をテストします。メッセージを受信したら、「success」という文字列の暗号化されたjsonデータを返す必要があります。そうしないと、DingTalkサーバーは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);
    }

登録が完了すると、DingTalk は承認プロセス イベント中に設定した URL アドレスにアクセスします。バックエンド開発者は、プッシュされたコンテンツを解析してフィルタリングすることで、ローカル サーバーの承認データの同期を完了できます。

データの解析プロセスには暗号化ライブラリと復号化ライブラリの使用が必要です。DingTalk の公式ダウンロード アドレスは次のとおりです

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;
                } 
            }
        }

DingTalk から受信した戻りデータは次のとおりです。

tp5 はワークフローの承認に DingTalk を使用しますencrypt は暗号化されたコンテンツ。

概要

このようにして、データと DingTalk の同期を簡単に完了できます。 DingTalk は他にも多くの人事管理、勤怠管理、その他の機能を提供しています。興味がある場合は、公式ドキュメントを参照して学ぶことができます。公式ドキュメントでは、多くのユーザーにとってインターフェイスの二次開発の具体的な実装について明確に説明されていないことに注意してください。ただし、SDK は付録で提供されているので、必要な友人はダウンロードして使い方を学ぶことができます。

以上がtp5 はワークフローの承認に DingTalk を使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。