423 lines
8.5 KiB
Markdown
423 lines
8.5 KiB
Markdown
|
|
# 支付系统API文档
|
||
|
|
|
||
|
|
## 概述
|
||
|
|
|
||
|
|
支付系统提供完整的支付流程管理,包括支付订单创建、状态查询、退款处理等功能。支持微信支付、支付宝支付和余额支付三种支付方式。
|
||
|
|
|
||
|
|
## 基础信息
|
||
|
|
|
||
|
|
- **基础URL**: `/api/v1/payments`
|
||
|
|
- **认证方式**: Bearer Token
|
||
|
|
- **数据格式**: JSON
|
||
|
|
|
||
|
|
## 数据模型
|
||
|
|
|
||
|
|
### 支付订单 (Payment)
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"id": 1,
|
||
|
|
"payment_no": "PAY202401010001",
|
||
|
|
"order_id": 1,
|
||
|
|
"user_id": 1,
|
||
|
|
"amount": 299.00,
|
||
|
|
"paid_amount": 299.00,
|
||
|
|
"payment_method": "wechat",
|
||
|
|
"status": "paid",
|
||
|
|
"transaction_id": "wx_transaction_123",
|
||
|
|
"paid_at": "2024-01-01T10:00:00Z",
|
||
|
|
"created_at": "2024-01-01T09:00:00Z",
|
||
|
|
"updated_at": "2024-01-01T10:00:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 退款记录 (Refund)
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"id": 1,
|
||
|
|
"refund_no": "REF202401010001",
|
||
|
|
"payment_id": 1,
|
||
|
|
"user_id": 1,
|
||
|
|
"refund_amount": 100.00,
|
||
|
|
"refund_reason": "用户申请退款",
|
||
|
|
"status": "completed",
|
||
|
|
"processed_by": 2,
|
||
|
|
"process_remark": "同意退款",
|
||
|
|
"processed_at": "2024-01-01T11:00:00Z",
|
||
|
|
"refunded_at": "2024-01-01T11:30:00Z",
|
||
|
|
"created_at": "2024-01-01T10:30:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## API接口
|
||
|
|
|
||
|
|
### 1. 创建支付订单
|
||
|
|
|
||
|
|
**接口**: `POST /api/v1/payments`
|
||
|
|
|
||
|
|
**描述**: 为订单创建支付订单
|
||
|
|
|
||
|
|
**请求参数**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"order_id": 1,
|
||
|
|
"amount": 299.00,
|
||
|
|
"payment_method": "wechat",
|
||
|
|
"return_url": "https://example.com/success"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**参数说明**:
|
||
|
|
- `order_id` (必填): 订单ID
|
||
|
|
- `amount` (必填): 支付金额
|
||
|
|
- `payment_method` (必填): 支付方式 (wechat/alipay/balance)
|
||
|
|
- `return_url` (可选): 支付成功回调地址
|
||
|
|
|
||
|
|
**响应示例**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"message": "支付订单创建成功",
|
||
|
|
"data": {
|
||
|
|
"id": 1,
|
||
|
|
"payment_no": "PAY202401010001",
|
||
|
|
"order_id": 1,
|
||
|
|
"amount": 299.00,
|
||
|
|
"payment_method": "wechat",
|
||
|
|
"status": "pending",
|
||
|
|
"payment_params": {
|
||
|
|
"prepay_id": "wx_prepay_123",
|
||
|
|
"code_url": "weixin://wxpay/bizpayurl?pr=abc123"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. 获取支付订单详情
|
||
|
|
|
||
|
|
**接口**: `GET /api/v1/payments/{paymentId}`
|
||
|
|
|
||
|
|
**描述**: 获取指定支付订单的详细信息
|
||
|
|
|
||
|
|
**路径参数**:
|
||
|
|
- `paymentId`: 支付订单ID
|
||
|
|
|
||
|
|
**响应示例**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"data": {
|
||
|
|
"id": 1,
|
||
|
|
"payment_no": "PAY202401010001",
|
||
|
|
"order_id": 1,
|
||
|
|
"user_id": 1,
|
||
|
|
"amount": 299.00,
|
||
|
|
"paid_amount": 299.00,
|
||
|
|
"payment_method": "wechat",
|
||
|
|
"status": "paid",
|
||
|
|
"transaction_id": "wx_transaction_123",
|
||
|
|
"paid_at": "2024-01-01T10:00:00Z",
|
||
|
|
"order_no": "ORD202401010001",
|
||
|
|
"username": "张三",
|
||
|
|
"phone": "13800138000"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 查询支付状态
|
||
|
|
|
||
|
|
**接口**: `GET /api/v1/payments/query/{paymentNo}`
|
||
|
|
|
||
|
|
**描述**: 根据支付订单号查询支付状态
|
||
|
|
|
||
|
|
**路径参数**:
|
||
|
|
- `paymentNo`: 支付订单号
|
||
|
|
|
||
|
|
**响应示例**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"data": {
|
||
|
|
"payment_no": "PAY202401010001",
|
||
|
|
"status": "paid",
|
||
|
|
"amount": 299.00,
|
||
|
|
"paid_at": "2024-01-01T10:00:00Z",
|
||
|
|
"transaction_id": "wx_transaction_123"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. 支付回调接口
|
||
|
|
|
||
|
|
#### 微信支付回调
|
||
|
|
|
||
|
|
**接口**: `POST /api/v1/payments/callback/wechat`
|
||
|
|
|
||
|
|
**描述**: 微信支付异步通知接口
|
||
|
|
|
||
|
|
**请求格式**: XML
|
||
|
|
|
||
|
|
**响应格式**: XML
|
||
|
|
|
||
|
|
#### 支付宝回调
|
||
|
|
|
||
|
|
**接口**: `POST /api/v1/payments/callback/alipay`
|
||
|
|
|
||
|
|
**描述**: 支付宝异步通知接口
|
||
|
|
|
||
|
|
**请求格式**: Form Data
|
||
|
|
|
||
|
|
**响应格式**: 文本 (success/fail)
|
||
|
|
|
||
|
|
### 5. 申请退款
|
||
|
|
|
||
|
|
**接口**: `POST /api/v1/payments/{paymentId}/refund`
|
||
|
|
|
||
|
|
**描述**: 为已支付的订单申请退款
|
||
|
|
|
||
|
|
**路径参数**:
|
||
|
|
- `paymentId`: 支付订单ID
|
||
|
|
|
||
|
|
**请求参数**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"refund_amount": 100.00,
|
||
|
|
"refund_reason": "商品质量问题"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**参数说明**:
|
||
|
|
- `refund_amount` (必填): 退款金额
|
||
|
|
- `refund_reason` (必填): 退款原因
|
||
|
|
|
||
|
|
**响应示例**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"message": "退款申请提交成功",
|
||
|
|
"data": {
|
||
|
|
"id": 1,
|
||
|
|
"refund_no": "REF202401010001",
|
||
|
|
"payment_id": 1,
|
||
|
|
"refund_amount": 100.00,
|
||
|
|
"refund_reason": "商品质量问题",
|
||
|
|
"status": "pending",
|
||
|
|
"created_at": "2024-01-01T10:30:00Z"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. 获取退款详情
|
||
|
|
|
||
|
|
**接口**: `GET /api/v1/payments/refunds/{refundId}`
|
||
|
|
|
||
|
|
**描述**: 获取退款记录详情
|
||
|
|
|
||
|
|
**路径参数**:
|
||
|
|
- `refundId`: 退款ID
|
||
|
|
|
||
|
|
**响应示例**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"data": {
|
||
|
|
"id": 1,
|
||
|
|
"refund_no": "REF202401010001",
|
||
|
|
"payment_id": 1,
|
||
|
|
"refund_amount": 100.00,
|
||
|
|
"refund_reason": "商品质量问题",
|
||
|
|
"status": "completed",
|
||
|
|
"processed_by": 2,
|
||
|
|
"process_remark": "同意退款",
|
||
|
|
"processed_at": "2024-01-01T11:00:00Z",
|
||
|
|
"refunded_at": "2024-01-01T11:30:00Z",
|
||
|
|
"payment_no": "PAY202401010001",
|
||
|
|
"username": "张三",
|
||
|
|
"processed_by_name": "管理员"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 7. 处理退款(管理员)
|
||
|
|
|
||
|
|
**接口**: `PUT /api/v1/payments/refunds/{refundId}/process`
|
||
|
|
|
||
|
|
**描述**: 管理员处理退款申请
|
||
|
|
|
||
|
|
**权限**: 管理员
|
||
|
|
|
||
|
|
**路径参数**:
|
||
|
|
- `refundId`: 退款ID
|
||
|
|
|
||
|
|
**请求参数**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"status": "approved",
|
||
|
|
"process_remark": "同意退款申请"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**参数说明**:
|
||
|
|
- `status` (必填): 退款状态 (approved/rejected/completed)
|
||
|
|
- `process_remark` (可选): 处理备注
|
||
|
|
|
||
|
|
**响应示例**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"message": "退款处理成功",
|
||
|
|
"data": {
|
||
|
|
"id": 1,
|
||
|
|
"refund_no": "REF202401010001",
|
||
|
|
"status": "approved",
|
||
|
|
"processed_by": 2,
|
||
|
|
"process_remark": "同意退款申请",
|
||
|
|
"processed_at": "2024-01-01T11:00:00Z"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 8. 获取支付统计信息(管理员)
|
||
|
|
|
||
|
|
**接口**: `GET /api/v1/payments/statistics`
|
||
|
|
|
||
|
|
**描述**: 获取支付相关的统计信息
|
||
|
|
|
||
|
|
**权限**: 管理员
|
||
|
|
|
||
|
|
**查询参数**:
|
||
|
|
- `start_date` (可选): 开始日期 (YYYY-MM-DD)
|
||
|
|
- `end_date` (可选): 结束日期 (YYYY-MM-DD)
|
||
|
|
- `payment_method` (可选): 支付方式
|
||
|
|
|
||
|
|
**响应示例**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"data": {
|
||
|
|
"total_count": 100,
|
||
|
|
"total_amount": 29900.00,
|
||
|
|
"success_count": 85,
|
||
|
|
"success_amount": 25415.00,
|
||
|
|
"refund_count": 5,
|
||
|
|
"refund_amount": 1500.00,
|
||
|
|
"method_stats": [
|
||
|
|
{
|
||
|
|
"payment_method": "wechat",
|
||
|
|
"count": 50,
|
||
|
|
"amount": 15000.00
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"payment_method": "alipay",
|
||
|
|
"count": 35,
|
||
|
|
"amount": 10415.00
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 状态说明
|
||
|
|
|
||
|
|
### 支付状态 (Payment Status)
|
||
|
|
|
||
|
|
- `pending`: 待支付
|
||
|
|
- `paid`: 已支付
|
||
|
|
- `failed`: 支付失败
|
||
|
|
- `refunded`: 已退款
|
||
|
|
- `cancelled`: 已取消
|
||
|
|
|
||
|
|
### 退款状态 (Refund Status)
|
||
|
|
|
||
|
|
- `pending`: 待处理
|
||
|
|
- `approved`: 已同意
|
||
|
|
- `rejected`: 已拒绝
|
||
|
|
- `completed`: 已完成
|
||
|
|
|
||
|
|
## 支付方式
|
||
|
|
|
||
|
|
- `wechat`: 微信支付
|
||
|
|
- `alipay`: 支付宝支付
|
||
|
|
- `balance`: 余额支付
|
||
|
|
|
||
|
|
## 错误码说明
|
||
|
|
|
||
|
|
| 错误码 | 说明 |
|
||
|
|
|--------|------|
|
||
|
|
| 400 | 参数错误 |
|
||
|
|
| 401 | 未授权 |
|
||
|
|
| 403 | 权限不足 |
|
||
|
|
| 404 | 资源不存在 |
|
||
|
|
| 500 | 服务器内部错误 |
|
||
|
|
|
||
|
|
## 注意事项
|
||
|
|
|
||
|
|
1. **安全性**: 所有支付相关接口都需要用户认证
|
||
|
|
2. **权限控制**: 用户只能操作自己的支付订单和退款记录
|
||
|
|
3. **金额精度**: 所有金额字段保留两位小数
|
||
|
|
4. **回调验证**: 支付回调需要验证签名确保安全性
|
||
|
|
5. **幂等性**: 支付订单创建支持幂等性,避免重复创建
|
||
|
|
6. **超时处理**: 待支付订单会在24小时后自动取消
|
||
|
|
|
||
|
|
## 集成示例
|
||
|
|
|
||
|
|
### 创建支付订单示例
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// 创建支付订单
|
||
|
|
const createPayment = async (orderData) => {
|
||
|
|
try {
|
||
|
|
const response = await fetch('/api/v1/payments', {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
'Authorization': `Bearer ${token}`
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
order_id: orderData.orderId,
|
||
|
|
amount: orderData.amount,
|
||
|
|
payment_method: 'wechat',
|
||
|
|
return_url: 'https://example.com/success'
|
||
|
|
})
|
||
|
|
});
|
||
|
|
|
||
|
|
const result = await response.json();
|
||
|
|
if (result.success) {
|
||
|
|
// 跳转到支付页面或调用支付SDK
|
||
|
|
handlePayment(result.data);
|
||
|
|
}
|
||
|
|
} catch (error) {
|
||
|
|
console.error('创建支付订单失败:', error);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
### 查询支付状态示例
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// 轮询查询支付状态
|
||
|
|
const checkPaymentStatus = async (paymentNo) => {
|
||
|
|
try {
|
||
|
|
const response = await fetch(`/api/v1/payments/query/${paymentNo}`, {
|
||
|
|
headers: {
|
||
|
|
'Authorization': `Bearer ${token}`
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
const result = await response.json();
|
||
|
|
if (result.success) {
|
||
|
|
const status = result.data.status;
|
||
|
|
if (status === 'paid') {
|
||
|
|
// 支付成功处理
|
||
|
|
handlePaymentSuccess();
|
||
|
|
} else if (status === 'failed') {
|
||
|
|
// 支付失败处理
|
||
|
|
handlePaymentFailed();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch (error) {
|
||
|
|
console.error('查询支付状态失败:', error);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
```
|