다양한 관리 플랫폼의 개발 과정에서 승인은 피할 수 없는 문제입니다. 승인 문제는 기술적 구현뿐만 아니라 사용 빈도와 사용자의 사용 편의성도 고려해야 합니다. 소프트웨어를 사용하는 기업이 결재 및 평가를 위해 DingTalk를 활용한다면 결재관리 시스템은 DingTalk와 바로 연결된다고 볼 수 있다. 더 이상 고민하지 않고 바로 구현 프로세스를 살펴보겠습니다.
아웃소싱 사업을 하지 않는 경우에는 내부 개발을 선택하고 단계를 입력할 수 있습니다.
꼭 작성해야 합니다. 법적 IP 주소를 서비스 주소로 사용하면 이 주소가 게시물 요청 및 콜백 요청에 사용됩니다.
생성 후 보안 도메인 이름을 설정하고 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 워크벤치로 이동하여 새 승인을 생성해야 합니다
승인 내용 프로세스 프롬프트에 따라 양식을 작성하고 승인 프로세스를 작성합니다. DingTalk의 개발 인터페이스를 사용하여 직접 완료할 수도 있습니다. 도움이 필요한 친구는 DingTalk 개발 문서에서 배울 수 있습니다. 생성이 완료되면 승인의 백그라운드 작업을 위해 URL에서 승인 processCode와 corpId의 두 가지 핵심 정보를 얻을 수 있습니다.
다음과 같이 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에서 받은 반환 데이터는 다음과 같습니다.
encrypt는 암호화된 내용입니다.
이렇게 하면 데이터와 DingTalk의 동기화를 쉽게 완료할 수 있습니다. DingTalk는 또한 다양한 인사 관리, 출석 및 기타 기능을 제공합니다. 관심이 있는 경우 공식 문서를 찾아보며 배울 수 있습니다. 공식 문서에는 많은 인터페이스의 2차 개발에 대한 구체적인 구현이 명확하게 설명되어 있지 않습니다. 하지만 SDK는 부록으로 제공되며, 필요한 친구들은 다운로드하여 사용법을 익힐 수 있습니다.
위 내용은 tp5는 워크플로 승인을 위해 DingTalk를 사용합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!