Files
makemd/archive/handover/payment-api.md
wurenzhi 136c2fa579 feat: 初始化项目结构并添加核心功能模块
- 新增文档模板和导航结构
- 实现服务器基础API路由和控制器
- 添加扩展插件配置和前端框架
- 引入多租户和权限管理模块
- 集成日志和数据库配置
- 添加核心业务模型和类型定义
2026-03-17 22:07:19 +08:00

410 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 支付服务 API 文档
## 1. 概述
支付服务PaymentService提供了全面的支付处理功能支持多种支付渠道支付宝、微信支付、银联等包括支付创建、回调处理、退款处理、对账等核心功能。
## 2. 核心功能
- **支付创建**:支持多种支付渠道的支付请求创建
- **支付回调**:处理支付渠道的异步回调通知
- **退款处理**:支持发起和处理退款请求
- **支付状态查询**:查询支付状态
- **支付列表**:获取支付记录列表,支持分页和过滤
- **支付统计**:获取支付相关的统计数据
- **对账功能**:支持单日对账和批量对账
- **对账报表**:生成对账报表
- **批量处理**:支持批量处理支付记录
## 3. API 端点
### 3.1 创建支付
**请求路径**`POST /api/payments`
**请求参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| tenantId | string | 是 | 租户ID |
| orderId | string | 是 | 订单ID |
| amount | number | 是 | 支付金额 |
| currency | string | 是 | 货币类型,如 USD、CNY |
| paymentMethod | string | 是 | 支付方式ALIPAY、WECHAT、UNIONPAY、STRIPE |
| returnUrl | string | 否 | 支付完成后返回地址 |
| notifyUrl | string | 否 | 支付回调通知地址 |
| metadata | object | 否 | 附加信息JSON格式 |
**响应格式**
```json
{
"paymentId": "PAY-1234567890-12345",
"redirectUrl": "https://openapi.alipay.com/gateway.do?orderId=PAY-1234567890-12345",
"qrCodeUrl": "https://wx.tenpay.com/qrcode?orderId=PAY-1234567890-12345",
"status": "PENDING"
}
```
### 3.2 处理支付回调
**请求路径**`POST /api/payments/callback`
**请求参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| paymentId | string | 是 | 支付ID |
| orderId | string | 是 | 订单ID |
| status | string | 是 | 支付状态SUCCESS、FAILED |
| transactionId | string | 是 | 交易ID |
| amount | number | 是 | 支付金额 |
| currency | string | 是 | 货币类型 |
| timestamp | string | 是 | 回调时间戳 |
| signature | string | 是 | 签名,用于验证回调真实性 |
**响应格式**
```json
{
"success": true
}
```
### 3.3 发起退款
**请求路径**`POST /api/payments/refund`
**请求参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| tenantId | string | 是 | 租户ID |
| paymentId | string | 是 | 支付ID |
| orderId | string | 是 | 订单ID |
| amount | number | 是 | 退款金额 |
| reason | string | 是 | 退款原因 |
**响应格式**
```json
{
"refundId": "REFUND-1234567890-12345"
}
```
### 3.4 查询支付状态
**请求路径**`GET /api/payments/{paymentId}/status`
**响应格式**
```json
{
"status": "SUCCESS"
}
```
### 3.5 获取支付列表
**请求路径**`GET /api/payments`
**查询参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| tenantId | string | 是 | 租户ID |
| page | number | 否 | 页码默认1 |
| pageSize | number | 否 | 每页数量默认20 |
| status | string | 否 | 支付状态过滤 |
| paymentMethod | string | 否 | 支付方式过滤 |
| startDate | string | 否 | 开始日期格式YYYY-MM-DD |
| endDate | string | 否 | 结束日期格式YYYY-MM-DD |
**响应格式**
```json
{
"payments": [
{
"id": "PAY-1234567890-12345",
"tenant_id": "tenant-1",
"order_id": "order-1",
"amount": 100,
"currency": "USD",
"payment_method": "ALIPAY",
"status": "SUCCESS",
"transaction_id": "trans-123456",
"created_at": "2026-03-17T10:00:00Z",
"updated_at": "2026-03-17T10:05:00Z"
}
],
"total": 100
}
```
### 3.6 获取支付统计
**请求路径**`GET /api/payments/stats`
**查询参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| tenantId | string | 是 | 租户ID |
| startDate | string | 是 | 开始日期格式YYYY-MM-DD |
| endDate | string | 是 | 结束日期格式YYYY-MM-DD |
**响应格式**
```json
{
"totalAmount": 10000,
"completedAmount": 8000,
"failedAmount": 1000,
"refundedAmount": 500,
"statusCounts": [
{
"status": "SUCCESS",
"count": 80,
"amount": 8000
},
{
"status": "FAILED",
"count": 10,
"amount": 1000
}
],
"paymentMethodStats": [
{
"paymentMethod": "ALIPAY",
"count": 50,
"amount": 5000
},
{
"paymentMethod": "WECHAT",
"count": 30,
"amount": 3000
}
]
}
```
### 3.7 对账
**请求路径**`GET /api/payments/reconcile`
**查询参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| tenantId | string | 是 | 租户ID |
| date | string | 是 | 对账日期格式YYYY-MM-DD |
| paymentMethod | string | 否 | 支付方式过滤 |
**响应格式**
```json
{
"date": "2026-03-17",
"paymentMethod": "ALIPAY",
"payments": {
"total": 10,
"successful": 8,
"pending": 1,
"failed": 1,
"totalAmount": 1000
},
"refunds": {
"total": 2,
"successful": 2,
"totalAmount": 200
},
"netAmount": 800
}
```
### 3.8 批量处理支付
**请求路径**`POST /api/payments/batch`
**请求参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| tenantId | string | 是 | 租户ID |
| paymentIds | array | 是 | 支付ID数组 |
| action | string | 是 | 操作类型SYNC_STATUS、CANCEL |
**响应格式**
```json
{
"success": 5,
"failed": 0
}
```
### 3.9 生成对账报表
**请求路径**`GET /api/payments/reconciliation-report`
**查询参数**
| 参数名 | 类型 | 必填 | 描述 |
|-------|------|------|------|
| tenantId | string | 是 | 租户ID |
| startDate | string | 是 | 开始日期格式YYYY-MM-DD |
| endDate | string | 是 | 结束日期格式YYYY-MM-DD |
**响应格式**
```json
{
"tenantId": "tenant-1",
"period": {
"startDate": "2026-03-01",
"endDate": "2026-03-31"
},
"summary": {
"totalPayments": 300,
"successfulPayments": 250,
"totalPaymentAmount": 30000,
"totalRefunds": 50,
"successfulRefunds": 45,
"totalRefundAmount": 5000,
"netAmount": 25000
},
"dailyResults": [
{
"date": "2026-03-01",
"payments": {
"total": 10,
"successful": 8,
"pending": 1,
"failed": 1,
"totalAmount": 1000
},
"refunds": {
"total": 2,
"successful": 2,
"totalAmount": 200
},
"netAmount": 800
}
],
"generatedAt": "2026-03-31T23:59:59Z"
}
```
## 4. 数据模型
### 4.1 支付记录 (cf_payments)
| 字段名 | 类型 | 描述 |
|-------|------|------|
| id | string | 支付ID格式PAY-时间戳-随机数 |
| tenant_id | string | 租户ID |
| order_id | string | 订单ID |
| amount | decimal(10,2) | 支付金额 |
| currency | string | 货币类型 |
| payment_method | string | 支付方式 |
| status | string | 支付状态PENDING、SUCCESS、FAILED |
| transaction_id | string | 交易ID |
| redirect_url | string | 支付跳转URL |
| qr_code_url | string | 二维码URL |
| metadata | text | 附加信息JSON格式 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
### 4.2 退款记录 (cf_refunds)
| 字段名 | 类型 | 描述 |
|-------|------|------|
| id | string | 退款ID格式REFUND-时间戳-随机数 |
| tenant_id | string | 租户ID |
| payment_id | string | 支付ID |
| order_id | string | 订单ID |
| amount | decimal(10,2) | 退款金额 |
| currency | string | 货币类型 |
| status | string | 退款状态PENDING、SUCCESS、FAILED |
| reason | string | 退款原因 |
| transaction_id | string | 退款交易ID |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
## 5. 错误处理
| 错误码 | 描述 |
|-------|------|
| 400 | 请求参数错误 |
| 401 | 未授权 |
| 404 | 支付记录不存在 |
| 500 | 服务器内部错误 |
## 6. 性能指标
- **支付创建响应时间**< 1秒
- **支付状态查询响应时间**< 500ms
- **支付列表查询响应时间**< 1秒
- **支付统计响应时间**< 2秒
- **对账响应时间**< 3秒
## 7. 安全注意事项
- 支付回调必须验证签名,确保回调的真实性
- 敏感信息(如支付凭证)不应存储在数据库中
- 所有API请求必须进行身份验证和权限检查
- 支付相关操作应记录详细的审计日志
## 8. 集成示例
### 8.1 创建支付示例
```javascript
// 前端调用示例
async function createPayment() {
const response = await fetch('/api/payments', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_TOKEN'
},
body: JSON.stringify({
tenantId: 'tenant-1',
orderId: 'order-123',
amount: 100,
currency: 'USD',
paymentMethod: 'ALIPAY',
returnUrl: 'https://example.com/return',
notifyUrl: 'https://example.com/notify'
})
});
const result = await response.json();
if (result.paymentId) {
// 跳转到支付页面或显示二维码
window.location.href = result.redirectUrl;
}
}
```
### 8.2 处理支付回调示例
```javascript
// 后端处理回调示例
app.post('/api/payments/callback', async (req, res) => {
try {
const callbackData = req.body;
const success = await PaymentService.handleCallback(callbackData);
res.json({ success });
} catch (error) {
res.status(500).json({ success: false, error: error.message });
}
});
```
## 9. 总结
支付服务 API 提供了完整的支付处理功能,支持多种支付渠道,满足不同场景的支付需求。通过合理的缓存机制和异步处理,确保了支付处理的高效性和可靠性。