PAYATHON 2026

芝麻免押订单金额大于冻结金额时如何调用预授权支付接口

支付老李

结论

订单金额为 60 元、冻结金额为 50 元时,预授权支付接口的 total_amount 应填写实际订单金额 60.00,auth_confirm_mode 填写 COMPLETE。

如果当前产品支持超额转支付,系统会这样处理:

  • 已冻结的 50 元转为支付款;
  • 超出的 10 元由支付宝尝试从用户其他可用的支付资金渠道扣取;
  • 商户不需要单独“解冻”这 10 元,也不需要从冻结资金中处理;
  • 如果用户可用资金不足,或当前产品的签约能力不支持超额转支付,本次支付可能失败。

不能把 total_amount 填成 50 元,然后直接将 60 元的订单视为已完成收款。

为什么要填写 60 元

total_amount 是本次交易的实际支付金额,不是冻结金额,也不是本次准备从冻结资金中扣除的金额。

例如:

冻结金额实际订单金额total_amount处理结果
50.0040.0040.00支付 40 元,剩余 10 元解冻
50.0050.0050.00冻结金额全部转支付
50.0060.0060.0050 元从冻结资金转支付,超出的 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 元为准。

备注:内容仅供参考。