支付宝退款订单查询:仅有收单订单号应调用哪个接口?
支付老李
明确结论
如果只知道商户收单订单号 out_trade_no,应调用支付宝统一收单交易查询接口:
alipay.trade.query
然后根据响应中的 refund_amount 判断订单是否发生过退款:
refund_amount > 0:订单至少发生过一次退款。refund_amount = 0或接口未返回该字段:通常表示当前没有查询到退款金额,仍需以实际接口版本和响应为准。
不应直接调用 alipay.trade.fastpay.refund.query。该接口用于查询某一笔具体退款,通常必须传入退款请求号 out_request_no,无法枚举一个订单下的全部退款记录。
查询步骤
- 将收单时使用的商户订单号填入
out_trade_no。 - 调用
alipay.trade.query。 - 确认接口业务结果成功。
- 读取
refund_amount,检查累计退款金额是否大于零。 - 如需查询某次退款的具体状态,再使用已保存的
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 的返回字段可能有差异。接入时应以当前签约产品对应的官方接口文档和实际响应为准。
备注:内容仅供参考。
