芝麻免押订单金额大于冻结金额时如何调用预授权支付接口
结论
订单金额为 60 元、冻结金额为 50 元时,预授权支付接口的 total_amount 应填写实际订单金额 60.00,auth_confirm_mode 填写 COMPLETE。
如果当前产品支持超额转支付,系统会这样处理:
- 已冻结的 50 元转为支付款;
- 超出的 10 元由支付宝尝试从用户其他可用的支付资金渠道扣取;
- 商户不需要单独“解冻”这 10 元,也不需要从冻结资金中处理;
- 如果用户可用资金不足,或当前产品的签约能力不支持超额转支付,本次支付可能失败。
不能把 total_amount 填成 50 元,然后直接将 60 元的订单视为已完成收款。
为什么要填写 60 元
total_amount 是本次交易的实际支付金额,不是冻结金额,也不是本次准备从冻结资金中扣除的金额。
例如:
| 冻结金额 | 实际订单金额 | total_amount | 处理结果 |
|---|---|---|---|
| 50.00 | 40.00 | 40.00 | 支付 40 元,剩余 10 元解冻 |
| 50.00 | 50.00 | 50.00 | 冻结金额全部转支付 |
| 50.00 | 60.00 | 60.00 | 50 元从冻结资金转支付,超出的 10 元尝试另行扣款 |
auth_confirm_mode 填写 COMPLETE,表示本次操作会完成该笔授权资金的最终确认,授权单不再保留可供后续转支付的额度,但这并不意味着接口只能按照冻结金额收款。
调用步骤
1. 使用原冻结授权号
预授权支付请求应传入冻结成功后取得的 auth_no。商户订单号 out_trade_no 也要保持唯一,以免重复创建支付交易。
2. 按实际订单金额传参
实际订单金额为 60 元时,可以这样组织相关参数:
{
"out_trade_no": "ORDER_20260913_0001",
"product_code": "PRE_AUTH_ONLINE",
"subject": "服务订单结算",
"total_amount": "60.00",
"auth_no": "2026XXXXXXXXXXXX",
"auth_confirm_mode": "COMPLETE"
}
具体的 product_code、接口名称和其他必填参数,应以商户当前接入的支付宝预授权产品文档及签约能力为准,不要直接照搬示例中的产品码。
3. 检查同步结果并主动查询
由于超出冻结金额的部分需要额外扣款,接口请求成功不等于最终收款成功。商户需要检查业务返回码;如果结果不明确,应使用 out_trade_no 或支付宝交易号查询最终交易状态。
伪代码示例:
AlipayTradePayRequest request = new AlipayTradePayRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "ORDER_20260913_0001");
bizContent.put("product_code", "PRE_AUTH_ONLINE");
bizContent.put("subject", "服务订单结算");
bizContent.put("total_amount", "60.00");
bizContent.put("auth_no", "2026XXXXXXXXXXXX");
bizContent.put("auth_confirm_mode", "COMPLETE");
request.setBizContent(bizContent.toJSONString());
AlipayTradePayResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
// 记录支付宝交易号,并按实际返回的交易状态更新订单
} else {
// 不要直接将订单标记为已支付
// 根据错误码决定查询交易、重试或引导用户补缴
}
超额扣款失败时怎么处理
如果 60 元转支付失败,不要自行认定冻结的 50 元已经扣款成功。先查询交易状态,再根据查询结果处理:
- 交易成功:按 60 元完成订单结算。
- 交易失败:保留原始错误码和错误信息,按业务规则引导用户补足资金或改用其他支付方式。
- 交易状态未知:主动调用交易查询接口,不要立即换用新的订单号重复扣款。
- 当前签约能力不支持超额转支付:确认接口能力后,可以先从授权资金中结算允许的金额,再通过一笔独立的普通支付订单收取差额。
最后一种方式会产生两笔交易。退款、对账和订单状态都需要分别处理,不能只在数据库中简单合并两笔金额。
注意事项
- 金额应以字符串形式传递,并保留两位小数,例如
"60.00"。金额计算时不要使用浮点数。 COMPLETE通常表示完成并关闭本次授权确认。调用成功后,不应继续假设该授权号还能用于转支付。- 超额部分能否直接扣款,可能受产品签约、用户账户状态、支付渠道及风控规则影响。上线前应使用当前商户账号验证相关能力。
- 不要先按 50 元调用
COMPLETE,再尝试使用同一个auth_no收取剩余 10 元。授权完成后,通常不能继续使用该授权单。 - 遇到支付超时或网络异常时,应先查询交易状态,再决定是否重试,以免重复扣款。
- 退款应以实际成功的支付交易为准,而不是以最初冻结的 50 元为准。
备注:内容仅供参考。