PAYATHON 2026

bill_type=trade 返回 isp.bill_not_exist 如何解决?

支付老李

结论

bill_type = trade 返回 isp.bill_not_exist,通常说明按当前条件查询不到可下载的交易账单,不一定是接口权限或签名配置有误。

bill_type = signcustomer 能正常返回,只能证明签约客户账单存在,而且接口调用链路正常。trade 和 signcustomer 是两种不同的账单,其生成条件和数据范围也不同,因此不能据此判断交易账单一定存在。

常见原因

1. 查询日期内没有可入账的交易

trade 查询的是交易账单。如果指定日期内没有归属于当前商户、应用或授权主体的支付宝交易,平台可能不会生成当天的交易账单,并返回:

{
  "code": "40004",
  "msg": "Business Failed",
  "sub_code": "isp.bill_not_exist",
  "sub_msg": "账单不存在"
}

有业务订单不代表一定有支付宝交易账单。订单可能尚未支付、已经关闭,也可能由其他主体实际收款。

2. 账单尚未生成

交易账单并非实时生成。查询当天或时间较近的账单时,账单可能还没有完成汇总,因此接口会返回不存在。

具体生成时间以接口文档和支付宝后台的实际可下载时间为准。排查时,可以先查询一个更早且确认发生过成功交易的日期。

3. bill_date 格式或账期不符合要求

检查 bill_date 是否符合接口要求,例如:

2026-09-08

如果查询月账单,还需要确认当前接口和账单类型是否支持月账期,以及对应格式是否为:

2026-08

除了字符串格式,还要确认该日期处于接口允许查询的时间范围内。

4. 查询主体与实际收款主体不一致

需要逐项核对以下主体:

  • 发起请求的 app_id
  • 应用签约主体
  • 实际收款的支付宝商户
  • 服务商代商户调用时的被授权商户
  • app_auth_token 对应的授权主体

如果交易发生在商户 A 名下,却使用商户 B 的授权信息查询,即使日期正确,也可能返回账单不存在。

在服务商模式下,还要检查是否遗漏了 app_auth_token,或错用了、缓存了其他商户的 app_auth_token。

5. 交易不在当前接口的查询范围内

部分交易可能来自其他应用、其他商户主体或不同的资金产品。可以结合支付宝商家后台的交易记录确认:

  • 交易是否确实归属于当前商户;
  • 交易时间是否在所查询的账期内;
  • 交易是否已经进入账单;
  • 后台能否下载同一日期的交易账单。

建议的排查顺序

第一步:在商家后台确认账单是否存在

使用与接口查询主体相同的商户账号登录支付宝商家后台,确认目标日期是否有交易,以及是否有可下载的交易账单。

可以按以下情况判断:

  • 后台也没有账单:优先检查当天是否有交易、账单是否已经生成,以及查询主体是否正确。
  • 后台有账单,但接口返回不存在:重点检查 app_id、授权主体、app_auth_token、bill_date 和请求环境。
  • 后台交易属于其他商户:改用实际收款主体对应的应用或授权令牌查询。

第二步:选择确认有交易的历史日期测试

先不要查询当天。选择一个已经在后台看到成功交易,且账单已经生成的历史日期进行测试:

bill_type = trade
bill_date = 已确认存在交易账单的日期

如果历史日期能够正常查询,通常说明接口配置没有问题。原日期可能没有账单,或者账单尚未生成。

第三步:核对请求参数

可以按以下形式检查业务参数:

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

Java SDK 调用示例:

AlipayDataDataserviceBillDownloadurlQueryRequest request =
    new AlipayDataDataserviceBillDownloadurlQueryRequest();

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

AlipayDataDataserviceBillDownloadurlQueryResponse response =
    alipayClient.execute(request);

System.out.println(response.getBody());

如果是服务商代商户调用,应使用该商户有效的授权令牌。具体使用哪个 SDK 重载方法,以当前 SDK 版本为准,例如:

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

排查日志至少应记录:

app_id
bill_type
bill_date
app_auth_token 对应的授权商户(令牌本身应脱敏)
请求时间
支付宝返回的 code、sub_code、sub_msg
支付宝响应中的 request_id、trace_id 等链路标识(如果存在)

不要在日志或工单中提交应用私钥、支付宝公钥、完整访问令牌等敏感信息。

第四步:比较成功和失败请求

既然 signcustomer 可以成功,可以把两次请求放在一起比较,但不能只看 bill_type,还要确认:

  • app_id 是否相同;
  • bill_date 是否相同;
  • 是否使用了同一个授权商户;
  • 是否使用同一套生产环境配置;
  • app_auth_token 是否相同且未过期;
  • 成功交易是否属于该授权商户。

提交工单时如何选择分类

支付宝工单入口和分类名称可能会调整,请选择最接近以下路径的分类:

开放平台 / API 接口问题
→ 资金或账务
→ 对账单 / 账单下载
→ 查询对账单下载地址

如果找不到“对账单”或“账单下载”分类,可以选择:

开放平台接口调用
→ 业务报错
→ 其他接口问题

问题标题可以直接写明:

alipay.data.dataservice.bill.downloadurl.query 查询 trade 账单返回 isp.bill_not_exist

不建议提交到签名、验签或网络异常分类。当前收到的是支付宝业务层返回的 40004 / isp.bill_not_exist,说明请求已经到达接口并得到处理。

工单需要提供的信息

建议一次提供以下信息,避免后续反复补充材料:

  1. 接口名称:

    alipay.data.dataservice.bill.downloadurl.query
    
  2. 调用环境:

    生产环境或沙箱环境
    
  3. 精确到秒的调用时间,并注明时区。

  4. app_id。

  5. bill_type 和 bill_date:

    {
      "bill_type": "trade",
      "bill_date": "2026-09-08"
    }
  6. 完整响应内容:

    {
      "alipay_data_dataservice_bill_downloadurl_query_response": {
        "msg": "Business Failed",
        "code": "40004",
        "sub_msg": "账单不存在",
        "sub_code": "isp.bill_not_exist"
      }
    }
  7. 响应中的 request_id、trace_id 或其他链路编号,如果实际响应中存在。

  8. 商户支付宝账号或商户 PID。账号可以按工单要求脱敏,但提供的信息应足以让技术支持定位到对应主体。

  9. 是否由服务商代为调用。如果是,请提供被授权商户 PID、授权关系和脱敏后的授权令牌标识。

  10. 能够证明目标日期存在交易的支付宝交易号,例如:

    trade_no
    out_trade_no
    交易完成时间
    收款商户
    
  11. 商家后台能否看到并下载同一日期的交易账单,最好附上相关截图。

  12. 一组成功的对照请求,例如同一主体下 signcustomer 的成功结果。下载地址、令牌等敏感字段需要脱敏。

注意事项

  • signcustomer 查询成功不代表 trade 账单存在,两种账单需要分别判断。
  • 不要反复查询当天账单,先用确认有交易的历史日期验证。
  • 交易号必须属于当前查询的商户或授权商户。
  • 提交工单前,确认请求来自生产环境还是沙箱环境。两个环境的数据不互通。
  • 工单中不要提供应用私钥、完整 app_auth_token、AES 密钥等敏感凭证。
  • 如果后台也没有目标日期的交易账单,先确认交易归属和账单生成情况。如果后台可以下载,但接口持续返回 isp.bill_not_exist,再携带请求链路信息提交工单定位。

备注:内容仅供参考。