Skip to content

状态定义

本文档定义了支付系统中使用的所有状态码,包括交易状态、订单状态等。

交易状态 (trade_state)

交易状态用于表示订单在支付渠道中的实时状态,综合了微信支付和支付宝的状态定义。

状态列表

状态码状态名称说明适用渠道是否终态
SUCCESS支付成功用户已完成支付,资金已到账微信、支付宝✅ 是
NOTPAY未支付订单已创建,等待用户支付微信❌ 否
WAIT_BUYER_PAY等待买家付款交易创建,等待买家付款支付宝❌ 否
USERPAYING用户支付中用户正在支付,尚未完成(如输入密码中)微信❌ 否
PAYERROR支付失败支付失败(如银行返回失败等)微信✅ 是
CLOSED已关闭订单已关闭,可能原因:超时未支付、商户主动关闭、全额退款微信、支付宝✅ 是
REFUND转入退款订单已发起退款申请微信、支付宝✅ 是
TRADE_FINISHED交易结束交易已完成,不可退款(支付宝特定状态)支付宝✅ 是

状态流转

mermaid
stateDiagram-v2
    [*] --> NOTPAY: 创建订单(微信)
    [*] --> WAIT_BUYER_PAY: 创建订单(支付宝)
    
    NOTPAY --> USERPAYING: 用户发起支付
    WAIT_BUYER_PAY --> USERPAYING: 用户发起支付
    
    USERPAYING --> SUCCESS: 支付成功
    USERPAYING --> PAYERROR: 支付失败
    USERPAYING --> NOTPAY: 支付中断
    USERPAYING --> WAIT_BUYER_PAY: 支付中断
    
    NOTPAY --> CLOSED: 超时未支付
    WAIT_BUYER_PAY --> CLOSED: 超时未支付
    
    SUCCESS --> REFUND: 发起退款
    REFUND --> CLOSED: 全额退款完成
    
    SUCCESS --> TRADE_FINISHED: 超过退款期限(支付宝)
    
    CLOSED --> [*]
    PAYERROR --> [*]
    TRADE_FINISHED --> [*]

状态说明

终态状态

终态状态表示订单已到达最终状态,不会再次流转:

  • SUCCESS: 支付成功,资金已到账
  • CLOSED: 订单已关闭,不会再次开启
  • REFUND: 已转入退款流程
  • PAYERROR: 支付失败,需要重新发起支付
  • TRADE_FINISHED: 交易结束,不可退款(支付宝特有)

中间态状态

中间态状态表示订单仍在处理中,可能继续流转:

  • NOTPAY: 等待用户支付
  • WAIT_BUYER_PAY: 等待买家付款(支付宝)
  • USERPAYING: 用户正在支付过程中

渠道差异

微信支付

  • 使用 NOTPAY 表示未支付状态
  • PAYERROR 仅在付款码支付等特定场景下返回
  • 不存在 TRADE_FINISHED 状态

支付宝

  • 使用 WAIT_BUYER_PAY 表示未支付状态
  • 存在 TRADE_FINISHED 状态,表示交易结束且不可退款
  • 不存在 PAYERROR 状态

订单状态 (status)

订单状态是商户系统内部的订单状态,用于商户业务逻辑处理。

状态码状态名称说明
SUCCESS支付成功用户已完成支付,资金已到账
CLOSED已关闭订单已关闭,可能原因:超时未支付、商户主动关闭
REFUND已退款订单已全额或部分退款
PAYING支付中用户正在支付,尚未完成

交易状态与订单状态的映射

交易状态 (trade_state)订单状态 (status)说明
SUCCESSSUCCESS支付成功
TRADE_FINISHEDSUCCESS交易结束(等同于支付成功)
NOTPAYPAYING等待支付
WAIT_BUYER_PAYPAYING等待付款
USERPAYINGPAYING用户支付中
PAYERRORCLOSED支付失败
CLOSEDCLOSED订单已关闭
REFUNDREFUND已转入退款

使用建议

1. 判断支付是否成功

javascript
// 推荐: 使用 trade_state 判断
if (result.data.trade_state === 'SUCCESS' || result.data.trade_state === 'TRADE_FINISHED') {
  // 支付成功
}

// 或者: 使用 status 判断
if (result.data.status === 'SUCCESS') {
  // 支付成功
}

2. 判断订单是否可支付

javascript
// 订单可支付的条件
const canPay = ['NOTPAY', 'WAIT_BUYER_PAY'].includes(order.trade_state);

3. 处理支付结果

javascript
switch (order.trade_state) {
  case 'SUCCESS':
  case 'TRADE_FINISHED':
    // 支付成功,更新订单状态
    break;
  case 'CLOSED':
    // 订单已关闭
    break;
  case 'PAYERROR':
    // 支付失败,提示用户重新支付
    break;
  case 'REFUND':
    // 已退款
    break;
  default:
    // 其他状态,继续等待
    break;
}

注意事项

  1. 优先使用 trade_state: trade_state 是支付渠道的真实状态,更准确
  2. 终态判断: 只有终态状态才表示订单已完成最终处理
  3. 渠道差异: 注意微信和支付宝的状态差异,做好兼容处理
  4. 状态同步: 订单状态可能与交易状态存在短暂延迟,建议以 trade_state 为准
  5. 退款状态: REFUND 表示已发起退款,退款是否完成需查询退款接口

Copyright © 2024 米付科技