PAYATHON 2026

alipay.data.bill.buy.query 查询不到已有账单

支付阿杰

结论

从日志来看,请求已通过网关校验。code=10000 只说明接口调用成功,total_size=0 则说明在当前查询主体和筛选条件下,没有匹配的“买入交易”。这不等于支付宝账户中没有其他账单。

首先应检查查询主体。日志中只有:

app_id=2021006168683252

没有看到 app_auth_token。如果第三方应用代商家发起查询,必须携带该商家授权产生的 app_auth_token。接口不会根据订单号自动切换到对应的商家账户,所以很容易出现调用成功、数据却为空的情况。

如果是商家自研应用,需要确认该应用实际绑定的支付宝商家账号或 PID 是否就是账单所属主体。另外,alipay.data.bill.buy.query 只查询接口定义范围内的“买入交易”,不能用于查询所有支付订单或全部账务明细。

为什么没有报错

下面的返回结果包含两层含义:

{
  "code": "10000",
  "msg": "Success",
  "page_no": "1",
  "page_size": "10",
  "total_size": "0"
}
  • code=10000:签名、必填参数、接口权限等基础校验已经通过。
  • total_size=0:当前查询主体下,没有符合订单号、时间范围和交易类型的记录。

订单号只是筛选条件,不是商户身份凭证。即使传入其他商家的真实订单号,接口通常仍只会在当前授权主体的数据范围内查询,不会因此返回权限错误。

排查步骤

1. 确认是否属于代商家调用

如果应用由服务商开发,并代已授权商家查询,需要检查:

  • 商家是否已经完成应用授权。
  • 当前 app_auth_token 是否属于账单所在商家。
  • 授权是否仍然有效,是否已被取消或重新授权。
  • 调用接口时是否确实将令牌传给了 SDK。
  • 应用是否已获得该接口要求的产品权限或授权范围。

日志的协议参数中没有 app_auth_token,因此应优先检查调用代码,不必继续更换订单号。

如果是商家自研应用,不需要机械地补充 app_auth_token,但必须核对应用所属账号和账单所属账号是否一致,尤其要分清:

  • 开放平台应用所属账号;
  • 支付宝商家账号;
  • 收款主体/PID;
  • 门店或子商户;
  • 服务商与被服务商户。

2. 先去掉订单号,只保留较小的时间范围

可以先验证查询主体是否正确:

{
  "start_time": "2026-08-22 19:03:13",
  "end_time": "2026-08-24 21:03:13",
  "page_no": "1",
  "page_size": "100"
}

如果仍然返回 total_size=0,问题通常不在订单号类型,而可能是以下情况之一:

  • 当前查询主体不正确;
  • 查询时间口径不正确;
  • 现有账单不属于“买入交易”;
  • 数据尚未进入该接口对应的数据集;
  • 接口权限或商家授权范围不匹配。

排查时可以适当向前、向后扩大时间范围,但要遵守接口文档对单次查询跨度和可查询历史期限的限制。

3. 核对订单号字段

不要混用不同体系中的编号:

  • merchant_order_no:应填写商户创建业务时生成并提交给支付宝的商户订单号。
  • 支付宝订单号:应填写接口文档指定的支付宝交易号字段,通常是支付宝返回的交易号,而不是账务流水号、支付凭证号或商户订单号。

具体字段名和支持的编号类型应以当前接口文档为准。不要将同一个值分别填入多个订单号字段,再据此判断接口异常。

4. 确认接口是否适合目标数据

alipay.data.bill.buy.query 查询的是接口定义的“买入交易”。商家后台显示的“账单”也可能属于其他数据类别,例如:

  • 支付交易;
  • 退款;
  • 服务费;
  • 资金转入、转出;
  • 结算或分账;
  • 账户收支明细;
  • 对账单中的其他业务类型。

因此,商家后台有账单,并不能证明这个接口一定能查到相应记录。

如果要查询单笔支付结果,应优先使用对应的交易查询接口。财务对账通常应考虑对账单下载类接口。查询账户资金流水时,则要确认是否应该使用账务明细类接口。具体应选择哪个接口,取决于支付产品和账单类型,不能只根据订单号判断。

5. 核对时间字段的业务口径

日志中的查询范围是:

2026-08-22 19:03:13 ~ 2026-08-24 21:03:13

需要确认接口使用的是哪一种时间:

  • 订单创建时间;
  • 支付成功时间;
  • 账务入账时间;
  • 交易完成时间。

同一笔订单的创建时间、支付时间和入账时间可能不同。还要检查服务器时区和序列化后的时间值,避免本地时间与接口采用的时间口径不一致。

Java SDK 调用示例

第三方应用代商家调用时,需要把授权令牌传给 SDK。不同 SDK 版本的方法签名可能略有差异,常见写法如下:

AlipayDataBillBuyQueryRequest request =
        new AlipayDataBillBuyQueryRequest();

AlipayDataBillBuyQueryModel model =
        new AlipayDataBillBuyQueryModel();

model.setStartTime("2026-08-22 19:03:13");
model.setEndTime("2026-08-24 21:03:13");
model.setPageNo(1L);
model.setPageSize(100L);

// 第一轮排查先不要设置订单号
// model.setMerchantOrderNo("17874931715452400491052");

request.setBizModel(model);

String appAuthToken = merchantAuthorization.getAppAuthToken();

AlipayDataBillBuyQueryResponse response =
        alipayClient.execute(request, null, appAuthToken);

if (response.isSuccess()) {
    System.out.println("totalSize=" + response.getTotalSize());
    System.out.println("body=" + response.getBody());
} else {
    System.out.println("code=" + response.getCode());
    System.out.println("subCode=" + response.getSubCode());
    System.out.println("subMsg=" + response.getSubMsg());
}

部分 SDK 也支持在请求对象上设置:

request.putOtherTextParam("app_auth_token", appAuthToken);
AlipayDataBillBuyQueryResponse response = alipayClient.execute(request);

应优先使用当前 SDK 文档推荐的调用方式,同时确认最终网关日志中确实出现了正确的 app_auth_token。不要在生产日志中输出完整令牌。

推荐的定位顺序

  1. 确认账单属于哪个支付宝商家账号或 PID。
  2. 确认当前 app_id 对应商家自研应用还是服务商应用。
  3. 如果是服务商应用,检查并传入该商家的 app_auth_token。
  4. 暂时移除所有订单号,只按时间分页查询。
  5. 在合理范围内扩大查询时间,并核对时区和时间字段口径。
  6. 确认目标记录是否属于接口定义的“买入交易”。
  7. 再使用准确的支付宝交易号或 merchant_order_no 分别缩小查询范围。
  8. 如果结果仍为空,携带 trace_id、app_id、脱敏后的商家身份、查询时间范围和订单号,请支付宝技术支持核查数据归属。

当前日志中的 trace_id 为:

21d01eb517875765940534118ea3b4

提交工单时,应同时说明接口返回 10000/Success,但 total_size=0,以便区分网关调用失败和业务数据未命中。不要对外公开日志中的签名、私钥、完整授权令牌等敏感信息。

备注:内容仅供参考。