PAYATHON 2026

支付宝小程序支付提示订单处理失败和交易不存在

支付阿杰

结论

这个问题通常不是“小程序尚未上架”“备案审核中”或“本地开发环境”直接引起的。更常见的原因是支付订单没有成功创建到支付宝交易系统,或者小程序传入了错误的订单号。

商户后台生成的订单号 out_trade_no,不能直接作为支付宝交易号 tradeNO 传给 my.tradePay。正确流程如下:

  1. 服务端生成唯一的 out_trade_no。
  2. 服务端调用 alipay.trade.create。
  3. 从接口响应中取得支付宝交易号 trade_no。
  4. 小程序把这个值作为 tradeNO 传给 my.tradePay。

如果只在自己的数据库中写入了订单记录,却没有成功调用 alipay.trade.create,支付宝侧就没有对应的交易,随后便可能出现“订单处理失败”和“交易不存在”。

商户订单号与支付宝交易号的区别

这三个字段的含义不同,不能混用:

  • out_trade_no:由商户系统生成的订单号,业务系统需要保证其唯一性。
  • trade_no:支付宝成功受理 alipay.trade.create 后返回的交易号。
  • tradeNO:my.tradePay 的入参名称,通常应传入支付宝返回的 trade_no。

下面这种写法有问题:

my.tradePay({
  tradeNO: merchantOrderNo
});

如果 merchantOrderNo 是商户后台生成的 out_trade_no,支付宝无法用它找到待支付交易。

应改为:

my.tradePay({
  tradeNO: response.trade_no,
  success: (result) => {
    console.log('支付调用结果:', result);
  },
  fail: (error) => {
    console.error('支付调用失败:', error);
  }
});

其中,response.trade_no 必须来自服务端调用 alipay.trade.create 后得到的有效响应,不能由前端或商户后台自行构造。

正确的支付流程

1. 服务端创建商户订单

服务端先生成唯一的商户订单号,例如:

String outTradeNo = generateUniqueOrderNo();

执行到这里,只能说明商户系统中已经有了订单,不能说明支付宝侧已经创建了交易。

2. 服务端调用 alipay.trade.create

以下代码只展示必要结构。具体参数名称和 SDK 调用方式,应以项目当前使用的支付宝开放平台 SDK 为准:

AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();

JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", outTradeNo);
bizContent.put("total_amount", "0.01");
bizContent.put("subject", "测试订单");
bizContent.put("buyer_id", buyerId);

request.setBizContent(bizContent.toJSONString());

AlipayTradeCreateResponse response = alipayClient.execute(request);

if (!response.isSuccess()) {
    throw new RuntimeException(
        "创建支付宝交易失败:" +
        response.getCode() + " / " +
        response.getSubCode() + " / " +
        response.getSubMsg()
    );
}

String tradeNo = response.getTradeNo();

这里需要检查 response.isSuccess(),同时确认 response.getTradeNo() 不为空。HTTP 请求成功或本地数据库插入成功,都不能证明支付宝交易已经创建。

3. 将支付宝交易号返回给小程序

服务端可以返回类似下面的数据:

{
  "outTradeNo": "ORDER202609080001",
  "tradeNo": "2026090822000000000000000000"
}

小程序再使用 tradeNo 发起支付:

my.request({
  url: 'https://example.com/api/payment/create',
  method: 'POST',
  data: {
    productId: '10001'
  },
  success: (res) => {
    const tradeNo = res.data.tradeNo;

    if (!tradeNo) {
      console.error('服务端未返回支付宝交易号', res.data);
      return;
    }

    my.tradePay({
      tradeNO: tradeNo,
      success: (payResult) => {
        console.log('支付结果:', payResult);
      },
      fail: (error) => {
        console.error('支付失败:', error);
      }
    });
  }
});

4. 服务端查询并确认支付结果

查询订单时,需要明确传入的是哪一种订单号:

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", outTradeNo);
// 或者:bizContent.put("trade_no", tradeNo);

request.setBizContent(bizContent.toJSONString());

AlipayTradeQueryResponse response = alipayClient.execute(request);

如果传入 out_trade_no 后仍然返回“交易不存在”,应检查以下问题:

  • alipay.trade.create 是否确实调用成功。
  • 查询时使用的 app_id 是否与创建交易时一致。
  • 是否混用了正式环境和沙箱环境。
  • out_trade_no 是否完全一致,有没有被截断、重复或重新生成。
  • 创建和查询交易时,是否使用了同一个商户身份、应用配置和密钥环境。

为什么会提示“交易不存在”

常见原因可以按以下顺序排查。

只生成了本地订单

数据库中有订单号,不代表支付宝中也有对应交易。只有成功调用 alipay.trade.create 后,支付宝才会创建可支付、可查询的交易。

tradeNO 传错

把 out_trade_no 当成 tradeNO 传入,是最常见的原因之一。my.tradePay 通常需要的是 alipay.trade.create 返回的 trade_no。

创建交易实际失败

有些代码只打印“订单生成成功”,却没有检查支付宝响应中的以下字段:

  • code
  • sub_code
  • sub_msg
  • trade_no

接口能正常返回,不代表业务处理成功。支付宝的完整响应应当记录下来,但日志中不要输出私钥、签名原文或敏感用户信息。

环境或应用身份不一致

常见情况包括:

  • 创建订单时使用沙箱网关,查询时却使用正式网关。
  • 创建和查询使用了不同的 app_id。
  • 小程序所属应用与服务端配置的开放平台应用不一致。
  • 服务端签名使用了另一套应用私钥。
  • 支付能力没有绑定到当前小程序或商户。

出现这些情况时,当前调用方可能无法找到之前创建的交易。

买家身份参数不正确

调用 alipay.trade.create 时,通常需要传入与当前支付宝用户对应的 buyer_id。这个值应通过小程序授权流程在服务端换取,不能用手机号、会员编号、商户用户 ID 或其他自定义编号代替。

与未上架、备案审核和本地测试的关系

一般情况下,小程序尚未正式上架,不代表无法进行支付联调。开发版或体验版能否支付,主要取决于应用、商户、支付产品、签约权限、账号身份和测试方式是否符合支付宝开放平台的要求。

还需要注意以下几点:

  • 当前开发阶段能否使用支付能力,应以支付宝开放平台控制台中该应用的实际状态为准。
  • 开发工具的模拟环境不一定能完整执行真实支付流程。支付通常需要在支付宝 App 内通过预览版或体验版测试。
  • 备案审核可能影响发布或部分线上能力,但“交易不存在”更直接地表示支付宝侧没有查到对应交易,因此应先检查订单创建过程和订单号的使用方式。
  • 如果控制台明确提示支付能力未开通、签约未生效、应用未上线或备案状态受限,就需要按照控制台提示处理,单纯修改代码无法解决。

应用状态和权限配置仍有可能造成影响,但这类问题通常会伴随明确的接口错误码。只看到“订单处理失败”和“交易不存在”时,应优先检查 alipay.trade.create 的完整响应,以及 trade_no 从服务端传到小程序的整个过程。

建议的排查顺序

  1. 打印 alipay.trade.create 返回的 code、sub_code、sub_msg 和 trade_no。
  2. 确认 trade_no 不为空,并且确实来自支付宝响应。
  3. 确认小程序传给 my.tradePay 的 tradeNO 不是自行生成的 out_trade_no。
  4. 使用创建交易时相同的 app_id、商户身份和网关环境查询订单。
  5. 检查 buyer_id 是否属于当前用于测试的支付宝账号。
  6. 在支付宝 App 中使用开发版或体验版测试,不要只依赖开发工具模拟器。
  7. 检查开放平台控制台中的支付产品签约、应用绑定和能力状态。
  8. 根据支付宝返回的 sub_code 和 sub_msg 定位具体的配置问题。

支付完成后,应以服务端异步通知或服务端主动查询的结果为准。小程序端 my.tradePay 的回调只能说明客户端调用结果,不能作为发货、充值或更新最终支付状态的唯一依据。

备注:内容仅供参考。