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\n\n
\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\n\n
\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\n\n
\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\n\n
\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\n\n
\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\n\n
\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\n\n
\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
动态切换调用通道: + * + */ @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