PAYATHON 2026

APP支付相关接口应使用execute还是sdkExecute?

支付小周

结论

查询或关闭 APP 支付订单时,都应使用:

alipayClient.execute(request)

各类操作对应的调用方式是:

  • 创建 APP 支付订单并生成客户端支付参数:使用 alipayClient.sdkExecute
  • 查询支付订单:使用 alipayClient.execute
  • 关闭支付订单:使用 alipayClient.execute

选择 execute 还是 sdkExecute,要看接口的用途,与订单最初来自 APP 支付、网页支付还是其他支付产品无关。

为什么查询和关单使用 execute

alipayClient.sdkExecute 主要用于 APP 支付下单。它会生成一段支付参数字符串,由服务端交给支付宝客户端 SDK,再由客户端使用该字符串唤起支付宝完成支付。

查询和关单是服务端操作。查询订单时,服务端需要向支付宝网关发送请求并获取结构化的查询结果;关闭订单时,也需要由服务端向支付宝网关提交请求并接收处理结果。因此,这两类请求都应通过 alipayClient.execute 执行。

查询 APP 支付订单

查询订单通常使用 AlipayTradeQueryRequest。可以通过商户订单号 out_trade_no 或支付宝交易号 trade_no 查询,字段要求以当前接入版本的接口文档为准。

import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("""
{
  "out_trade_no": "202609090001"
}
""");

AlipayTradeQueryResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    System.out.println("查询成功");
    System.out.println("交易状态:" + response.getTradeStatus());
    System.out.println("支付宝交易号:" + response.getTradeNo());
} else {
    System.out.println("查询失败");
    System.out.println("错误码:" + response.getCode());
    System.out.println("错误信息:" + response.getSubMsg());
}

接口查询成功不等于订单已经支付,还需要检查 trade_status。常见状态包括:

  • WAIT_BUYER_PAY:等待买家付款
  • TRADE_SUCCESS:支付成功
  • TRADE_FINISHED:交易完成
  • TRADE_CLOSED:交易关闭

因此,业务系统不能只根据 response.isSuccess() 判断订单是否已经支付。

关闭 APP 支付订单

关闭订单通常使用 AlipayTradeCloseRequest:

import com.alipay.api.request.AlipayTradeCloseRequest;
import com.alipay.api.response.AlipayTradeCloseResponse;

AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
request.setBizContent("""
{
  "out_trade_no": "202609090001"
}
""");

AlipayTradeCloseResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    System.out.println("关单成功");
    System.out.println("支付宝交易号:" + response.getTradeNo());
} else {
    System.out.println("关单失败");
    System.out.println("错误码:" + response.getCode());
    System.out.println("错误信息:" + response.getSubMsg());
}

关单前应先核对本地订单状态,避免重复关闭已经支付成功的订单。如果关单时发生超时或网络异常,不能直接判定关单失败。应再次调用查询接口,确认支付宝侧的最终订单状态。

APP 支付下单时才使用 sdkExecute

两种调用方式的典型区别如下:

// APP 支付下单:生成客户端 SDK 所需的 orderString
AlipayTradeAppPayResponse payResponse =
        alipayClient.sdkExecute(appPayRequest);

String orderString = payResponse.getBody();
// 查询、关单等服务端接口:直接访问支付宝网关
AlipayTradeQueryResponse queryResponse =
        alipayClient.execute(queryRequest);

AlipayTradeCloseResponse closeResponse =
        alipayClient.execute(closeRequest);

注意事项

  1. sdkExecute 生成的支付参数应由服务端返回给 APP,私钥不能放在客户端。
  2. 支付结果应以服务端异步通知和主动查询为准,不能只依赖 APP 客户端返回的结果。
  3. 接收异步通知时,需要验证签名,并核对 app_id、商户订单号、金额、卖家信息等字段。
  4. 查询或关单时发生网络超时,不代表支付宝已经执行失败。需要通过订单查询确认最终状态。
  5. 同一商户订单号应保持唯一。查询和关单使用的 out_trade_no 必须与下单时一致。
  6. 不同版本的支付宝 Java SDK 在模型类和字段设置方式上可能略有差异,但职责划分不变:查询和关单使用 execute,APP 支付下单使用 sdkExecute。

备注:内容仅供参考。