Kaynağa Gözat

智能柜项目提交

skyline 4 ay önce
ebeveyn
işleme
bc1f4772b0

+ 93 - 2
haha-miniapp/src/main/java/com/haha/miniapp/controller/CallbackController.java

@@ -20,7 +20,9 @@ import java.util.Map;
 /**
  * 哈哈平台回调通知接口
  * 
- * 接收哈哈平台推送的各类通知,所有通知都通过消息回调地址接收:
+ * 接收哈哈平台推送的各类通知,分为两类回调地址:
+ * 
+ * 1. 消息回调地址 (/callback/haha/message)
  *    - DEVICE_STATUS: 开关门状态通知
  *    - ONLINE_STATUS: 设备在线状态通知
  *    - VOICE_RESULT: 音量调节结果通知
@@ -28,7 +30,14 @@ import java.util.Map;
  *    - MERGE_PRODUCT: 商品合并结果通知
  *    - ORC_RESULT: AI识别结果通知(最重要)
  * 
- * 所有通知都通过 notify_type 字段区分具体类型
+ * 2. 订单回调地址 (/callback/haha/order)
+ *    - 哈哈平台生成订单后推送的订单信息
+ *    - 包含订单号、设备号、用户ID、订单明细、金额等
+ * 
+ * 注意:
+ * - 所有通知都包含 sign 字段用于验证
+ * - 必须返回 "success" 字符串表示接收成功
+ * - 未正确响应会触发重试机制
  */
 @Slf4j
 @RestController
@@ -294,6 +303,88 @@ public class CallbackController {
         }
     }
 
+    /**
+     * 订单回调通知接口
+     * 
+     * 当AI识别完成并生成订单后,哈哈平台会推送订单信息到此接口
+     * 这是独立于消息回调的订单回调接口
+     * 
+     * @param params 订单回调参数
+     * @return 响应结果,必须返回 "success" 字符串
+     */
+    @PostMapping("/order")
+    public String handleOrderCallback(@RequestBody Map<String, Object> params) {
+        try {
+            // 记录回调日志
+            log.info("收到订单回调通知: {}", JSON.toJSONString(params));
+            
+            // 1. 验证签名(如果需要)
+            // validateSign(params);
+            
+            // 2. 提取订单信息
+            String orderId = (String) params.get("order_id");
+            String deviceId = (String) params.get("device_id");
+            String activityId = (String) params.get("activity_id");
+            String userId = (String) params.get("user_id");
+            String orderName = (String) params.get("order_name");
+            String orderDetail = (String) params.get("order_detail");
+            String from = (String) params.get("from");
+            Object orderMoney = params.get("order_money");
+            Object createTime = params.get("create_time");
+            
+            log.info("订单信息 - 订单号: {}, 设备: {}, 活动: {}, 用户: {}, 金额: {}",
+                orderId, deviceId, activityId, userId, orderMoney);
+            
+            // 3. 查找本地订单记录
+            Order localOrder = orderService.lambdaQuery()
+                .eq(Order::getUserId, Long.parseLong(userId))
+                .eq(Order::getDeviceId, deviceId)
+                .eq(Order::getStatus, Order.ORDER_STATUS_待支付)
+                .orderByDesc(Order::getCreateTime)
+                .last("LIMIT 1")
+                .one();
+            
+            if (localOrder == null) {
+                log.warn("未找到对应的本地订单记录,用户: {}, 设备: {}", userId, deviceId);
+                return "success";
+            }
+            
+            // 4. 更新本地订单信息
+            localOrder.setOrderNo(orderId);
+            localOrder.setActivityId(activityId);
+            
+            // 将订单明细存储到 items 字段(JSON格式)
+            if (orderDetail != null) {
+                localOrder.setItems(orderDetail);
+            }
+            
+            // 设置订单金额
+            if (orderMoney != null) {
+                localOrder.setTotalAmount(Double.parseDouble(orderMoney.toString()));
+            }
+            
+            boolean updated = orderService.updateById(localOrder);
+            if (updated) {
+                log.info("订单信息更新成功: {}", orderId);
+            } else {
+                log.error("订单信息更新失败: {}", orderId);
+            }
+            
+            // 5. TODO: 根据业务需要进行后续处理
+            // - 触发支付流程
+            // - 发送通知给用户
+            // - 更新库存等
+            
+            // 6. 返回成功响应
+            return "success";
+            
+        } catch (Exception e) {
+            log.error("处理订单回调通知失败", e);
+            // 即使处理失败,也返回成功,避免重复推送
+            return "success";
+        }
+    }
+
     /**
      * 验证签名
      *