PAYATHON 2026

如何获取多个商家的支付宝交易流水并进行分析?

支付老李

结论

支付宝通常没有“传入 N 个商家 ID,批量返回全部交易流水”的接口。不同商家的资金和交易数据彼此隔离,仅凭商家编号无法直接查询。

实际接入时,一般需要:

  1. 通过服务商或第三方应用模式接入支付宝开放平台。
  2. 由每个商家单独授权应用。
  3. 分别保存各商家的 app_auth_token。
  4. 后台使用对应令牌,逐个调用对账单或账务明细接口。
  5. 下载并解析数据,再在自己的系统中汇总分析。

能否查询“全部支付宝交易流水”,取决于应用类型、已签约产品、接口权限和商家的授权范围。具体权限应以支付宝开放平台控制台和对应接口的最新文档为准。

两个接口分别适合什么场景

alipay.data.dataservice.bill.downloadurl.query

该接口用于获取对账单下载地址,适合批量分析交易流水。

通常的处理流程如下:

商家授权
    ↓
获得该商家的 app_auth_token
    ↓
按商家、账单日期查询下载地址
    ↓
下载压缩包
    ↓
解析账单文件
    ↓
写入数据仓库或分析系统

接口返回的是临时下载地址,不会直接返回全部流水记录。账单通常按日或按月生成,适用于对账、经营分析和离线统计,不适合秒级实时查询。

alipay.data.bill.accountlog.query

该接口查询支付宝账户的账务明细,主要用于查看账户资金变动。账务明细与业务订单流水的口径不一定相同,例如退款、手续费和转账等资金变动,未必能与交易订单逐笔对应。

如果要分析支付订单、退款和手续费,通常应优先评估交易对账单。如果要核对账户余额变化,则需要结合实际权限评估账务明细接口。

推荐的接入方案

1. 创建第三方应用

如果系统要服务多个独立商家,应选择支持代商家调用的第三方应用或服务商接入模式,不要让所有商家共用一套普通商家应用凭证。

第三方应用使用自己的:

app_id
应用私钥
支付宝公钥或支付宝公钥证书

每个商家授权后,系统还会获得该商家对应的授权令牌。

2. 让商家逐一授权

商家需要在支付宝提供的授权页面确认授权。授权回调通常会返回授权码,服务端再通过授权令牌接口换取:

app_auth_token
app_refresh_token
auth_app_id

这些字段的用途分别是:

  • app_auth_token:代表商家调用支持代调用的接口。
  • app_refresh_token:用于刷新授权令牌。
  • auth_app_id:用于识别实际授权商家或商家应用。

每组令牌都必须绑定到对应的内部商家记录,不能在商家之间混用。

数据结构可以参考:

CREATE TABLE merchant_alipay_auth (
    merchant_id       VARCHAR(64)  NOT NULL,
    auth_app_id       VARCHAR(64)  NOT NULL,
    app_auth_token    TEXT         NOT NULL,
    app_refresh_token TEXT,
    token_expires_at  DATETIME,
    auth_status       VARCHAR(20)  NOT NULL,
    PRIMARY KEY (merchant_id)
);

令牌是敏感凭证,需要加密保存,同时限制日志、运维平台和分析人员的访问权限。

3. 按商家调用账单接口

支付宝接口通常一次只代表一个授权主体执行。后台需要遍历所有已授权商家,并在每次请求中传入当前商家的 app_auth_token。

下面是 Java SDK 风格的示例。不同版本 SDK 的方法重载可能略有差异,应以当前 SDK 文档为准。

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

public String queryTradeBillUrl(
        AlipayClient alipayClient,
        String appAuthToken,
        String billDate) throws AlipayApiException {

    AlipayDataDataserviceBillDownloadurlQueryRequest request =
        new AlipayDataDataserviceBillDownloadurlQueryRequest();

    request.setBizContent(
        "{"
            + "\"bill_type\":\"trade\","
            + "\"bill_date\":\"" + billDate + "\""
        + "}"
    );

    // accessToken 传 null,第三个参数是当前商家的 app_auth_token。
    AlipayDataDataserviceBillDownloadurlQueryResponse response =
        alipayClient.execute(request, null, appAuthToken);

    if (!response.isSuccess()) {
        throw new IllegalStateException(
            "查询账单失败,code=" + response.getCode()
                + ", subCode=" + response.getSubCode()
                + ", message=" + response.getSubMsg()
        );
    }

    return response.getBillDownloadUrl();
}

批量调度时,可以按照商家和账单日期拆分任务:

for (MerchantAuth merchant : authorizedMerchants) {
    try {
        String downloadUrl = queryTradeBillUrl(
            alipayClient,
            merchant.getAppAuthToken(),
            billDate
        );

        submitDownloadAndParseTask(
            merchant.getMerchantId(),
            billDate,
            downloadUrl
        );
    } catch (Exception e) {
        recordFailure(
            merchant.getMerchantId(),
            billDate,
            e.getMessage()
        );
    }
}

不要把所有商家的处理放在一个无法单独恢复的大事务中。可以将任务拆分为:

merchant_id + bill_date + bill_type

每个组合单独执行,独立重试并记录状态。

4. 下载并解析账单

账单下载地址通常有有效期,获取后应尽快下载。不要把临时 URL 当作长期数据地址保存。

建议保存以下信息:

  • 原始账单文件及其校验值
  • 商家内部 ID
  • 账单类型和账单日期
  • 下载时间
  • 解析状态
  • 数据版本或导入批次
  • 失败原因和重试次数

解析时不要只按 CSV 列位置读取数据。账单中可能有标题行、汇总行或说明行,应根据实际文件格式进行校验,并在格式发生变化时触发告警。

如果只分析通过自己系统产生的交易

如果所有交易都由你的应用发起,更适合在支付发生时建立本地订单库:

  1. 创建支付订单时,保存商家、业务订单号和支付宝交易号。
  2. 验证支付宝异步通知的签名。
  3. 根据通知更新支付、退款和关闭状态。
  4. 必要时调用交易查询接口进行补偿。
  5. 定期下载对账单,与本地订单核对。

这种方式实时性更好,对账单主要用于核对和补漏。

不过,它只能覆盖经由你的应用产生的交易。商家通过其他应用、收款码、门店系统或其他渠道产生的交易,不会自动进入你的订单库。如果要分析商家支付宝账户的完整交易情况,仍需取得商家的明确授权,并确认目标账单接口支持所需的数据范围。

需要特别注意的问题

没有授权不能查询

即使已经知道商家的支付宝账号、商家编号或 user_id,也不能据此查询其交易流水。查询前必须取得合法授权,并拥有相应的接口权限。

授权不代表一定拥有接口权限

商家完成应用授权,只表示允许应用在已经开放的范围内代其调用接口。第三方应用本身还必须具备对应产品和接口权限,否则仍可能收到无权限或未签约错误。

不要共享商家密钥

不建议要求商家把各自的应用私钥交给平台。采用第三方应用授权模式后,平台只需统一管理自己的密钥,再通过 app_auth_token 区分不同商家,安全边界也更明确。

做好限流和失败隔离

N 个商家的请求不能无限并发。应根据接口限流规则设置并发数,并处理以下情况:

  • 令牌过期
  • 商家取消授权
  • 账单尚未生成
  • 下载地址过期
  • 网络超时
  • 重复导入
  • 接口限流
  • 账单格式变化

数据导入需要保持幂等,可以使用“商家 ID + 账单日期 + 业务流水唯一标识”建立唯一约束。

明确数据合规边界

交易流水可能包含订单、金额和付款方标识等敏感信息。接入前应取得商家的明确授权,并限定数据用途、保存期限和可访问人员。对外展示分析结果时,也要避免泄露不同商家的明细数据。

因此,这类需求不是寻找一个新的“多商家批量流水接口”,而是搭建一套第三方应用授权和后台调度体系。每个商家单独授权,每次调用携带对应的 app_auth_token,分别取得账单后,再由后台统一汇总分析。

备注:内容仅供参考。