查单与退款

查询订单

Node.js
Python
const order = await pay.orders.query({ outTradeNo: 'R202608180001' })
// 也可以用顽兔单号:pay.orders.query({ orderId: 'po_xxx' })
status含义
created已创建,用户未操作
paying用户操作中
paid已支付。paid_atchannel_trade_no 有值
partial_refunded已部分退款
refunded已全额退款
closed已关闭(超时未支付),终态

查单是回调之外的兜底手段。建议对支付中的订单每 30 秒到 2 分钟查询一次,直到终态。 超时未支付的订单由网关自动关闭,不另行推送。

退款

Node.js
Python
const refund = await pay.refunds.create({
  outTradeNo: 'R202608180001',
  outRefundNo: 'RF202608180001_1',   // 商户退款单号,同一笔订单内唯一
  amount: '100.00',
  reason: '用户申请退款',
})
  • out_refund_no 是幂等键。网络超时后用同一个单号重试,不会重复退款
  • 支持多次部分退款,累计金额不超过订单金额,超出返回 42201
  • 退款窗口一般为支付后 12 个月(以支付渠道规则为准),资金原路退回
  • 退款是异步流程:申请受理后先进入贵司审批——运营/财务在顽兔提供的商户后台 批准后才向支付渠道发起(超过 14 天未审批会自动拒绝),所以受理应答的状态 一律是 processing,不要把受理应答当退款结果
  • 终态以 refund.succeeded / refund.failed 回调为准,也可以用下面的退款查询接口确认
status含义
processing处理中:等待商户后台审批,或渠道退款在途
succeeded退款到账,refunded_at 有值
failed终态失败,资金未动(审核拒绝 / 14 天超时自动拒绝 / 渠道明确失败)。按失败处理:提示用户,如需再退换新退款单号重新申请

业务提醒:先定好退款规则再接接口。比如积分已消耗的订单是否允许退、 是否只支持全额退,这些由商户业务决定,资金操作永远放在最后一步。

查询退款

Node.js
Python
await pay.refunds.query({ outTradeNo: 'R202608180001', outRefundNo: 'RF202608180001_1' })