> PHP 프레임워크 > ThinkPHP > tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.

tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.

发呆的路
풀어 주다: 2020-05-07 14:55:56
원래의
6769명이 탐색했습니다.

다양한 관리 플랫폼의 개발 과정에서 승인은 피할 수 없는 문제입니다. 승인 문제는 기술적 구현뿐만 아니라 사용 빈도와 사용자의 사용 편의성도 고려해야 합니다. 소프트웨어를 사용하는 기업이 결재 및 평가를 위해 DingTalk를 활용한다면 결재관리 시스템은 DingTalk와 바로 연결된다고 볼 수 있다. 더 이상 고민하지 않고 바로 구현 프로세스를 살펴보겠습니다.

DingTalk 권한 설정

아웃소싱 사업을 하지 않는 경우에는 내부 개발을 선택하고 단계를 입력할 수 있습니다.

tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.

꼭 작성해야 합니다. 법적 IP 주소를 서비스 주소로 사용하면 이 주소가 게시물 요청 및 콜백 요청에 사용됩니다.

tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.

생성 후 보안 도메인 이름을 설정하고 DingTalk에 포함된 필수 인터페이스 권한을 활성화할 수 있습니다. 마이크로 애플리케이션에 대한 고급 권한. 개발 요구 사항에 따라 선택하세요. 자세한 내용은 다루지 않겠습니다.

tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.

ACCESS_TOKEN 얻기

애플릿이 생성된 후, 컬의 get 요청을 사용하여 AppKey 및 AppSecret을 볼 수 있으며 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;
    }
로그인 후 복사

승인 시작

승인 흐름을 시작하기 전에 DingTalk 워크벤치로 이동하여 새 승인을 생성해야 합니다

tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.

승인 내용 프로세스 프롬프트에 따라 양식을 작성하고 승인 프로세스를 작성합니다. DingTalk의 개발 인터페이스를 사용하여 직접 완료할 수도 있습니다. 도움이 필요한 친구는 DingTalk 개발 문서에서 배울 수 있습니다. 생성이 완료되면 승인의 백그라운드 작업을 위해 URL에서 승인 processCode와 corpId의 두 가지 핵심 정보를 얻을 수 있습니다.

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(form_comComponent_values) 참고

Form 컨트롤은 키/값 형식으로, 키는 각 컨트롤에 해당하는 이름이고 값은 일반 문자 문자열 또는 json 문자열일 수 있습니다. http_header는 'Content-Type: application/json;'을 선택합니다. 부서를 입력해야 하는 경우 DingTalk 자체 부서 드롭다운 구성 요소를 사용하고 부서 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는 또한 다양한 인사 관리, 출석 및 기타 기능을 제공합니다. 관심이 있는 경우 공식 문서를 찾아보며 배울 수 있습니다. 공식 문서에는 많은 인터페이스의 2차 개발에 대한 구체적인 구현이 명확하게 설명되어 있지 않습니다. 하지만 SDK는 부록으로 제공되며, 필요한 친구들은 다운로드하여 사용법을 익힐 수 있습니다.

위 내용은 tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
tp5
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿