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。不要在生产日志中输出完整令牌。
推荐的定位顺序
- 确认账单属于哪个支付宝商家账号或 PID。
- 确认当前
app_id对应商家自研应用还是服务商应用。 - 如果是服务商应用,检查并传入该商家的
app_auth_token。 - 暂时移除所有订单号,只按时间分页查询。
- 在合理范围内扩大查询时间,并核对时区和时间字段口径。
- 确认目标记录是否属于接口定义的“买入交易”。
- 再使用准确的支付宝交易号或
merchant_order_no分别缩小查询范围。 - 如果结果仍为空,携带
trace_id、app_id、脱敏后的商家身份、查询时间范围和订单号,请支付宝技术支持核查数据归属。
当前日志中的 trace_id 为:
21d01eb517875765940534118ea3b4
提交工单时,应同时说明接口返回 10000/Success,但 total_size=0,以便区分网关调用失败和业务数据未命中。不要对外公开日志中的签名、私钥、完整授权令牌等敏感信息。
备注:内容仅供参考。
