bill_type=trade 时无法下载支付宝对账单
支付老李
结论
如果使用 bill_type=trade 返回“账单不存在”,而你要下载的是支付宝账户资金收支明细,请将 bill_type 设置为:
signcustomer
例如:
{
"bill_type": "signcustomer",
"bill_date": "2026-09-12"
}
trade 和 signcustomer 是两种不同的账单类型,不能互相替代:
trade:交易业务账单,主要记录支付、退款等交易。signcustomer:账户账务账单,主要记录支付宝账户余额的收入、支出和资金变动。
因此,使用 trade 查询不到记录,不一定是接口调用失败。也可能是该商户在指定日期或当前业务场景下没有生成交易业务账单。
解决步骤
1. 按对账目标选择账单类型
需要核对支付宝账户的资金收支时,使用:
bill_type=signcustomer
如果要查询支付交易明细,可以继续使用:
bill_type=trade
同时需要确认指定日期是否有交易业务账单。
2. 检查账单日期
bill_date 通常按自然日传递,格式为:
yyyy-MM-dd
例如:
2026-09-12
不要查询尚未结束或账单尚未生成的日期。当天账单通常无法立即取得,具体生成时间以当前支付宝开放平台接口说明和商户实际开通的产品能力为准。
3. 确认调用使用了正确的商户身份
调用接口所用的应用、商户账号和授权关系,必须与产生资金流水的账号一致。服务商代商户调用时,还需要确认应用授权令牌属于目标商户。
如果账号主体不一致,即使该日期实际发生过交易,接口也可能返回“账单不存在”。
Java 示例
下面的示例用于查询账户账务账单:
AlipayDataDataserviceBillDownloadurlQueryRequest request =
new AlipayDataDataserviceBillDownloadurlQueryRequest();
request.setBizContent("""
{
"bill_type": "signcustomer",
"bill_date": "2026-09-12"
}
""");
AlipayDataDataserviceBillDownloadurlQueryResponse response =
alipayClient.execute(request);
if (response.isSuccess()) {
String downloadUrl = response.getBillDownloadUrl();
System.out.println(downloadUrl);
} else {
System.out.println("code: " + response.getCode());
System.out.println("subCode: " + response.getSubCode());
System.out.println("subMsg: " + response.getSubMsg());
}
如果要查询交易业务账单,只需将参数改为:
{
"bill_type": "trade",
"bill_date": "2026-09-12"
}
使用这种账单类型前,需要确认目标商户在该日期确实生成了可下载的交易账单。
下载账单
接口返回的是账单下载地址,不是账单文件本身。取得 bill_download_url 后,应立即通过 HTTP 请求下载文件,再按返回的压缩格式保存和解压。
curl -L "$BILL_DOWNLOAD_URL" -o alipay_bill.zip
下载地址通常有时效限制,不建议保存后过一段时间再使用。如果地址已经失效,请重新调用 alipay.data.dataservice.bill.downloadurl.query 获取新地址。
注意事项
- 不要为了消除“账单不存在”而直接把
trade改成signcustomer,两种账单的数据口径不同。 - 查询账户资金流水时,优先使用
signcustomer。 - 查询支付、退款等交易记录时,应使用
trade,并检查账单日期、商户身份、应用授权和当日业务数据。 - 接口成功返回下载地址,并不表示两类账单的内容完全一致。后续对账时,应根据各自的实际字段分别处理。
- 如果
signcustomer仍然返回“账单不存在”,请记录code、sub_code、sub_msg和请求日期,再根据当前支付宝开放平台文档核对商户是否具备相应的账单能力。
备注:内容仅供参考。
