商户授权多个服务商后的交易查询与对账文件下载
结论
同一个商户通常可以同时授权多个服务商。不同服务商可以接入不同的支付产品,也可以在产品能力和签约条件允许时接入相同的支付产品,例如 APP 支付和手机网站支付。
不过,商户授权多个服务商后,某个服务商并不能通过一次接口调用,查到该商户在其他服务商应用下产生的全部交易。服务商接口能访问哪些数据,通常取决于:
- 服务商应用的
app_id - 商户授予该应用的
app_auth_token - 接口权限和支付产品签约状态
- 创建交易时对应的应用、商户和授权关系
常见做法是使用各服务商应用对应的授权凭证分别查询交易和下载账单,再由商户自己的对账系统汇总。支付平台是否提供商户主体维度的统一账单,需要根据当前的商户后台、账单产品和接口权限判断。
为什么不能默认统一查询
支付平台一般将“应用 + 商户授权”作为服务商代调用接口的权限边界。即使多个应用服务于同一个商户,不同服务商仍是相互隔离的系统主体。
例如:
- 服务商 A 使用自己的
app_id,以及商户授权给 A 的app_auth_token创建交易。 - 服务商 B 使用另一组
app_id和app_auth_token创建交易。 - A 通常只能访问自身授权范围内的数据,无法使用自己的凭证读取 B 应用下的交易。
- 商户不能只提供一个商户号,就要求某个服务商接口返回其他服务商应用下的全部交易。
这种隔离可以防止一个服务商读取另一个服务商的订单、业务参数和交易数据。
建议的查询与对账方案
1. 保存交易归属关系
商户侧应记录每笔业务订单由哪个服务商应用发起,至少包括:
- 商户业务订单号
- 支付平台交易号
- 服务商标识
- 服务商应用
app_id - 支付产品类型
- 交易创建时间
- 交易状态
- 退款状态
查询单笔交易时,应根据订单记录将请求路由到对应服务商,不要依次调用所有服务商接口尝试查询。
2. 按授权关系调用交易查询接口
以支付宝开放平台常见的授权调用方式为例,服务商代商户查询交易时,需要使用自己的应用身份签名,并携带商户授予该应用的 app_auth_token。
以下代码只展示调用结构。实际 SDK 类名和参数应以所用 SDK 版本及开放平台文档为准:
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("""
{
"out_trade_no": "ORDER_202609140001"
}
""");
// 必须使用该商户授权给当前服务商应用的 app_auth_token
request.putOtherTextParam("app_auth_token", appAuthToken);
AlipayTradeQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println(response.getTradeNo());
System.out.println(response.getTradeStatus());
} else {
System.out.println(response.getCode());
System.out.println(response.getSubCode());
System.out.println(response.getSubMsg());
}
能否查到交易,重点不在于它属于 APP 支付还是手机网站支付,而在于调用时使用的应用身份、授权令牌和交易归属是否匹配。
3. 分别申请账单下载地址
支付宝常见的账单下载接口是:
alipay.data.dataservice.bill.downloadurl.query
服务商代商户调用时,也需要使用对应授权关系下的 app_auth_token。示意代码如下:
AlipayDataDataserviceBillDownloadurlQueryRequest request =
new AlipayDataDataserviceBillDownloadurlQueryRequest();
request.setBizContent("""
{
"bill_type": "trade",
"bill_date": "2026-09-13"
}
""");
request.putOtherTextParam("app_auth_token", appAuthToken);
AlipayDataDataserviceBillDownloadurlQueryResponse response =
alipayClient.execute(request);
if (response.isSuccess()) {
String downloadUrl = response.getBillDownloadUrl();
System.out.println(downloadUrl);
} else {
System.out.println(response.getCode());
System.out.println(response.getSubCode());
System.out.println(response.getSubMsg());
}
接口通常返回临时下载地址,而不是账单文件本身。下载程序应及时获取文件,并处理好链接过期、重复下载、网络超时和文件完整性校验。
4. 在商户侧统一汇总
如果商户需要一份覆盖多个服务商和多个支付产品的统一对账结果,可以按以下流程处理:
- 按账单日期遍历所有有效的服务商授权。
- 使用各服务商应用及对应的
app_auth_token获取账单。 - 下载并解析各账单文件。
- 按支付平台交易号和商户订单号去重。
- 将 APP 支付、手机网站支付等产品映射为内部渠道类型。
- 与商户订单、退款单和资金流水核对。
- 输出差错记录和汇总报表。
内部汇总结构可以设计为:
{
"merchant_order_no": "ORDER_202609140001",
"platform_trade_no": "2026091422000000000001",
"service_provider": "provider_a",
"app_id": "2021000000000000",
"payment_product": "wap",
"trade_status": "TRADE_SUCCESS",
"trade_amount": "100.00",
"refund_amount": "0.00",
"bill_date": "2026-09-14"
}
商户能否直接取得全量账单
需要分别看商户后台下载和接口自动下载两种场景。
商户后台下载
支付平台的商户后台可能提供商户主体维度的资金账单或交易账单,覆盖范围可能比单个服务商应用更广。账单是否包含所有服务商和所有支付产品的交易,取决于账单类型、签约主体、收款账户及平台当前规则,不能仅凭“已经授权多个服务商”作出判断。
接口自动下载
开放接口通常有明确的应用和授权边界。如果平台没有提供商户主体级的聚合账单接口,就需要分别调用各条授权链路,再自行合并结果。某个服务商的 app_auth_token 不能当作商户的全局数据访问令牌使用。
注意事项
- 每个服务商应使用独立的应用和授权令牌,不能共享私钥或混用
app_auth_token。 - 授权令牌可能失效、被撤销或更换,调用时需要妥善处理授权异常。
- 交易查询接口适合核实具体订单的状态,不适合无条件拉取商户的全部历史交易。
- 对账应主要以平台账单为依据,同时结合异步通知和主动查询补充交易状态。
- 除非系统已经实现明确的幂等和路由控制,否则不要将同一业务订单交给多个服务商重复创建。
- 多份账单的字段、编码、压缩格式或金额口径可能不同,合并前需要先做标准化处理。
- “支付产品相同”不代表“数据权限相通”。数据权限仍取决于应用、授权关系和接口规则。
- 接口实际可见的数据范围可能随平台产品规则调整。上线前,应使用商户真实的签约和授权关系进行验证,并以开放平台当前接口文档及后台实际账单范围为准。
备注:内容仅供参考。
