Alipay Easy 部分退款为何报 ACQ.REFUND_AMT_NOT_EQUAL_TOTAL?
支付老李
结论
350 元的订单退款 320 元,属于部分退款。调用 alipay.trade.refund 时,需要设置:
refund_amount:320.00out_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。
仍然报错时如何排查
可以按以下顺序检查:
- 检查
refund_amount是否为"320.00",避免误传"350.00"、以分为单位的整数或其他币种金额。 - 检查实际发送的请求中是否包含
out_request_no,不要只在本地生成而未传给支付宝。 - 查询该
out_request_no是否已经使用。如果是重试,退款金额必须与首次请求完全一致;如果要提交不同的金额,需要生成新的退款请求号。 - 查询订单的已退款金额,确认本次退款没有超过剩余可退金额。
- 检查退款关联的是否为原支付订单,避免传错
out_trade_no或trade_no。 - 记录支付宝返回的
code、sub_code、sub_msg以及请求参数,确认是否存在其他业务限制。
注意事项
out_request_no 也用于幂等控制。同一笔退款因网络超时需要重试时,应继续使用原请求号和原退款金额。只有新建另一笔部分退款时,才需要生成新的请求号。
扣除的 30.00 元不是退款接口中的“手续费字段”,而是该订单仍有 30.00 元未退。能否向用户扣除这笔费用,需要根据实际业务协议、退款政策和适用规则判断。退款接口只处理请求中指定的退款金额。
备注:内容仅供参考。
