alipay.trade.app.pay 是否会通过 HTTP 调用支付宝服务端?
结论
调用 alipay.trade.app.pay 生成 App 支付订单信息时,通常不会立即向支付宝服务端发送 HTTP 请求。
商户服务端调用支付宝 SDK 的 sdkExecute 方法后,会在本地完成请求参数的组装、排序和签名,生成供 App 使用的 orderString。App 将这段字符串交给支付宝客户端 SDK 发起支付后,才会与支付宝服务端交互。
实际调用流程
App 支付通常按以下流程进行:
- 商户服务端创建业务订单。
- 商户服务端构造
AlipayTradeAppPayRequest。 - 调用
AlipayClient.sdkExecute(request),在本地生成已签名的支付参数。 - 商户服务端将
response.getBody()返回给 App。 - App 调用支付宝客户端 SDK,例如 Android 的
PayTask.payV2(...)。 - 支付宝客户端 SDK 或支付宝 App 与支付宝服务端通信并完成支付。
- 支付完成后,支付宝通过商户配置的
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
×tamp=...
&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 做了封装,应以实际调用方法的源码和对应版本说明为准。
备注:内容仅供参考。
