DingTalkController.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Service\DingCallbackCrypto;
  4. use App\Service\DingTalkCrypto;
  5. use App\Service\DrbService;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\Http;
  8. use Illuminate\Support\Facades\Log;
  9. class DingTalkController extends BaseController
  10. {
  11. public function getAccessToken(Request $request)
  12. {
  13. $service = new DrbService();
  14. list($status,$data) = $service->getAccessToken();
  15. if($status){
  16. return $this->json_return(200,'',$data);
  17. }else{
  18. return $this->json_return(201,$data);
  19. }
  20. }
  21. public function getUserByCode(Request $request)
  22. {
  23. $service = new DrbService();
  24. list($status,$data) = $service->getUserByCode($request->all());
  25. if($status){
  26. return $this->json_return(200,'',$data);
  27. }else{
  28. return $this->json_return(201,$data);
  29. }
  30. }
  31. public function createProcessInstance(Request $request)
  32. {
  33. $service = new DrbService();
  34. $userData = $request->userData;
  35. list($status,$data) = $service->createProcessInstance($request->all(), $userData);
  36. if($status){
  37. return $this->json_return(200,'',$data);
  38. }else{
  39. return $this->json_return(201,$data);
  40. }
  41. }
  42. public function getTemplateFields(Request $request)
  43. {
  44. $service = new DrbService();
  45. list($status,$data) = $service->getTemplateFields($request->all());
  46. if($status){
  47. return $this->json_return(200,'',$data);
  48. }else{
  49. return $this->json_return(201,$data);
  50. }
  51. }
  52. /**
  53. * 钉钉事件回调
  54. */
  55. public function dinCallback(Request $request)
  56. {
  57. $token = config('dingtalk.token'); // 钉钉事件订阅 token
  58. $aesKey = config('dingtalk.aes_key'); // 钉钉事件订阅 aes_key
  59. $corpid = config('dingtalk.app_key'); // 钉钉事件订阅 corpid
  60. $crypt = new DingCallbackCrypto($token, $aesKey, $corpid);
  61. try {
  62. $encrypt = $request->input('encrypt');
  63. $msgSignature = $request->get('msg_signature');
  64. $timeStamp = $request->get('timestamp');
  65. $nonce = $request->get('nonce');
  66. // 1️⃣ 解密
  67. $event = $crypt->getDecryptMsg($msgSignature, $timeStamp, $nonce, $encrypt);
  68. $event = json_decode($event, true);
  69. // Log::info('钉钉回调解密后的数据', $event);
  70. // 2️⃣ 处理事件
  71. if (isset($event['EventType'])) {
  72. switch ($event['EventType']) {
  73. case 'bpms_instance_change':
  74. $processInstanceId = $event['processInstanceId'] ?? null;
  75. $result = $event['result'] ?? null;
  76. // Log::info('审批实例变更', compact('processInstanceId','result'));
  77. // 捕捉最后一个节点审核通过
  78. if ($result === 'agree') {
  79. // TODO: 执行你的业务逻辑,比如更新数据库、触发后续操作
  80. Log::info("最后一个节点审核通过,审批完成", compact('processInstanceId'));
  81. }elseif ($result === 'oppose' || $result === 'terminate' || $result == "refuse") {
  82. Log::info("审批流程被驳回或终止", compact('processInstanceId','result'));
  83. }
  84. break;
  85. case 'bpms_task_change':
  86. $processInstanceId = $event['processInstanceId'] ?? null;
  87. $taskId = $event['taskId'] ?? null;
  88. $result = $event['result'] ?? null;
  89. $approverUserId = $event['staffId'] ?? null;
  90. // Log::info('审批任务变更', compact('processInstanceId','taskId','result'));
  91. // 捕获节点被驳回
  92. if ($result === 'refuse') {
  93. // Log::info("节点被驳回", compact('processInstanceId','taskId','approverUserId'));
  94. // TODO: 执行你的业务逻辑,比如通知申请人、更新状态
  95. }
  96. break;
  97. }
  98. }
  99. // 3️⃣ 返回加密 success
  100. $res = $crypt->getEncryptedMap('success');
  101. return response($res, 200)->header('Content-Type', 'application/json');
  102. } catch (\Exception $e) {
  103. Log::error('钉钉回调解密异常', ['msg' => $e->getMessage()]);
  104. return response()->json(['errcode'=>1, 'errmsg'=>'解密失败']);
  105. }
  106. }
  107. }