PAYATHON 2026

alipay.data.dataservice.bill.downloadurl.query 缺少分销商账单数据

支付老李

结论

alipay.data.dataservice.bill.downloadurl.query 不会根据 分销商 身份主动筛选账单。它返回的是当前查询主体在指定账期和账单类型下能够查看的支付宝账单。

如果部分分销商使用自己的支付宝商户账号、seller_id 或其他收款主体完成交易,相关流水通常属于分销商自己的账务主体,不会出现在平台或服务商账号的账单中。服务商代商户调用接口时,还要传入该商户有效的 app_auth_token。仅以服务商自身身份查询,无法汇总所有分销商的数据。

为什么会缺少分销商数据

这个接口查询的是支付宝账单,并非业务系统中的全渠道订单汇总。实际能查到哪些记录,通常取决于以下因素:

  • 当前请求对应的支付宝账号或商户主体。
  • 第三方应用代调用时,app_auth_token 对应的授权商户。
  • bill_type 指定的账单类型。
  • bill_date 指定的日账单或月账单账期。
  • 交易是否已经进入相应账期,账单是否已经生成。
  • 交易、退款、手续费等记录实际所属的 seller_id、收款账号和结算主体。

例如,平台保存了一笔分销订单,但付款时实际收款方是分销商自己的支付宝商户账号,这笔流水就属于分销商的账单。平台用自己的身份查询时看不到,是因为账务归属不同,并不是接口随机漏掉了数据。

如果业务使用分账、返佣或其他资金产品,也不能默认所有资金变动都会作为普通交易流水出现在同一个 trade 账单文件中。具体记录方式要以相应资金产品的账单规则和接口为准。

排查步骤

1. 核对缺失订单的收款主体

从支付请求、支付结果通知或交易查询结果中确认以下信息:

  • seller_id
  • 收款支付宝账号
  • 商户订单号 out_trade_no
  • 支付宝交易号 trade_no
  • 交易完成时间
  • 是否发生退款、分账或结算

重点对比正常流水和缺失流水的 seller_id。如果两者不同,需要分别使用各自的商户主体查询账单。

2. 检查代调用授权

服务商为客户或分销商查询账单时,应使用该商户授权后取得的 app_auth_token:

AlipayTradeService service = new AlipayTradeService(...);

AlipayDataDataserviceBillDownloadurlQueryRequest request =
        new AlipayDataDataserviceBillDownloadurlQueryRequest();

request.setBizContent("""
{
  "bill_type": "trade",
  "bill_date": "2026-09-01"
}
""");

// 必须是目标商户对应的有效授权令牌
request.putOtherTextParam("app_auth_token", merchantAppAuthToken);

AlipayDataDataserviceBillDownloadurlQueryResponse response =
        alipayClient.execute(request);

if (response.isSuccess()) {
    String downloadUrl = response.getBillDownloadUrl();
    System.out.println(downloadUrl);
} else {
    System.err.printf(
        "code=%s, subCode=%s, msg=%s, subMsg=%s%n",
        response.getCode(),
        response.getSubCode(),
        response.getMsg(),
        response.getSubMsg()
    );
}

这段示例只展示关键调用方式。SDK 初始化、签名算法和异常处理仍应沿用项目现有配置。

如果没有传入 app_auth_token,请求通常会以应用绑定的调用主体执行,不会自动遍历该应用下的所有授权商户。

3. 核对账单类型和日期

交易对账一般使用以下参数:

{
  "bill_type": "trade",
  "bill_date": "2026-09-01"
}

需要注意:

  • bill_date 应按照支付宝账单的账期填写,不能直接使用业务系统中的订单创建时间。
  • 跨日完成、延迟支付或退款可能会计入其他账期。
  • 如果日账单尚未生成,需要稍后重试。
  • 查询月账单时,应使用接口规定的月份格式,不能自行拼接日期范围。
  • signcustomer 等其他账单类型与交易账单用途不同,不能互相替代。

支付宝开放平台可能调整支持的日期格式、可查询期限和账单生成时间,请以当前接口文档为准。

4. 在下载文件中按多个字段检索

不要只按业务系统中的分销商名称查找。下载并解压账单后,可结合以下字段定位记录:

  • trade_no
  • out_trade_no
  • 商户订单号
  • 交易创建时间与完成时间
  • 收款主体
  • 退款单号

同一笔业务订单可能对应支付、退款、手续费等多条记录,也可能因为账期不同而分布在多个文件中。

5. 分别查询每个商户主体

如果每个分销商都是独立的收款商户,通常需要按以下方式处理:

  1. 由每个分销商向服务商应用完成授权。
  2. 安全保存各商户对应的 app_auth_token。
  3. 按商户、账期和账单类型分别调用接口。
  4. 下载并解析各商户的账单。
  5. 在业务系统中统一归集和对账。

该接口一般不会直接返回服务商及其全部分销商的合并账单。

调用示例

以下是支付宝 Java SDK 的常见调用结构:

AlipayClient alipayClient = new DefaultAlipayClient(
        gatewayUrl,
        appId,
        privateKey,
        "json",
        "UTF-8",
        alipayPublicKey,
        "RSA2"
);

AlipayDataDataserviceBillDownloadurlQueryRequest request =
        new AlipayDataDataserviceBillDownloadurlQueryRequest();

request.setBizContent("""
{
  "bill_type": "trade",
  "bill_date": "2026-09-01"
}
""");

AlipayDataDataserviceBillDownloadurlQueryResponse response =
        alipayClient.execute(request, merchantAppAuthToken);

if (!response.isSuccess()) {
    throw new IllegalStateException(
            "账单地址查询失败:" +
            response.getCode() + "/" +
            response.getSubCode() + " " +
            response.getSubMsg()
    );
}

String billDownloadUrl = response.getBillDownloadUrl();

不同版本的 Java SDK 可能提供不同的 execute 重载方式。有些版本通过 execute(request, appAuthToken) 传入授权令牌,有些项目则使用 putOtherTextParam("app_auth_token", ...)。应根据实际 SDK 的方法签名选择其中一种,不要重复传入不同商户的令牌。

注意事项

  • 下载地址通常有有效期,取得后应及时下载,不要将其保存为永久文件地址。
  • app_auth_token 不能由多个商户共用,它与具体的授权主体相关。
  • 检查授权是否已经失效、被解除,或缺少所需权限。
  • 对账时应结合支付宝交易号和商户订单号进行匹配,不要只按金额匹配。
  • 如果 seller_id、授权商户、账期和 bill_type 都一致,但成功交易仍未出现在账单中,应整理请求参数、响应中的 code/sub_code、trade_no、out_trade_no 和交易时间,再通过支付宝开放平台技术支持核查账务归属。工单或日志中不要提交私钥、完整授权令牌等敏感信息。

备注:内容仅供参考。