基于DDD架构的支付模块,支持微信支付Native和支付宝当面付二维码支付。
dryad-payment/
├── src/main/java/com/ruoyi/payment/
│ ├── PaymentApplication.java # 启动类
│ ├── common/ # 通用类
│ │ └── AjaxResult.java # 统一响应结果
│ ├── domain/ # 领域层
│ │ ├── enums/ # 枚举
│ │ │ ├── PayChannel.java # 支付渠道
│ │ │ ├── OrderStatus.java # 订单状态
│ │ │ ├── TransactionStatus.java # 交易状态
│ │ │ └── ClientType.java # 客户端类型
│ │ └── model/ # 领域模型
│ │ ├── PaymentOrder.java # 支付订单(聚合根)
│ │ ├── PaymentTransaction.java # 支付交易
│ │ ├── NotifyLog.java # 渠道回调日志
│ │ ├── BizCallbackLog.java # 业务回调日志
│ │ └── OperationAudit.java # 操作审计
│ ├── application/ # 应用层
│ │ └── service/
│ │ └── PaymentService.java # 支付应用服务
│ ├── infrastructure/ # 基础设施层
│ │ ├── config/ # 配置
│ │ │ ├── WechatPayConfig.java # 微信支付配置
│ │ │ ├── AlipayConfig.java # 支付宝配置
│ │ │ ├── BusinessCallbackConfig.java # 业务回调配置
│ │ │ └── QrCodeConfig.java # 二维码配置
│ │ ├── persistence/ # 持久化
│ │ │ └── mapper/ # MyBatis Mapper
│ │ │ ├── PaymentOrderMapper.java
│ │ │ ├── PaymentTransactionMapper.java
│ │ │ ├── NotifyLogMapper.java
│ │ │ ├── BizCallbackLogMapper.java
│ │ │ └── OperationAuditMapper.java
│ │ └── util/ # 工具类
│ │ ├── QrCodeUtil.java # 二维码生成工具
│ │ └── SignUtil.java # 签名工具
│ └── interfaces/ # 接口层
│ ├── controller/ # 控制器
│ │ ├── PaymentController.java # 支付接口
│ │ └── PaymentNotifyController.java# 回调接口
│ └── dto/ # 数据传输对象
│ ├── PaymentRequest.java # 支付请求
│ └── PaymentResponse.java # 支付响应
├── src/main/resources/
│ ├── application.yml # 配置文件
│ ├── mapper/ # MyBatis XML
│ │ ├── PaymentOrderMapper.xml
│ │ └── PaymentTransactionMapper.xml
│ └── sql/
│ └── schema.sql # 数据库表结构
├── doc/
│ └── 设计方案.md # 详细设计文档
└── pom.xml # Maven配置
需要完善以下内容:
- WxPayV2Client: 微信v2统一下单、查询、关闭、签名验证
- AlipayF2FClient: 支付宝当面付下单、查询、关闭、签名验证
当前PaymentService中的 callWechatUnifiedOrder() 和 callAlipayPrecreate() 是模拟实现。
需要完善 PaymentNotifyController 中的TODO部分:
- 微信XML报文解析与签名验证
- 支付宝参数验证与签名验证
- 订单和交易状态更新逻辑
- 触发业务回调逻辑
- 记录NotifyLog实现幂等
需要实现:
- BizCallbackService: 外部业务回调触发
- HMAC-SHA256签名生成
- HTTP POST调用
- 重试机制(0/1/5/15/60分钟)
- 记录BizCallbackLog
需要实现:
- ReconciliationTask: @Scheduled定时任务
- 调用渠道查询接口对比状态
- 自动修复状态差异
- 生成对账报告
需要实现:
- 定时任务检查过期订单
- 将超过2小时未支付的订单标记为EXPIRED
需要实现:
- 订单列表查询
- 交易流水查询
- 回调日志查询
- 手工重发业务回调
- 对账任务查询
- 操作审计记录
# 执行SQL脚本创建数据库和表
mysql -u root -p < src/main/resources/sql/schema.sql
修改 src/main/resources/application.yml:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/dryad_payment?...
username: your_username
password: your_password
payment:
wechat:
appId: your_wechat_appid
mchId: your_wechat_mchid
mchKey: your_wechat_mchkey
alipay:
appId: your_alipay_appid
privateKey: your_alipay_private_key
alipayPublicKey: alipay_public_key
```
# 编译
mvn clean package
# 运行
java -jar target/dryad-payment-1.0.0.jar
# 或直接运行
mvn spring-boot:run
# 发起微信Native支付
curl -X POST http://localhost:8080/api/pay/wechat/native \
-H "Content-Type: application/json" \
-d '{
"bizOrderId": "TEST20251123001",
"amount": 100,
"subject": "测试订单",
"description": "这是一个测试订单",
"callbackUrl": "http://your-domain.com/callback"
}'
# 查询订单
curl http://localhost:8080/api/pay/orders/1
在 PaymentService 中已实现:java // 检查是否存在待支付交易 PaymentTransaction existingTransaction = paymentTransactionMapper.selectPendingByOrderId(order.getId()); if (existingTransaction != null) { // 直接返回已有交易 return buildPaymentResponse(order, existingTransaction); }
创建订单时设置:java order.setExpireAt(LocalDateTime.now().plusHours(2));
使用ZXing生成300×300 PNG二维码并转换为Base64。
doc/设计方案.md本项目仅供学习使用。