PAYATHON 2026

alipay.trade.app.pay 是否会通过 HTTP 调用支付宝服务端?

支付小周

结论

调用 alipay.trade.app.pay 生成 App 支付订单信息时,通常不会立即向支付宝服务端发送 HTTP 请求。

商户服务端调用支付宝 SDK 的 sdkExecute 方法后,会在本地完成请求参数的组装、排序和签名,生成供 App 使用的 orderString。App 将这段字符串交给支付宝客户端 SDK 发起支付后,才会与支付宝服务端交互。

实际调用流程

App 支付通常按以下流程进行:

  1. 商户服务端创建业务订单。
  2. 商户服务端构造 AlipayTradeAppPayRequest。
  3. 调用 AlipayClient.sdkExecute(request),在本地生成已签名的支付参数。
  4. 商户服务端将 response.getBody() 返回给 App。
  5. App 调用支付宝客户端 SDK,例如 Android 的 PayTask.payV2(...)。
  6. 支付宝客户端 SDK 或支付宝 App 与支付宝服务端通信并完成支付。
  7. 支付完成后,支付宝通过商户配置的 notify_url 异步通知商户服务端。

因此,服务端执行 sdkExecute 时没有观察到 HTTP 请求,一般是正常的。

Java 服务端示例

AlipayClient alipayClient = new DefaultAlipayClient(
    "https://openapi.alipay.com/gateway.do",
    appId,
    merchantPrivateKey,
    "json",
    "UTF-8",
    alipayPublicKey,
    "RSA2"
);

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("99.00");
model.setSubject("测试商品");
model.setProductCode("QUICK_MSECURITY_PAY");

request.setBizModel(model);
request.setNotifyUrl("https://example.com/alipay/notify");

AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

// 将 orderString 原样返回给 App
String orderString = response.getBody();

需要关注的是这行代码:

alipayClient.sdkExecute(request)

它用于生成客户端支付所需的请求字符串,不等同于通过网关发送普通的 OpenAPI 请求。

如果调用的是其他方法,例如:

alipayClient.execute(request)

行为可能不同。是否会发送 HTTP 请求,需要结合支付宝 SDK 的版本和实际调用的方法判断,不能只看接口名称。

Android 客户端示例

服务端返回 orderString 后,Android 客户端可以将它传给支付宝 SDK:

Runnable payRunnable = () -> {
    PayTask alipay = new PayTask(activity);
    Map<String, String> result = alipay.payV2(orderString, true);

    // 切换到主线程处理支付结果
};

Thread payThread = new Thread(payRunnable);
payThread.start();

执行到这里才进入实际支付阶段。网络通信可能由支付宝客户端 SDK 或支付宝 App 完成,所以商户服务端的 HTTP 日志中不一定会出现对应请求。

如何确认是否发起了 HTTP 请求

可以从下面几个方面排查。

1. 检查调用的方法

确认服务端调用的是:

sdkExecute(request)

而不是:

execute(request)

前者通常在本地生成 App 支付参数,后者通常会向支付宝开放平台网关发送请求。

2. 检查返回内容

response.getBody() 通常是一段已经签名的订单参数,例如:

app_id=...
&biz_content=...
&charset=UTF-8
&method=alipay.trade.app.pay
&sign=...
&sign_type=RSA2
&timestamp=...
&version=1.0

拿到这段内容,只能说明支付参数已生成,不能说明支付宝服务端已经创建或完成交易。

3. 观察 App 端网络和支付行为

将 orderString 传给客户端支付 SDK 后,可以通过以下方式确认支付调用是否发生:

  • 查看 App 端支付宝 SDK 返回的结果;
  • 检查支付宝 App 是否被唤起;
  • 查看商户服务端是否收到 notify_url 异步通知;
  • 调用订单查询接口确认最终交易状态;
  • 在合规且可观测的测试环境中检查客户端网络日志。

注意事项

不要把客户端返回的支付结果作为最终入账依据。网络中断、页面关闭或结果被篡改,都可能导致客户端结果不可靠。商户服务端应以支付宝异步通知为主,必要时再调用订单查询接口核实交易状态。

还需注意:

  • orderString 应由商户服务端生成,不能将私钥放在 App 中。
  • 返回给 App 后,应保持字符串原样,避免重复编码或改变参数顺序。
  • notify_url 必须是支付宝服务器能够访问的地址。
  • 收到异步通知后,应验证签名,并核对 app_id、out_trade_no、金额和商户身份等信息。
  • 不同语言和不同版本 SDK 的方法名称及内部实现可能不同。如果使用的不是 Java SDK,或者对 SDK 做了封装,应以实际调用方法的源码和对应版本说明为准。

备注:内容仅供参考。