PAYATHON 2026

Alipay Easy 部分退款为何报 ACQ.REFUND_AMT_NOT_EQUAL_TOTAL?

支付老李

结论

350 元的订单退款 320 元,属于部分退款。调用 alipay.trade.refund 时,需要设置:

  • refund_amount:320.00
  • out_request_no:本次部分退款的唯一请求号

如果没有传入 out_request_no,系统可能会将请求按整单退款处理。此时,refund_amount 必须等于订单的可退金额。由于 320.00 与 350.00 不一致,接口会返回 ACQ.REFUND_AMT_NOT_EQUAL_TOTAL。

如果使用了已经提交过的 out_request_no,但本次退款金额与首次请求不同,也可能出现退款金额不一致的错误。

正确的处理方式

原支付金额仍是 350.00,不要因为扣除费用而修改原订单金额。退款时,单独提交实际退给用户的金额:

原支付金额:350.00
本次退款金额:320.00
退款后剩余金额:30.00

请求参数示例:

{
  "out_trade_no": "ORDER_202609090001",
  "refund_amount": "320.00",
  "out_request_no": "REFUND_202609090001_01",
  "refund_reason": "扣除约定费用后退款"
}

参数说明:

  • out_trade_no:原支付订单号。
  • refund_amount:实际退回用户账户的金额。
  • out_request_no:本次部分退款的唯一请求号。
  • refund_reason:可选的退款原因。

如果同一订单之后还要继续退款,需要更换新的 out_request_no:

{
  "out_trade_no": "ORDER_202609090001",
  "refund_amount": "10.00",
  "out_request_no": "REFUND_202609090001_02"
}

累计退款金额不能超过订单当前的可退金额。

Java 示例

下面是使用支付宝标准 Java SDK 调用 alipay.trade.refund 的示例:

AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();

AlipayTradeRefundModel model = new AlipayTradeRefundModel();
model.setOutTradeNo("ORDER_202609090001");
model.setRefundAmount("320.00");
model.setOutRequestNo("REFUND_202609090001_01");
model.setRefundReason("扣除约定费用后退款");

request.setBizModel(model);

AlipayTradeRefundResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    System.out.println("退款受理成功");
} else {
    System.out.println("退款失败");
    System.out.println("code: " + response.getCode());
    System.out.println("subCode: " + response.getSubCode());
    System.out.println("subMsg: " + response.getSubMsg());
}

如果使用 Alipay Easy SDK,具体的类名和构造方式可能有所不同,但业务参数不变。部分退款需要明确传入实际退款金额,并提供独立的 out_request_no。

仍然报错时如何排查

可以按以下顺序检查:

  1. 检查 refund_amount 是否为 "320.00",避免误传 "350.00"、以分为单位的整数或其他币种金额。
  2. 检查实际发送的请求中是否包含 out_request_no,不要只在本地生成而未传给支付宝。
  3. 查询该 out_request_no 是否已经使用。如果是重试,退款金额必须与首次请求完全一致;如果要提交不同的金额,需要生成新的退款请求号。
  4. 查询订单的已退款金额,确认本次退款没有超过剩余可退金额。
  5. 检查退款关联的是否为原支付订单,避免传错 out_trade_no 或 trade_no。
  6. 记录支付宝返回的 code、sub_code、sub_msg 以及请求参数,确认是否存在其他业务限制。

注意事项

out_request_no 也用于幂等控制。同一笔退款因网络超时需要重试时,应继续使用原请求号和原退款金额。只有新建另一笔部分退款时,才需要生成新的请求号。

扣除的 30.00 元不是退款接口中的“手续费字段”,而是该订单仍有 30.00 元未退。能否向用户扣除这笔费用,需要根据实际业务协议、退款政策和适用规则判断。退款接口只处理请求中指定的退款金额。

备注:内容仅供参考。