From 71690bfac5e0191f6fea85c6708d36495af049ad Mon Sep 17 00:00:00 2001
From: zhangsan <646228430@qq.com>
Date: Thu, 7 Aug 2025 16:10:02 +0800
Subject: [PATCH] =?UTF-8?q?8.7=20=E5=BE=AE=E6=9C=8D=E5=8A=A1=E8=B0=83?=
=?UTF-8?q?=E7=94=A8=E6=94=B9=E4=B8=BAdubbo=EF=BC=8C=E4=BD=86=E4=BF=9D?=
=?UTF-8?q?=E7=95=99=E5=8E=9F=E6=9D=A5=E7=9A=84http=E8=B0=83=E7=94=A8?=
=?UTF-8?q?=E5=BD=A2=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/dev-ops/mysql/sql/0716paymall.sql | 65 -----
docs/dev-ops/mysql/sql/0807paymall.sql | 50 ++++
.../src/main/java/edu/whut/Application.java | 2 +
.../src/main/resources/application-dev.yml | 22 +-
pay-mall-infrastructure/pom.xml | 9 +
.../adapter/port/ProductPort.java | 263 +++++++++++-------
.../whut/trigger/http/AliPayController.java | 5 +-
pom.xml | 8 +
8 files changed, 255 insertions(+), 169 deletions(-)
delete mode 100644 docs/dev-ops/mysql/sql/0716paymall.sql
create mode 100644 docs/dev-ops/mysql/sql/0807paymall.sql
diff --git a/docs/dev-ops/mysql/sql/0716paymall.sql b/docs/dev-ops/mysql/sql/0716paymall.sql
deleted file mode 100644
index 39bb881..0000000
--- a/docs/dev-ops/mysql/sql/0716paymall.sql
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- Navicat Premium Data Transfer
-
- Source Server : group_buy_local
- Source Server Type : MySQL
- Source Server Version : 80042
- Source Host : localhost:13306
- Source Schema : pay-mall
-
- Target Server Type : MySQL
- Target Server Version : 80042
- File Encoding : 65001
-
- Date: 16/07/2025 17:08:44
-*/
--- 如果存在,则删除旧的数据库
-DROP DATABASE IF EXISTS `pay-mall`;
-
--- 创建新的数据库(可根据需要指定字符集和排序规则)
-CREATE DATABASE `pay-mall`
- CHARACTER SET utf8mb4
- COLLATE utf8mb4_unicode_ci;
-
--- 切换到新创建的数据库
-USE `pay-mall`;
-
-SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
-
--- ----------------------------
--- Table structure for pay_order
--- ----------------------------
-DROP TABLE IF EXISTS `pay_order`;
-CREATE TABLE `pay_order` (
- `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
- `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
- `product_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品ID',
- `product_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
- `order_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单ID',
- `order_time` datetime NOT NULL COMMENT '下单时间',
- `total_amount` decimal(8, 2) UNSIGNED NULL DEFAULT NULL COMMENT '订单金额',
- `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单状态;create-创建完成、pay_wait-等待支付、pay_success-支付成功、deal_done-交易完成、close-订单关单',
- `pay_url` varchar(2014) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付信息',
- `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间',
- `market_type` tinyint(1) NULL DEFAULT NULL COMMENT '营销类型;0无营销、1拼团营销',
- `market_deduction_amount` decimal(8, 2) NULL DEFAULT NULL COMMENT '营销金额;优惠金额',
- `pay_amount` decimal(8, 2) NOT NULL COMMENT '支付金额',
- `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
- `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
- PRIMARY KEY (`id`) USING BTREE,
- UNIQUE INDEX `uq_order_id`(`order_id` ASC) USING BTREE,
- INDEX `idx_user_id_product_id`(`user_id` ASC, `product_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
-
--- ----------------------------
--- Records of pay_order
--- ----------------------------
-INSERT INTO `pay_order` VALUES (36, 'opEtBvq6go0co-HQC5DSHkKfkdds', '9890001', 'MyBatisBook', '498873906342', '2025-07-16 15:53:11', 100.00, 'DEAL_DONE', '
\n', '2025-07-16 15:54:03', 1, 20.00, 80.00, '2025-07-16 15:53:11', '2025-07-16 16:44:47');
-INSERT INTO `pay_order` VALUES (39, 'smile01', '9890001', 'MyBatisBook', '369511405849', '2025-07-16 16:28:58', 100.00, 'PAY_SUCCESS', '\n', '2025-07-16 16:30:33', 1, 20.00, 80.00, '2025-07-16 16:28:57', '2025-07-16 16:30:33');
-INSERT INTO `pay_order` VALUES (40, 'smile01', '9890001', 'MyBatisBook', '698481154046', '2025-07-16 16:34:25', 100.00, 'DEAL_DONE', '\n', '2025-07-16 16:35:36', 0, 0.00, 100.00, '2025-07-16 16:34:24', '2025-07-16 16:35:36');
-INSERT INTO `pay_order` VALUES (41, 'smile02', '9890001', 'MyBatisBook', '541129857040', '2025-07-16 16:36:49', 100.00, 'DEAL_DONE', '\n', '2025-07-16 16:38:05', 1, 20.00, 80.00, '2025-07-16 16:36:49', '2025-07-16 16:44:47');
-INSERT INTO `pay_order` VALUES (42, 'smile04', '9890001', 'MyBatisBook', '381698719384', '2025-07-16 16:43:47', 100.00, 'DEAL_DONE', '\n', '2025-07-16 16:44:47', 1, 20.00, 80.00, '2025-07-16 16:43:46', '2025-07-16 16:44:47');
-INSERT INTO `pay_order` VALUES (45, 'smile04', '9890001', 'MyBatisBook', '380924838419', '2025-07-16 16:54:06', 100.00, 'DEAL_DONE', '\n', '2025-07-16 16:55:14', 0, 0.00, 100.00, '2025-07-16 16:54:05', '2025-07-16 16:55:14');
-
-SET FOREIGN_KEY_CHECKS = 1;
diff --git a/docs/dev-ops/mysql/sql/0807paymall.sql b/docs/dev-ops/mysql/sql/0807paymall.sql
new file mode 100644
index 0000000..34cde9d
--- /dev/null
+++ b/docs/dev-ops/mysql/sql/0807paymall.sql
@@ -0,0 +1,50 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : group_buy_local
+ Source Server Type : MySQL
+ Source Server Version : 80042
+ Source Host : localhost:13306
+ Source Schema : pay-mall
+
+ Target Server Type : MySQL
+ Target Server Version : 80042
+ File Encoding : 65001
+
+ Date: 07/08/2025 16:04:33
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for pay_order
+-- ----------------------------
+DROP TABLE IF EXISTS `pay_order`;
+CREATE TABLE `pay_order` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
+ `product_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品ID',
+ `product_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
+ `order_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单ID',
+ `order_time` datetime NOT NULL COMMENT '下单时间',
+ `total_amount` decimal(8, 2) UNSIGNED NULL DEFAULT NULL COMMENT '订单金额',
+ `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单状态;create-创建完成、pay_wait-等待支付、pay_success-支付成功、deal_done-交易完成、close-订单关单',
+ `pay_url` varchar(2014) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付信息',
+ `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间',
+ `market_type` tinyint(1) NULL DEFAULT NULL COMMENT '营销类型;0无营销、1拼团营销',
+ `market_deduction_amount` decimal(8, 2) NULL DEFAULT NULL COMMENT '营销金额;优惠金额',
+ `pay_amount` decimal(8, 2) NOT NULL COMMENT '支付金额',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uq_order_id`(`order_id` ASC) USING BTREE,
+ INDEX `idx_user_id_product_id`(`user_id` ASC, `product_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 46 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of pay_order
+-- ----------------------------
+INSERT INTO `pay_order` VALUES (49, 'smile01', '9890001', 'MyBatisBook', '651958626376', '2025-08-07 16:03:13', 100.00, 'PAY_SUCCESS', '\n', '2025-08-07 16:04:20', 1, 20.00, 80.00, '2025-08-07 16:03:13', '2025-08-07 16:04:20');
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/pay-mall-app/src/main/java/edu/whut/Application.java b/pay-mall-app/src/main/java/edu/whut/Application.java
index 846bcd5..0500f99 100644
--- a/pay-mall-app/src/main/java/edu/whut/Application.java
+++ b/pay-mall-app/src/main/java/edu/whut/Application.java
@@ -1,5 +1,6 @@
package edu.whut;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -8,6 +9,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@Configurable
@EnableScheduling
+@EnableDubbo(scanBasePackages = "edu.whut.infrastructure")
public class Application {
public static void main(String[] args){
diff --git a/pay-mall-app/src/main/resources/application-dev.yml b/pay-mall-app/src/main/resources/application-dev.yml
index 551ff27..5ff8093 100644
--- a/pay-mall-app/src/main/resources/application-dev.yml
+++ b/pay-mall-app/src/main/resources/application-dev.yml
@@ -15,7 +15,8 @@ app:
notify-type: MQ
source: s01
chanel: c01
-
+ rpc:
+ mode: DUBBO
# 线程池配置
thread:
pool:
@@ -84,12 +85,31 @@ spring:
routing_key: topic.order_pay_success
# 消费队列
queue: pay_mall_queue_2_order_pay_success
+ topic_team_refund:
+ # 绑定交换机 - 消息提供者的交换机
+ exchange: group_buy_market_exchange
+ # 消息主题
+ routing_key: topic.team_refund
+ # 消费队列
+ queue: s_pay_mall_queue_2_topic_team_refund
# MyBatis 配置【如需使用记得打开】
mybatis:
mapper-locations: classpath:/mybatis/mapper/*.xml
config-location: classpath:/mybatis/config/mybatis-config.xml
+dubbo:
+ application:
+ name: pay-mall-service # 换成各自服务名
+ registry:
+ address: nacos://localhost:8848 # 远程环境写内网地址
+ # username/password 如果 Nacos 开了鉴权
+ protocol:
+ name: dubbo
+ consumer:
+ timeout: 3000 # 毫秒
+ check: false # 忽略启动时服务是否可用
+
# 微信公众号对接
weixin:
config:
diff --git a/pay-mall-infrastructure/pom.xml b/pay-mall-infrastructure/pom.xml
index 1ae46e1..83a0a18 100644
--- a/pay-mall-infrastructure/pom.xml
+++ b/pay-mall-infrastructure/pom.xml
@@ -43,6 +43,15 @@
org.springframework.boot
spring-boot-starter-amqp
+
+ org.apache.dubbo
+ dubbo-spring-boot-starter
+
+
+
+ org.apache.dubbo
+ dubbo-registry-nacos
+
edu.whut
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/ProductPort.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/ProductPort.java
index b871f66..a7468e6 100644
--- a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/ProductPort.java
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/ProductPort.java
@@ -1,28 +1,39 @@
package edu.whut.infrastructure.adapter.port;
import com.alibaba.fastjson.JSON;
+import edu.whut.api.IMarketTradeService; // Dubbo 接口
import edu.whut.api.dto.*;
import edu.whut.api.response.Response;
import edu.whut.domain.order.adapter.port.IProductPort;
import edu.whut.domain.order.model.entity.MarketPayDiscountEntity;
import edu.whut.domain.order.model.entity.ProductEntity;
-import edu.whut.infrastructure.gateway.IGroupBuyMarketService;
+import edu.whut.infrastructure.gateway.IGroupBuyMarketService; // Retrofit 接口
import edu.whut.infrastructure.gateway.ProductRPC;
import edu.whut.infrastructure.gateway.dto.ProductDTO;
import edu.whut.types.exception.AppException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import retrofit2.Call;
import java.util.Date;
+/**
+ * 商品与营销交易的适配层;同时支持 Retrofit(HTTP) 与 Dubbo(RPC)。
+ * 通过配置属性 app.rpc.mode
动态切换调用通道:
+ *
+ * - DUBBO —— 默认,采用 Dubbo + Nacos
+ * - HTTP —— 走原 Retrofit HTTP 调用
+ *
+ */
@Component
@RequiredArgsConstructor
@Slf4j
public class ProductPort implements IProductPort {
+ /* -------------------- 公共配置 -------------------- */
@Value("${app.config.group-buy-market.source}")
private String source;
@Value("${app.config.group-buy-market.chanel}")
@@ -30,20 +41,28 @@ public class ProductPort implements IProductPort {
@Value("${app.config.group-buy-market.notify-url}")
private String notifyUrl;
@Value("${app.config.group-buy-market.notify-type}")
- private String notifyType; //http or mq
- private final IGroupBuyMarketService groupBuyMarketService;
+ private String notifyType; // HTTP or MQ
+ /* rpc.mode = DUBBO / HTTP,缺省 DUBBO */
+ @Value("${app.rpc.mode:DUBBO}")
+ private String rpcMode;
+
+ /* -------------------- Retrofit 客户端 -------------------- */
+ private final IGroupBuyMarketService retrofitService;
+
+ /* -------------------- Dubbo 客户端 -------------------- */
+ @DubboReference(version = "1.0.0", check = false)
+ private final IMarketTradeService dubboService;
+
+ /* -------------------- 产品 RPC -------------------- */
private final ProductRPC productRPC;
-
- /**
- * 根据产品ID查询基础商品信息
- */
+ /* ============================================================ */
+ /* 商品查询接口 */
+ /* ============================================================ */
@Override
public ProductEntity queryProductByProductId(String productId) {
- // 调用远程产品服务获取 DTO
ProductDTO dto = productRPC.queryProductByProductId(productId);
- // 转换为领域实体并返回
return ProductEntity.builder()
.productId(dto.getProductId())
.productName(dto.getProductName())
@@ -52,112 +71,156 @@ public class ProductPort implements IProductPort {
.build();
}
- /**
- * 发起营销锁单请求,获取拼团优惠信息
- */
+ /* ============================================================ */
+ /* 营销锁单 */
+ /* ============================================================ */
@Override
- public MarketPayDiscountEntity lockMarketPayOrder(String userId, String teamId, Long activityId, String productId, String orderId) {
- // 请求参数
- LockMarketPayOrderRequestDTO requestDTO = new LockMarketPayOrderRequestDTO();
- requestDTO.setUserId(userId);
- requestDTO.setTeamId(teamId);
- requestDTO.setGoodsId(productId);
- requestDTO.setActivityId(activityId);
- requestDTO.setSource(source);
- requestDTO.setChannel(chanel);
- //拼团的外部交易单号等于支付系统的订单号
- requestDTO.setOutTradeNo(orderId);
-
- // 根据配置决定用 HTTP 回调还是 MQ
- if ("HTTP".equalsIgnoreCase(notifyType)) {
- requestDTO.setNotifyUrl(notifyUrl);
- } else {
- requestDTO.setNotifyMQ();
- }
-
- try {
- // 发起 HTTP 请求,执行营销锁单
- Call> call = groupBuyMarketService.lockMarketPayOrder(requestDTO);
-
- // 获取结果
- Response response = call.execute().body();
- log.info("营销锁单{} requestDTO:{} responseDTO:{}", userId, JSON.toJSONString(requestDTO), JSON.toJSONString(response));
- if (null == response) return null;
-
- // 异常判断
- if (!"0000".equals(response.getCode())){
- throw new AppException(response.getCode(), response.getInfo());
- }
-
- LockMarketPayOrderResponseDTO responseDTO = response.getData();
-
- // 获取拼团优惠
- return MarketPayDiscountEntity.builder()
- .originalPrice(responseDTO.getOriginalPrice())
- .deductionPrice(responseDTO.getDeductionPrice())
- .payPrice(responseDTO.getPayPrice())
- .build();
- } catch (Exception e) {
- log.error("营销锁单失败{}", userId, e);
- return null;
- }
+ public MarketPayDiscountEntity lockMarketPayOrder(String userId,
+ String teamId,
+ Long activityId,
+ String productId,
+ String orderId) {
+ LockMarketPayOrderRequestDTO req = buildLockReq(userId, teamId, activityId, productId, orderId);
+ Response resp = invoke("lockMarketPayOrder", req);
+ LockMarketPayOrderResponseDTO data = resp.getData();
+ return MarketPayDiscountEntity.builder()
+ .originalPrice(data.getOriginalPrice())
+ .deductionPrice(data.getDeductionPrice())
+ .payPrice(data.getPayPrice())
+ .build();
}
- /**
- * 发起拼团系统的营销结算
- */
+ /* ============================================================ */
+ /* 营销结算 */
+ /* ============================================================ */
@Override
public void settlementMarketPayOrder(String userId, String orderId, Date orderTime) {
- SettlementMarketPayOrderRequestDTO requestDTO = new SettlementMarketPayOrderRequestDTO();
- requestDTO.setSource(source);
- requestDTO.setChannel(chanel);
- requestDTO.setUserId(userId);
- requestDTO.setOutTradeNo(orderId);
- requestDTO.setOutTradeTime(orderTime);
-
- try {
- Call> call = groupBuyMarketService.settlementMarketPayOrder(requestDTO);
-
- // 获取结果
- Response response = call.execute().body();
- log.info("营销结算{} requestDTO:{} responseDTO:{}", userId, JSON.toJSONString(requestDTO), JSON.toJSONString(response));
- if (null == response) return;
-
- // 异常判断
- if (!"0000".equals(response.getCode())) {
- log.info("营销结算返回,code={}, info={}", response.getCode(), response.getInfo());
- throw new AppException(response.getCode(), response.getInfo());
- }
-
- } catch (Exception e) {
- log.error("营销结算失败 {}", userId, e);
- }
+ SettlementMarketPayOrderRequestDTO req = new SettlementMarketPayOrderRequestDTO();
+ req.setSource(source);
+ req.setChannel(chanel);
+ req.setUserId(userId);
+ req.setOutTradeNo(orderId);
+ req.setOutTradeTime(orderTime);
+ invoke("settlementMarketPayOrder", req);
}
+ /* ============================================================ */
+ /* 营销退单 */
+ /* ============================================================ */
@Override
public void refundMarketPayOrder(String userId, String orderId) {
- RefundMarketPayOrderRequestDTO requestDTO = new RefundMarketPayOrderRequestDTO();
- requestDTO.setSource(source);
- requestDTO.setChannel(chanel);
- requestDTO.setUserId(userId);
- requestDTO.setOutTradeNo(orderId);
+ RefundMarketPayOrderRequestDTO req = new RefundMarketPayOrderRequestDTO();
+ req.setSource(source);
+ req.setChannel(chanel);
+ req.setUserId(userId);
+ req.setOutTradeNo(orderId);
+ invoke("refundMarketPayOrder", req);
+ }
+ /* ************************************************************ */
+ /* 私有工具方法 */
+ /* ************************************************************ */
+
+ /**
+ * 根据模式调用对应通道
+ */
+ @SuppressWarnings("unchecked")
+ private Response invoke(String method, REQ request) {
+ log.info("[invoke] RPC 模式 = {}, 调用方法 = {}", rpcMode, method);
try {
- Call> call = groupBuyMarketService.refundMarketPayOrder(requestDTO);
-
- // 获取结果
- Response response = call.execute().body();
- log.info("营销退单{} requestDTO:{} responseDTO:{}", userId, JSON.toJSONString(requestDTO), JSON.toJSONString(response));
- if (null == response) return;
-
- // 异常判断
- if (!"0000".equals(response.getCode())) {
- throw new AppException(response.getCode(), response.getInfo());
+ Response resp;
+ if ("HTTP".equalsIgnoreCase(rpcMode)) {
+ // ---------------- HTTP 调用 ----------------
+ switch (method) {
+ case "lockMarketPayOrder":
+ resp = (Response) httpLock((LockMarketPayOrderRequestDTO) request);
+ break;
+ case "settlementMarketPayOrder":
+ resp = (Response) httpSettlement((SettlementMarketPayOrderRequestDTO) request);
+ break;
+ case "refundMarketPayOrder":
+ resp = (Response) httpRefund((RefundMarketPayOrderRequestDTO) request);
+ break;
+ default:
+ throw new IllegalStateException("Unsupported HTTP method: " + method);
+ }
+ } else {
+ // ---------------- Dubbo 调用 ----------------
+ switch (method) {
+ case "lockMarketPayOrder":
+ resp = (Response) dubboService.lockMarketPayOrder((LockMarketPayOrderRequestDTO) request);
+ break;
+ case "settlementMarketPayOrder":
+ resp = (Response) dubboService.settlementMarketPayOrder((SettlementMarketPayOrderRequestDTO) request);
+ break;
+ case "refundMarketPayOrder":
+ resp = (Response) dubboService.refundMarketPayOrder((RefundMarketPayOrderRequestDTO) request);
+ break;
+ default:
+ throw new IllegalStateException("Unsupported Dubbo method: " + method);
+ }
}
+ // ----------- 统一异常处理 -----------
+ if (resp == null) {
+ throw new AppException("RPC_NULL", "rpc response null");
+ }
+ if (!"0000".equals(resp.getCode())) {
+ throw new AppException(resp.getCode(), resp.getInfo());
+ }
+ log.info("[{}] 成功 userId={} request={} response={}", method, extractUserId(request), JSON.toJSONString(request), JSON.toJSONString(resp));
+ return resp;
+ } catch (AppException e) {
+ throw e;
} catch (Exception e) {
- log.error("营销退单失败{}", userId, e);
+ log.error("[{}] 调用失败 request={}", method, JSON.toJSONString(request), e);
+ throw new AppException("RPC_ERR", "rpc call error");
}
}
+ /* ---------------- 单独封装 Retrofit 调用 ---------------- */
+ private Response httpLock(LockMarketPayOrderRequestDTO req) throws Exception {
+ Call> call = retrofitService.lockMarketPayOrder(req);
+ return call.execute().body();
+ }
+
+ private Response httpSettlement(SettlementMarketPayOrderRequestDTO req) throws Exception {
+ Call> call = retrofitService.settlementMarketPayOrder(req);
+ return call.execute().body();
+ }
+
+ private Response httpRefund(RefundMarketPayOrderRequestDTO req) throws Exception {
+ Call> call = retrofitService.refundMarketPayOrder(req);
+ return call.execute().body();
+ }
+
+ /* ---------------- DTO 构造 ---------------- */
+ private LockMarketPayOrderRequestDTO buildLockReq(String userId, String teamId, Long activityId, String goodsId, String orderId) {
+ LockMarketPayOrderRequestDTO dto = new LockMarketPayOrderRequestDTO();
+ dto.setUserId(userId);
+ dto.setTeamId(teamId);
+ dto.setGoodsId(goodsId);
+ dto.setActivityId(activityId);
+ dto.setSource(source);
+ dto.setChannel(chanel);
+ dto.setOutTradeNo(orderId);
+ if ("HTTP".equalsIgnoreCase(notifyType)) {
+ dto.setNotifyUrl(notifyUrl);
+ } else {
+ dto.setNotifyMQ();
+ }
+ return dto;
+ }
+
+ /* ---- 从不同请求对象里提取 userId 仅用于日志 ---- */
+ private String extractUserId(Object req) {
+ if (req instanceof LockMarketPayOrderRequestDTO) {
+ return ((LockMarketPayOrderRequestDTO) req).getUserId();
+ } else if (req instanceof SettlementMarketPayOrderRequestDTO) {
+ return ((SettlementMarketPayOrderRequestDTO) req).getUserId();
+ } else if (req instanceof RefundMarketPayOrderRequestDTO) {
+ return ((RefundMarketPayOrderRequestDTO) req).getUserId();
+ }
+ return "-";
+ }
}
diff --git a/pay-mall-trigger/src/main/java/edu/whut/trigger/http/AliPayController.java b/pay-mall-trigger/src/main/java/edu/whut/trigger/http/AliPayController.java
index 7b09643..706965a 100644
--- a/pay-mall-trigger/src/main/java/edu/whut/trigger/http/AliPayController.java
+++ b/pay-mall-trigger/src/main/java/edu/whut/trigger/http/AliPayController.java
@@ -202,10 +202,9 @@ public class AliPayController implements IPayService {
}
/**
- * http://localhost:8080/api/v1/alipay/refund_order
- *
+ * http://localhost:8092/api/v1/alipay/refund_order
* {
- * "userId": "xfg02",
+ * "userId": "smile01",
* "orderId": "928263928388"
* }
*/
diff --git a/pom.xml b/pom.xml
index d882b51..a187904 100644
--- a/pom.xml
+++ b/pom.xml
@@ -147,6 +147,14 @@
spring-boot-starter-amqp
3.2.0
+
+
+ org.apache.dubbo
+ dubbo-bom
+ 3.3.5
+ pom
+ import
+
edu.whut