Files
MTKJPAY/mt-pay/PAYPAL_ORDER_LIFECYCLE.md

83 lines
3.0 KiB
Markdown
Raw Normal View History

# PayPal订单生命周期和字段填充说明
## 订单状态流转
PayPal订单会经历以下状态
1. **CREATED** - 订单已创建(初始状态)
2. **PAYER_ACTION_REQUIRED** - 需要付款人操作跳转到PayPal登录页
3. **APPROVED** - 订单已批准用户在PayPal批准支付
4. **COMPLETED** - 订单已完成(订单被捕获后)
## 字段填充时机
### 创建订单时CREATED状态
以下字段在创建订单时通常为 **null**,这是**正常现象**
- `payer_email` - null用户尚未登录PayPal
- `payer_name` - null用户尚未登录PayPal
- `payer_id` - null用户尚未登录PayPal
- `payment_status` - null尚未支付
- `capture_id` - null尚未捕获订单
**原因**创建订单时用户还没有在PayPal登录和批准支付所以PayPal不会返回这些信息。
### 用户批准订单后APPROVED状态
以下字段会被填充:
- `payer_email` - 用户PayPal邮箱
- `payer_name` - 用户PayPal姓名
- `payer_id` - 用户PayPal账户ID
- `payment_status` - 仍为null尚未捕获
- `capture_id` - 仍为null尚未捕获
**触发时机**
- 用户点击"立即支付"后跳转到PayPal
- 用户在PayPal登录并批准支付
- 系统通过Webhook事件 `CHECKOUT.ORDER.APPROVED` 或查询订单详情获取
### 订单被捕获后COMPLETED状态
以下字段会被填充:
- `payment_status` - 支付状态COMPLETED
- `capture_id` - 支付捕获ID
**触发时机**
- 调用 `/api/paypal/orders/{orderId}/capture` 接口捕获订单
- 系统通过Webhook事件 `PAYMENT.CAPTURE.COMPLETED` 获取
## 与沙箱测试的关系
**这些字段为null与沙箱测试环境无关**这是PayPal订单的正常生命周期
- 在**生产环境**中如果订单状态为CREATED这些字段同样为null
- 只有在用户完成PayPal登录、批准支付、订单被捕获后这些字段才会被填充
- 沙箱环境和生产环境的行为是一致的
## 如何查看完整信息
1. **查看 `order_data` 字段**该字段存储了PayPal返回的完整JSON响应包含所有信息
2. **查询订单详情**:调用 `/api/paypal/orders/{orderId}` 接口,系统会自动更新订单信息
3. **等待Webhook事件**PayPal会发送Webhook事件系统会自动更新订单信息
## 代码更新逻辑
系统会在以下时机自动更新订单信息:
1. **创建订单时**:调用 `createPaymentOrder` 方法
2. **查询订单时**:调用 `getOrder` 接口,自动调用 `updateOrderFromPayPal` 方法
3. **捕获订单时**:调用 `captureOrder` 接口,自动调用 `updateOrderFromPayPal` 方法
4. **Webhook事件**处理Webhook事件时自动调用 `updateOrderFromPayPal` 方法
## 建议
如果需要在订单创建后立即获取payer信息可以
1. 在用户从PayPal返回后调用 `getOrder` 接口查询订单详情
2. 配置Webhook监听 `CHECKOUT.ORDER.APPROVED` 事件
3. 在订单确认页面加载时主动查询一次PayPal订单详情