CallbackController.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package com.haha.miniapp.controller;
  2. import cn.dev33.satoken.annotation.SaIgnore;
  3. import com.alibaba.fastjson2.JSON;
  4. import com.haha.common.constant.CallbackConstants;
  5. import com.haha.common.enums.NotifyType;
  6. import com.haha.common.utils.RequestParseUtil;
  7. import com.haha.service.HahaCallbackService;
  8. import lombok.RequiredArgsConstructor;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.bind.annotation.RequestMapping;
  12. import org.springframework.web.bind.annotation.RequestParam;
  13. import org.springframework.web.bind.annotation.RestController;
  14. import jakarta.servlet.http.HttpServletRequest;
  15. import java.util.Map;
  16. /**
  17. * 哈哈平台回调通知接口
  18. *
  19. * 接收哈哈平台推送的各类通知,分为两类回调地址:
  20. *
  21. * 1. 消息回调地址 (/callback/haha/message)
  22. * - DEVICE_STATUS: 开关门状态通知
  23. * - ONLINE_STATUS: 设备在线状态通知
  24. * - VOICE_RESULT: 音量调节结果通知
  25. * - CLIENT_NEW_PRODUCT: 新品审核结果回调
  26. * - MERGE_PRODUCT: 商品合并结果通知
  27. * - ORC_RESULT: AI识别结果通知(最重要)
  28. *
  29. * 2. 订单回调地址 (/callback/haha/order)
  30. * - 哈哈平台生成订单后推送的订单信息
  31. * - 包含订单号、设备号、用户ID、订单明细、金额等
  32. *
  33. * 注意:
  34. * - 所有通知都包含 sign 字段用于验证
  35. * - 必须返回 "success" 字符串表示接收成功
  36. * - 未正确响应会触发重试机制
  37. */
  38. @Slf4j
  39. @RequiredArgsConstructor
  40. @RestController
  41. @RequestMapping("/callback/haha")
  42. @SaIgnore
  43. public class CallbackController {
  44. private final HahaCallbackService hahaCallbackService;
  45. /**
  46. * 消息回调通知统一入口
  47. *
  48. * 接收哈哈平台推送的所有类型通知,通过 notify_type 区分具体类型
  49. * 支持 application/json 和 application/x-www-form-urlencoded 两种格式
  50. *
  51. * @param request HTTP请求对象
  52. * @param requestParams form表单参数(用于application/x-www-form-urlencoded)
  53. * @return 响应结果,必须返回 "success" 字符串
  54. */
  55. @PostMapping("/message")
  56. public String handleMessageCallback(HttpServletRequest request,
  57. @RequestParam(required = false) Map<String, String> requestParams) {
  58. try {
  59. Map<String, Object> params = RequestParseUtil.parseRequestParams(request, requestParams);
  60. log.info("收到消息回调通知: {}", JSON.toJSONString(params));
  61. String notifyType = (String) params.get("notify_type");
  62. if (notifyType == null || notifyType.isEmpty()) {
  63. log.warn("消息回调缺少 notify_type 参数");
  64. return CallbackConstants.HAHA_SUCCESS;
  65. }
  66. NotifyType type = NotifyType.fromCode(notifyType);
  67. if (type == null) {
  68. log.warn("未知的消息通知类型: {}", notifyType);
  69. return CallbackConstants.HAHA_SUCCESS;
  70. }
  71. hahaCallbackService.handleMessage(params);
  72. return CallbackConstants.HAHA_SUCCESS;
  73. } catch (Exception e) {
  74. log.error("处理消息回调通知失败", e);
  75. return CallbackConstants.HAHA_SUCCESS;
  76. }
  77. }
  78. /**
  79. * 订单回调通知接口
  80. *
  81. * 当AI识别完成并生成订单后,哈哈平台会推送订单信息到此接口
  82. * 这是独立于消息回调的订单回调接口
  83. * 支持 application/json 和 application/x-www-form-urlencoded 两种格式
  84. *
  85. * @param request HTTP请求对象
  86. * @param requestParams form表单参数(用于application/x-www-form-urlencoded)
  87. * @return 响应结果,必须返回 "success" 字符串
  88. */
  89. @PostMapping("/order")
  90. public String handleOrderCallback(HttpServletRequest request,
  91. @RequestParam(required = false) Map<String, String> requestParams) {
  92. try {
  93. Map<String, Object> params = RequestParseUtil.parseRequestParams(request, requestParams);
  94. log.info("收到订单回调通知: {}", JSON.toJSONString(params));
  95. hahaCallbackService.handleOrderCallback(params);
  96. return CallbackConstants.HAHA_SUCCESS;
  97. } catch (Exception e) {
  98. log.error("处理订单回调通知失败", e);
  99. return CallbackConstants.HAHA_SUCCESS;
  100. }
  101. }
  102. }