PAYATHON 2026

支付宝退款订单查询:仅有收单订单号应调用哪个接口?

支付老李

明确结论

如果只知道商户收单订单号 out_trade_no,应调用支付宝统一收单交易查询接口:

alipay.trade.query

然后根据响应中的 refund_amount 判断订单是否发生过退款:

  • refund_amount > 0:订单至少发生过一次退款。
  • refund_amount = 0 或接口未返回该字段:通常表示当前没有查询到退款金额,仍需以实际接口版本和响应为准。

不应直接调用 alipay.trade.fastpay.refund.query。该接口用于查询某一笔具体退款,通常必须传入退款请求号 out_request_no,无法枚举一个订单下的全部退款记录。

查询步骤

  1. 将收单时使用的商户订单号填入 out_trade_no。
  2. 调用 alipay.trade.query。
  3. 确认接口业务结果成功。
  4. 读取 refund_amount,检查累计退款金额是否大于零。
  5. 如需查询某次退款的具体状态,再使用已保存的 out_request_no 调用退款查询接口。

如果手中的”收单订单号”实际是支付宝交易号 trade_no,也可以通过 trade_no 查询。通常不要同时传入两个互不匹配的编号。

Java 示例

下面是支付宝 Java SDK 的常见调用方式。不同版本的 SDK 在类名和初始化方式上可能略有差异:

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo("ORDER_202609090001");
request.setBizModel(model);

AlipayTradeQueryResponse response = alipayClient.execute(request);

if (!response.isSuccess()) {
    System.out.println("交易查询失败:"
            + response.getCode() + " - " + response.getSubMsg());
    return;
}

String refundAmountText = response.getRefundAmount();
BigDecimal refundAmount = refundAmountText == null
        ? BigDecimal.ZERO
        : new BigDecimal(refundAmountText);

if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
    System.out.println("该订单发生过退款,累计退款金额:" + refundAmount);
} else {
    System.out.println("当前未查询到退款金额");
}

如果当前 SDK 的响应对象没有 getRefundAmount() 方法,请检查该 SDK 版本对应的接口响应模型,也可以读取并解析支付宝返回的原始 JSON。

HTTP 请求中的业务参数

核心业务参数是:

{
  "out_trade_no": "ORDER_202609090001"
}

如果已知的是支付宝交易号,则传入:

{
  "trade_no": "2026090922001412345678901234"
}

接口响应成功后,主要检查以下字段:

{
  "trade_status": "TRADE_SUCCESS",
  "total_amount": "100.00",
  "refund_amount": "20.00"
}

这个示例表示订单金额为 100.00 元,累计退款金额为 20.00 元。

为什么不适合使用退款查询接口

具体退款查询接口是:

alipay.trade.fastpay.refund.query

调用时通常需要提供:

{
  "out_trade_no": "ORDER_202609090001",
  "out_request_no": "REFUND_202609090001"
}

out_request_no 是商户发起退款时生成的退款请求号。同一订单可以分多次退款,每次退款都应使用不同的 out_request_no。如果完全不知道退款请求号,该接口就无法直接列出订单下的所有退款。

注意事项

  • refund_amount 表示累计退款金额,无法直接判断退款次数。
  • 部分退款后,交易状态不一定会变为单独的”已退款”状态,因此不能只根据 trade_status 判断。
  • 查询结果可能受支付和退款处理时序影响。刚发起退款时,还应结合退款接口响应和异步通知处理。
  • 商户系统应保存每次退款的 out_request_no、退款金额、请求时间和退款结果,方便后续核对并进行幂等控制。
  • 如需完整的退款明细,应优先查询商户自己的退款记录。仅使用 alipay.trade.query,通常只能判断订单是否退过款以及累计退款金额,无法还原每一笔退款。
  • 不同支付宝产品、接口版本或 SDK 的返回字段可能有差异。接入时应以当前签约产品对应的官方接口文档和实际响应为准。

备注:内容仅供参考。