PAYATHON 2026

合并支付后是否有主动查询支付结果的API接口?

支付老李

结论

合并支付完成后,目前通常没有单独的“合并支付结果查询接口”。如需核对支付结果,应使用支付宝统一收单交易查询接口 alipay.trade.query,逐笔查询合并支付中的子订单。

合并支付一次完成多笔订单的支付,但交易状态仍记录在各个子订单上,无法通过一个“合并支付单号”查询所有订单的最终状态。

处理方式

调用 alipay.trade.merge.pay 时,系统需要保存本次合并支付涉及的全部商户订单号。收到异步通知后,正常更新对应订单。如果通知处理失败、验签失败或长时间未收到通知,可以按以下流程补偿:

  1. 找出本次合并支付中状态仍为“支付中”或“未知”的子订单。
  2. 对每个子订单调用 alipay.trade.query。
  3. 使用商户订单号 out_trade_no 查询。如果已保存支付宝交易号,也可以使用 trade_no。
  4. 根据查询结果分别更新每笔订单。
  5. 对暂时无法确认状态的订单进行有限次数的延迟重试。

调用的 API 名称为:

alipay.trade.query

使用商户订单号查询时,请求参数示例如下:

{
  "out_trade_no": "MERCHANT_ORDER_202609080001"
}

使用支付宝交易号查询时,请求参数示例如下:

{
  "trade_no": "2026090822001400000000000001"
}

trade_no 和 out_trade_no 通常选择一个即可。具体参数约束以当前支付宝开放平台的 alipay.trade.query 接口文档为准。

Java 示例

下面使用支付宝 Java SDK 演示查询过程,客户端初始化代码已省略:

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo("MERCHANT_ORDER_202609080001");

request.setBizModel(model);

AlipayTradeQueryResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    String tradeStatus = response.getTradeStatus();

    switch (tradeStatus) {
        case "TRADE_SUCCESS":
        case "TRADE_FINISHED":
            // 支付成功,按幂等方式更新订单
            break;

        case "WAIT_BUYER_PAY":
            // 尚未完成支付,可继续等待或稍后重查
            break;

        case "TRADE_CLOSED":
            // 交易已关闭
            break;

        default:
            // 未识别状态,记录原始响应并进入人工或重试流程
            break;
    }
} else {
    // 接口调用失败不等于交易失败
    // 应记录 code、subCode、msg、subMsg,并按策略重试
    System.err.println(
        response.getCode() + " / "
        + response.getSubCode() + " / "
        + response.getMsg() + " / "
        + response.getSubMsg()
    );
}

如果一次合并支付包含多笔子订单,可以逐笔查询:

for (String outTradeNo : pendingOutTradeNos) {
    AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

    AlipayTradeQueryModel model = new AlipayTradeQueryModel();
    model.setOutTradeNo(outTradeNo);
    request.setBizModel(model);

    AlipayTradeQueryResponse response = alipayClient.execute(request);

    // 每笔订单独立判断并更新,更新逻辑必须保证幂等
    handleQueryResult(outTradeNo, response);
}

状态判断

常见的 trade_status 包括:

  • WAIT_BUYER_PAY:交易创建,等待买家付款。
  • TRADE_SUCCESS:支付成功。
  • TRADE_FINISHED:交易结束,不可退款。
  • TRADE_CLOSED:交易关闭。

业务系统既不能只依赖异步通知,也不能只看同步返回。通常可以这样分工:

同步返回用于展示结果
异步通知用于正常更新
主动查询用于补偿和最终确认

注意事项

不要把查询失败当成支付失败

如果 alipay.trade.query 返回网络异常、系统错误或请求超时,只能说明本次查询未获得确定结果,不能据此把订单改为支付失败。系统应保留订单原有状态,并在稍后再次查询。

按子订单维护状态

合并支付中的子订单可能需要分别核对。数据库应保留合并批次与子订单之间的关联,例如:

merge_batch_no -> out_trade_no_1
               -> out_trade_no_2
               -> out_trade_no_3

执行主动补偿时,按照该关联逐笔调用 alipay.trade.query。

保证更新幂等

异步通知和主动查询可能同时返回支付成功,因此订单更新必须有幂等控制,避免重复入账、重复发货或重复增加余额。常见做法是根据订单状态进行条件更新:

UPDATE payment_order
SET payment_status = 'SUCCESS',
    paid_at = CURRENT_TIMESTAMP
WHERE out_trade_no = ?
  AND payment_status <> 'SUCCESS';

如果更新结果为零,应先读取订单当前状态,不要重复执行支付成功后的业务动作。

建立补偿任务

系统可以定时扫描处于“支付中”且超过一定时间仍未更新的订单,再逐笔查询支付宝交易状态。重试间隔、重试次数和订单超时时间应结合业务规则及支付宝当前接口限制设置,不宜无间隔轮询。

因此,找不到专门的合并支付查询 API 通常是正常情况。主动核对支付结果时,使用 alipay.trade.query 逐笔查询合并支付中的子订单即可。支付宝的接口能力可能调整,上线前仍需以当前开放平台文档和对应应用拥有的接口权限为准。

备注:内容仅供参考。