PAYATHON 2026

支付宝当面付能否根据单号批量查询支付状态?

支付阿杰

结论

支付宝当面付的交易查询一般使用 alipay.trade.query 接口。每次请求只能通过一个支付宝交易号 trade_no 或商户订单号 out_trade_no 查询一笔交易,不能同时传入多个单号并批量获取支付状态。

需要实时确认多笔订单时,只能逐单调用 alipay.trade.query。实际系统不宜长期进行高频轮询,可以结合异步通知、有限次数的主动补查和账单对账来同步状态。

推荐的处理方式

支付状态同步可以按以下流程设计:

  1. 创建当面付订单时,把 out_trade_no、订单金额和初始状态保存到数据库。
  2. 支付宝返回支付结果后,先处理接口同步返回的数据。
  3. 配置支付宝异步通知地址,收到通知后更新本地订单状态。
  4. 对长时间处于“待支付”状态且没有收到通知的订单,逐笔调用 alipay.trade.query 补查。
  5. 对历史订单或大量订单,通过账单下载进行离线对账,避免逐笔无限轮询。

支付宝可能重复发送异步通知,因此订单更新必须具备幂等性。

单笔查询示例

下面是 Java SDK 的常见写法。具体类名和初始化参数应以项目实际使用的支付宝 SDK 版本为准。

AlipayClient alipayClient = new DefaultAlipayClient(
        gatewayUrl,
        appId,
        merchantPrivateKey,
        "json",
        "UTF-8",
        alipayPublicKey,
        "RSA2"
);

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "ORDER_202609090001");
request.setBizContent(bizContent.toJSONString());

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 等信息
}

查询时通常使用以下两个字段之一:

  • out_trade_no:商户系统生成的订单号。
  • trade_no:支付宝生成的交易号。

如果两个编号同时传入,必须确保它们对应同一笔交易。为减少关联错误,商户系统一般优先使用自己保存的 out_trade_no 查询。

多笔订单如何处理

该接口不能在一次请求中查询多个单号,但可以在应用层创建补查任务,逐笔调用查询接口:

for (String outTradeNo : pendingOrderNumbers) {
    try {
        queryAndUpdateOrder(outTradeNo);
    } catch (Exception e) {
        // 记录失败原因,交给后续重试任务处理
    }
}

订单量较大时,可以通过受控并发加快处理,但需要设置:

  • 最大并发数;
  • 请求超时时间;
  • 重试次数和重试间隔;
  • 单笔订单的补查截止时间;
  • 接口限流后的退避策略;
  • 幂等更新和重复任务保护。

不要为每笔订单启动无限循环。可以采用递增的查询间隔,在支付后的短时间内适当提高查询频率,随后逐步降低。到达订单有效期后,应停止查询并关闭本地订单。

为什么不能只依赖逐单轮询

逐单查询适合处理异常和补偿状态,不适合作为唯一的支付状态同步方式,原因包括:

  • 订单越多,查询请求也越多;
  • 请求可能触发支付宝侧或商户侧的频率限制;
  • 网络超时只表示本次查询没有成功,不能据此认定交易失败;
  • 高频轮询会加重应用、数据库和日志系统的负担;
  • 对历史订单逐笔查询,效率通常不如账单对账。

更稳妥的方案是以异步通知为主,主动查询作为补充,最后通过账单对账兜底。

注意事项

查询失败不代表支付失败

遇到网络错误、验签失败、超时或接口业务错误时,不要直接把订单改为“支付失败”。应保留原状态并记录错误信息,再根据错误类型决定是否重试。

必须校验交易信息

确认支付成功时,除了检查 trade_status,还要核对:

  • 商户订单号;
  • 支付金额;
  • 商户身份信息;
  • 应用标识;
  • 订单是否已经处理。

确认这些信息一致后,才能更新订单,并执行发货、充值等业务操作。

正确处理交易状态

常见的交易状态包括:

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

业务系统需要根据实际场景定义状态转换规则,不能仅凭接口请求是否成功来判断交易状态。

批量对账不等于实时批量查询

账单下载用于核对某个账期内的交易,通常不提供实时支付状态。如果需要立即获取一组订单的当前状态,仍然要逐笔调用 alipay.trade.query。如果需要核对大量历史交易是否入账,则应优先使用账单对账。具体的账单类型、可下载时间和接口参数,以当前支付宝开放平台文档及所使用产品的权限为准。

备注:内容仅供参考。