DDCallbackController.java 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package com.malk.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.malk.server.common.McR;
  5. import com.malk.server.dingtalk.DDConf;
  6. import com.malk.server.dingtalk.crypto.DingCallbackCrypto;
  7. import com.malk.service.dingtalk.DDClient_Event;
  8. import lombok.SneakyThrows;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.web.bind.annotation.*;
  12. import java.util.Arrays;
  13. import java.util.Map;
  14. /**
  15. * 钉钉事件回调 3_1
  16. * -
  17. * [子项目直接继承即可有调用, 无需实现]
  18. * -
  19. * 注解 @RequestMapping 路径不能重复 [主子项目属同一个项目];
  20. * 获取项目回调请求地址, https://mc.cloudpure.cn/frp/mc/dd/callback [调试代理: frp + nginx]
  21. */
  22. @Slf4j
  23. @RestController
  24. @RequestMapping("/mc/dd")
  25. public class DDCallbackController {
  26. @Autowired
  27. private DDConf ddConf;
  28. @Autowired
  29. private DDClient_Event ddClient_event;
  30. /**
  31. * 钉钉审批回调: [依赖包方案已弃用]
  32. * -
  33. * DingCallbackCrypto 方案: 官网案例 DingCallbackCrypto 不在钉钉架包, 需要单独引用
  34. * 在钉钉开放平台重新保存回调地址后, 所有的注册事件会被关闭:: 通过代码注册不成功; 官方回复, 要么使用调用注册的方式 要么是后台的方式, 二选一
  35. */
  36. @SneakyThrows
  37. @RequestMapping(value = "/callback", method = RequestMethod.POST)
  38. public Map<String, String> invokeCallback(@RequestParam(value = "signature", required = false) String signature,
  39. @RequestParam(value = "timestamp", required = false) String timestamp,
  40. @RequestParam(value = "nonce", required = false) String nonce,
  41. @RequestBody(required = false) JSONObject json) {
  42. DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(ddConf.getToken(), ddConf.getAesKey(), ddConf.getAppKey());
  43. final String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, json.getString("encrypt"));
  44. JSONObject eventJson = JSON.parseObject(decryptMsg);
  45. Map success = callbackCrypto.getEncryptedMap(DDConf.CALLBACK_RESPONSE, System.currentTimeMillis(), DingCallbackCrypto.Utils.getRandomStr(8));
  46. String eventType = eventJson.getString("EventType");
  47. if (DDConf.CALLBACK_CHECK.equals(eventType)) {
  48. log.info("----- [DD]验证注册 -----");
  49. return success;
  50. }
  51. // [回调任务执行逻辑: 异步] 钉钉超时3s未返回会被记录为失败, 可通过失败接口获取记录
  52. if (Arrays.asList(DDConf.BPMS_INSTANCE_CHANGE, DDConf.BPMS_TASK_CHANGE).contains(eventType)) {
  53. log.info("[DD]审批回调, {}", eventJson);
  54. ddClient_event.callBackEvent_Workflow(eventJson);
  55. return success;
  56. }
  57. log.info("----- [DD]已注册, 未处理的其它回调 -----, {}", eventJson);
  58. return success;
  59. }
  60. @PostMapping("robot")
  61. McR robot(@RequestBody Map data) {
  62. log.info("xxx, {}", data);
  63. return McR.success();
  64. }
  65. }