PAYATHON 2026

沙箱环境创建订单后查询接口提示交易不存在

支付小周

结论

沙箱环境不一定有问题。创建订单后查询提示“交易不存在”,常见原因是订单还未支付、查询字段填错,或创建和查询请求使用了不同的沙箱应用。

“创建订单接口调用成功”仅表示平台受理了下单请求,不代表交易已经支付成功,也不意味着订单能立即通过所有查询方式查到。

常见原因

1. 订单尚未完成支付

部分支付接口只会返回支付页面、表单或跳转地址。需要使用沙箱买家账号完成付款,交易才会进入可查询的支付状态。

先检查创建接口的实际返回值,再确认是否已在沙箱收银台完成支付。

2. 混用了 out_trade_no 和 trade_no

这两个字段的含义不同:

  • out_trade_no:商户生成的订单号。
  • trade_no:支付平台生成的交易号,通常在支付成功后返回。

创建订单时如果使用了 out_trade_no,查询时也应把该值填入 out_trade_no,不能填入 trade_no。

{
  "out_trade_no": "ORDER_202609140001"
}

如果已经取得平台交易号,也可以使用 trade_no 查询:

{
  "trade_no": "平台返回的交易号"
}

不要把同一个订单号同时填入两个字段,也不要互换字段。

3. 创建与查询使用了不同环境

创建和查询请求必须指向同一个网关。例如,不能在沙箱环境创建订单后到正式环境查询,反过来也不行。

以支付宝开放平台接口为例,沙箱请求通常使用以下网关:

https://openapi-sandbox.dl.alipaydev.com/gateway.do

具体地址以当前平台控制台和官方文档显示的信息为准,不要直接沿用旧示例中的网关地址。

4. app_id 或沙箱配置不一致

交易数据通常按应用隔离。即使订单号完全相同,使用另一个沙箱应用的 app_id 查询,也可能收到交易不存在的提示。

检查创建和查询请求是否使用了相同的:

  • app_id
  • 沙箱网关
  • 商户身份
  • 签名方式
  • 应用私钥及对应公钥
  • SDK 环境配置

5. 创建接口并未真正成功

HTTP 请求成功或 SDK 没有抛出异常,不代表业务下单成功。除了确认接口返回了内容,还要检查业务响应中的状态码、错误码和错误信息。

例如,应确认响应符合平台规定的成功条件:

if (response.isSuccess()) {
    System.out.println("创建请求受理成功");
} else {
    System.out.println(response.getCode());
    System.out.println(response.getSubCode());
    System.out.println(response.getSubMsg());
}

不同 SDK 使用的响应类和方法可能不同,请以实际使用的 SDK 为准。

建议的排查步骤

  1. 确认创建订单的业务响应确实成功,并记录完整响应中的 code、sub_code、sub_msg。
  2. 确认已经使用沙箱买家账号在沙箱收银台完成支付。
  3. 核对查询参数:商户订单号填入 out_trade_no,平台交易号填入 trade_no。
  4. 比较两次请求的网关地址和 app_id,确认两者完全一致。
  5. 检查订单号中是否含有空格或换行,以及程序是否重新生成了订单号。
  6. 确认查询请求与创建请求使用相同的签名配置。
  7. 使用新的、全局唯一的 out_trade_no 重新创建订单并完成支付,然后再次查询。

查询请求可以只保留核心参数:

{
  "out_trade_no": "ORDER_202609140001"
}

伪代码示例如下:

String outTradeNo = "ORDER_202609140001";

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("""
{
  "out_trade_no": "%s"
}
""".formatted(outTradeNo));

AlipayTradeQueryResponse response = alipayClient.execute(request);

System.out.println(response.getCode());
System.out.println(response.getSubCode());
System.out.println(response.getSubMsg());
System.out.println(response.getBody());

注意事项

沙箱数据和正式环境数据不能互相查询,不同沙箱应用之间的交易通常也无法互查。订单号还要保持唯一。调试时,不要反复使用已经关闭、过期或创建失败的 out_trade_no。

目前没有创建响应、查询请求参数和错误码,仅凭“交易不存在”无法判断整个沙箱不可用。应先确认是否完成支付、查询字段是否正确,以及两次请求是否使用了同一个沙箱网关和 app_id。如果这些信息都一致,问题仍然持续出现,可以携带完整请求时间、app_id、out_trade_no、接口名称和错误码,请平台技术支持核查。

备注:内容仅供参考。