# 订单系统 - 补单支付功能
## 功能说明
订单支付功能已升级,现在支持两种支付方式:
- ✅ **正常支付**: 从订单列表选择订单进行支付
- ✅ **补单支付**: 输入订单号进行支付(用于补单场景)
---
## 前端实现
### 支付弹窗
支付弹窗现在包含两种支付类型选择:
```vue
正常支付
补单支付
```
### 正常支付
显示订单号和订单金额:
```vue
{{ payForm.order_no }}
¥{{ payForm.amount }}
```
### 补单支付
输入支付订单号:
```vue
```
### 支付方式
两种支付类型都支持选择支付方式:
```vue
支付宝
微信
银行卡
```
### 支付表单数据结构
```typescript
const payForm = ref({
order_id: 0, // 订单ID(正常支付)
order_no: '', // 订单号(显示用)
amount: 0, // 订单金额(显示用)
payment_method: 'alipay', // 支付方式
payType: 'normal', // 支付类型:normal/supplement
supplement_order_no: '' // 补单订单号(补单支付)
})
```
### 支付逻辑
```typescript
const confirmPay = async () => {
// 验证补单支付的订单号
if (payForm.value.payType === 'supplement' && !payForm.value.supplement_order_no) {
feedback.msgWarning('请输入支付订单号')
return
}
if (payForm.value.payType === 'normal') {
// 正常支付:使用订单ID
await orderPay({
id: payForm.value.order_id,
payment_method: payForm.value.payment_method
})
} else {
// 补单支付:使用订单号
await orderPay({
order_no: payForm.value.supplement_order_no,
payment_method: payForm.value.payment_method,
is_supplement: 1
})
}
}
```
---
## 后端实现
### 验证规则更新
`OrderValidate` 中的 pay 场景验证已更新:
```php
'pay' => ['payment_method'], // 只验证支付方式
```
支持的参数:
- `id`: 订单ID(正常支付)
- `order_no`: 订单号(补单支付)
- `payment_method`: 支付方式(必填)
- `is_supplement`: 是否补单支付(0/1)
### 控制器逻辑
`OrderController::pay()` 方法现在支持两种支付方式:
```php
public function pay()
{
$params = (new OrderValidate())->post()->goCheck('pay');
// 判断是否是补单支付
if (!empty($params['is_supplement']) && $params['is_supplement'] == 1) {
// 补单支付:通过订单号查找订单
if (empty($params['order_no'])) {
return $this->fail('补单支付需要提供订单号');
}
$order = Order::where('order_no', $params['order_no'])->find();
if (!$order) {
return $this->fail('订单不存在');
}
$orderId = $order->id;
} else {
// 正常支付:通过订单ID
if (empty($params['id'])) {
return $this->fail('订单ID不能为空');
}
$orderId = (int)$params['id'];
}
$result = OrderLogic::pay($orderId, $params['payment_method']);
if (!$result) {
return $this->fail(OrderLogic::getError());
}
return $this->success('支付成功');
}
```
---
## API 调用示例
### 正常支付
```bash
POST /order.order/pay
{
"id": 1,
"payment_method": "alipay"
}
```
### 补单支付
```bash
POST /order.order/pay
{
"order_no": "ORD20260310123456789",
"payment_method": "wechat",
"is_supplement": 1
}
```
---
## 使用流程
### 正常支付流程
1. 用户在订单列表中点击"支付"按钮
2. 弹窗打开,默认选择"正常支付"
3. 显示订单号和订单金额
4. 选择支付方式
5. 点击"确认支付"
### 补单支付流程
1. 用户打开支付弹窗
2. 选择"补单支付"
3. 输入支付订单号
4. 选择支付方式
5. 点击"确认支付"
---
## 错误处理
### 前端验证
- 补单支付时必须输入订单号
- 支付方式必须选择
### 后端验证
- 补单支付时订单号必须存在
- 订单必须存在于数据库中
- 支付方式必须有效
---
## 相关文件
### 前端
- `admin/src/views/order/index.vue` - 订单列表页面
- `admin/src/api/order.ts` - 订单API接口
### 后端
- `server/app/adminapi/controller/order/OrderController.php` - 订单控制器
- `server/app/adminapi/validate/order/OrderValidate.php` - 订单验证
- `server/app/adminapi/logic/order/OrderLogic.php` - 订单业务逻辑
---
## 版本信息
- **功能版本**: 1.4.0
- **实现日期**: 2026-03-10
- **功能类型**: 支付功能扩展
- **状态**: ✅ 完成
---
**功能实现完成** ✅