Files
MTKJPAY/mt-pay/ARCHITECTURE.md

276 lines
5.9 KiB
Markdown
Raw Normal View History

# PingPong支付对接架构设计文档
## 一、整体架构分析
### 1.1 业务流程
```
用户发起支付
创建支付订单PaymentOrderService
调用PingPong APIPingPongPayService
生成签名SignatureService
返回token和收银台地址
用户跳转到收银台完成支付
PingPong回调通知CallbackService
更新订单状态
业务系统处理
```
### 1.2 技术架构
```
Controller层API接口
Service层业务逻辑
Repository层数据访问
Entity层数据模型
```
## 二、核心模块设计
### 2.1 数据库模型设计
#### PaymentOrder支付订单表
**设计思路:**
- 存储支付订单的完整信息
- 支持订单状态跟踪
- 通过merchantTransactionId保证唯一性
**关键字段:**
- `merchantTransactionId`:商户订单号(唯一索引)
- `transactionId`PingPong交易流水号回调时更新
- `status`订单状态PENDING/SUCCESS/FAILED/REVIEW/CANCELLED
- `token`收银台token
- `paymentUrl`:收银台地址
#### PaymentRecord支付记录表
**设计思路:**
- 记录所有支付相关操作
- 用于对账和问题排查
- 支持多种记录类型CHECKOUT/CALLBACK/QUERY等
**关键字段:**
- `recordType`:记录类型
- `requestData`原始请求数据JSON
- `responseData`原始响应数据JSON
### 2.2 配置管理
#### PingPongProperties
**设计思路:**
- 使用Spring Boot的@ConfigurationProperties
- 支持多环境配置dev/prod
- 配置项包括:商户号、密钥、网关地址、环境模式等
**关键配置:**
```properties
pingpong.client-id=商户号
pingpong.acc-id=店铺编号
pingpong.secret=签名密钥
pingpong.gateway=API网关地址
pingpong.mode=环境模式sandbox/test/build
```
### 2.3 签名服务SignatureService
#### 设计思路
- 实现PingPong的签名算法
- 支持MD5和SHA256
- 自动筛选参与签名的参数
- 提供签名生成和验证功能
#### 签名流程
1. 筛选加签参数根据SIGN_SCOPE
2. 按字典序排序
3. 构建签名串:{secret}key1=val1&key2=val2...
4. MD5/SHA256运算并转大写
#### 关键方法
- `generateSign()`:生成签名
- `verifySign()`:验证签名
- `filterSignParams()`:筛选签名参数
### 2.4 支付服务PingPongPayService
#### 设计思路
- 封装PingPong API调用
- 自动处理签名生成
- 验证响应签名
- 使用RestClient进行HTTP请求
#### 关键方法
- `checkout()`:创建支付订单
- `buildRequestMap()`:构建请求参数
### 2.5 订单服务PaymentOrderService
#### 设计思路
- 管理支付订单生命周期
- 调用PingPong API
- 保存订单和记录
- 提供订单查询功能
#### 关键方法
- `createPaymentOrder()`:创建支付订单
- `findByMerchantTransactionId()`:查询订单
- `updateOrderStatus()`:更新订单状态
### 2.6 回调服务CallbackService
#### 设计思路
- 处理PingPong异步回调
- 验证回调签名
- 更新订单状态
- 触发业务逻辑处理
#### 关键方法
- `handleCallback()`:处理回调
- `mapCallbackStatusToOrderStatus()`:状态映射
- `handleBusinessLogic()`:业务逻辑处理
## 三、API接口设计
### 3.1 支付接口
#### POST /api/payment/checkout
**功能:** 创建支付订单
**请求体:** CheckoutRequestDTO
**响应:** 包含token和paymentUrl
#### GET /api/payment/order/{merchantTransactionId}
**功能:** 查询订单状态
**响应:** 订单详细信息
#### GET /api/payment/checkout/page?token={token}
**功能:** 获取收银台页面
**响应:** HTML页面包含SDK初始化
### 3.2 回调接口
#### POST /api/callback/pingpong
**功能:** 接收PingPong回调通知
**请求体:** Map<String, Object>
**响应:** 处理结果
#### GET /api/callback/result
**功能:** 支付结果页面(用户重定向)
**参数:** merchantTransactionId, status, message
## 四、DTO设计
### 4.1 请求DTO
#### CheckoutRequestDTO
- 包含所有checkout接口必需参数
- 使用Jakarta Validation进行参数校验
- 嵌套RiskInfoDTO
#### RiskInfoDTO
- 包含风控相关信息
- 嵌套多个子DTOCustomerDTO、GoodsDTO等
### 4.2 响应DTO
#### CheckoutResponseDTO
- 对应PingPong API响应
- 包含token、paymentUrl等
## 五、异常处理
### 5.1 GlobalExceptionHandler
- 统一异常处理
- 参数验证异常处理
- 运行时异常处理
- 返回统一错误格式
## 六、安全考虑
### 6.1 签名验证
- 所有回调都进行签名验证
- 防止数据篡改
### 6.2 订单号唯一性
- 数据库唯一索引保证
- 业务层检查重复
### 6.3 敏感信息
- 密钥存储在配置文件中
- 生产环境使用环境变量
## 七、扩展性设计
### 7.1 多支付平台支持
- 可以扩展为支付平台抽象接口
- 每个平台实现独立服务
### 7.2 预授权功能
- 支持AUTH/CAPTURE/VOID
- 通过paymentType区分
### 7.3 订单状态机
- 可扩展为状态机模式
- 支持更复杂的状态流转
## 八、最佳实践
### 8.1 日志记录
- 关键操作记录日志
- 包含订单号、状态等信息
### 8.2 事务管理
- 订单创建和更新使用事务
- 保证数据一致性
### 8.3 错误处理
- 友好的错误提示
- 详细的错误日志
### 8.4 配置管理
- 多环境配置分离
- 敏感信息加密
## 九、测试建议
### 9.1 单元测试
- 签名服务测试
- 服务层逻辑测试
### 9.2 集成测试
- API接口测试
- 回调处理测试
### 9.3 沙箱测试
- 使用PingPong沙箱环境
- 测试各种支付场景
## 十、部署注意事项
### 10.1 环境配置
- 开发环境使用sandbox模式
- 生产环境必须使用build模式
### 10.2 数据库
- 生产环境使用连接池
- 定期备份订单数据
### 10.3 监控
- 监控API调用成功率
- 监控回调处理情况
- 监控订单状态分布