DingTalkController.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Service\DingTalkCrypto;
  4. use App\Service\DrbService;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Http;
  7. use Illuminate\Support\Facades\Log;
  8. class DingTalkController extends BaseController
  9. {
  10. public function getAccessToken(Request $request)
  11. {
  12. $service = new DrbService();
  13. list($status,$data) = $service->getAccessToken();
  14. if($status){
  15. return $this->json_return(200,'',$data);
  16. }else{
  17. return $this->json_return(201,$data);
  18. }
  19. }
  20. public function getUserByCode(Request $request)
  21. {
  22. $service = new DrbService();
  23. list($status,$data) = $service->getUserByCode($request->all());
  24. if($status){
  25. return $this->json_return(200,'',$data);
  26. }else{
  27. return $this->json_return(201,$data);
  28. }
  29. }
  30. public function createProcessInstance(Request $request)
  31. {
  32. $service = new DrbService();
  33. $userData = $request->userData;
  34. list($status,$data) = $service->createProcessInstance($request->all(), $userData);
  35. if($status){
  36. return $this->json_return(200,'',$data);
  37. }else{
  38. return $this->json_return(201,$data);
  39. }
  40. }
  41. public function getTemplateFields(Request $request)
  42. {
  43. $service = new DrbService();
  44. list($status,$data) = $service->getTemplateFields($request->all());
  45. if($status){
  46. return $this->json_return(200,'',$data);
  47. }else{
  48. return $this->json_return(201,$data);
  49. }
  50. }
  51. /**
  52. * 钉钉事件回调
  53. */
  54. public function dinCallback(Request $request)
  55. {
  56. $token = config('dingtalk.token'); // 钉钉事件订阅 token
  57. $aesKey = config('dingtalk.aes_key'); // 钉钉事件订阅 aes_key
  58. $crypt = new DingTalkCrypto($token, $aesKey);
  59. // 1. 获取钉钉传来的参数
  60. $signature = $request->get('signature');
  61. $timestamp = $request->get('timestamp');
  62. $nonce = $request->get('nonce');
  63. $encrypt = $request->input('encrypt');
  64. // 2. 解密
  65. $event = $crypt->decryptMsg($signature, $timestamp, $nonce, $encrypt);
  66. if ($event === false) {
  67. Log::error('钉钉解密失败', [
  68. 'signature' => $signature,
  69. 'timestamp' => $timestamp,
  70. 'nonce' => $nonce,
  71. 'encrypt' => $encrypt
  72. ]);
  73. return response()->json(['errcode' => 1, 'errmsg' => '解密失败']);
  74. }
  75. Log::info('钉钉解密后的事件数据', $event);
  76. // 3. 验证 challenge
  77. if (isset($event['EventType']) && $event['EventType'] === 'check_url') {
  78. $encryptMsg = $crypt->encryptMsg($event['Random'], $timestamp, $nonce);
  79. return response()->json([
  80. "msg_signature" => $encryptMsg['msg_signature'],
  81. "timeStamp" => $timestamp,
  82. "nonce" => $nonce,
  83. "encrypt" => $encryptMsg['encrypt']
  84. ]);
  85. }
  86. // 4. 处理事件
  87. if (isset($event['EventType'])) {
  88. switch ($event['EventType']) {
  89. case 'bpms_instance_change': // 审批实例变更
  90. $processInstanceId = $event['processInstanceId'] ?? null;
  91. $result = $event['result'] ?? null; // agree / oppose / terminate
  92. Log::info("审批实例变更事件", compact('processInstanceId', 'result'));
  93. // TODO: 在这里执行你的业务逻辑,例如更新数据库状态
  94. break;
  95. case 'bpms_task_change': // 审批任务变更
  96. $processInstanceId = $event['processInstanceId'] ?? null;
  97. $taskId = $event['taskId'] ?? null;
  98. $result = $event['result'] ?? null; // agree / oppose
  99. Log::info("审批任务变更事件", compact('processInstanceId', 'taskId', 'result'));
  100. // TODO: 在这里执行你的业务逻辑,例如记录审批人操作
  101. break;
  102. default:
  103. Log::warning("未处理的事件类型", ['EventType' => $event['EventType']]);
  104. }
  105. }
  106. // 5. 返回 success(加密)
  107. $resEncrypt = $crypt->encryptMsg('success', $timestamp, $nonce);
  108. return response()->json([
  109. "msg_signature" => $resEncrypt['msg_signature'],
  110. "timeStamp" => $timestamp,
  111. "nonce" => $nonce,
  112. "encrypt" => $resEncrypt['encrypt']
  113. ]);
  114. }
  115. }