|
|
@@ -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";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 验证签名
|
|
|
*
|