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