支付宝小程序支付提示订单处理失败和交易不存在
结论
这个问题通常不是“小程序尚未上架”“备案审核中”或“本地开发环境”直接引起的。更常见的原因是支付订单没有成功创建到支付宝交易系统,或者小程序传入了错误的订单号。
商户后台生成的订单号 out_trade_no,不能直接作为支付宝交易号 tradeNO 传给 my.tradePay。正确流程如下:
- 服务端生成唯一的
out_trade_no。 - 服务端调用
alipay.trade.create。 - 从接口响应中取得支付宝交易号
trade_no。 - 小程序把这个值作为
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。
创建交易实际失败
有些代码只打印“订单生成成功”,却没有检查支付宝响应中的以下字段:
codesub_codesub_msgtrade_no
接口能正常返回,不代表业务处理成功。支付宝的完整响应应当记录下来,但日志中不要输出私钥、签名原文或敏感用户信息。
环境或应用身份不一致
常见情况包括:
- 创建订单时使用沙箱网关,查询时却使用正式网关。
- 创建和查询使用了不同的
app_id。 - 小程序所属应用与服务端配置的开放平台应用不一致。
- 服务端签名使用了另一套应用私钥。
- 支付能力没有绑定到当前小程序或商户。
出现这些情况时,当前调用方可能无法找到之前创建的交易。
买家身份参数不正确
调用 alipay.trade.create 时,通常需要传入与当前支付宝用户对应的 buyer_id。这个值应通过小程序授权流程在服务端换取,不能用手机号、会员编号、商户用户 ID 或其他自定义编号代替。
与未上架、备案审核和本地测试的关系
一般情况下,小程序尚未正式上架,不代表无法进行支付联调。开发版或体验版能否支付,主要取决于应用、商户、支付产品、签约权限、账号身份和测试方式是否符合支付宝开放平台的要求。
还需要注意以下几点:
- 当前开发阶段能否使用支付能力,应以支付宝开放平台控制台中该应用的实际状态为准。
- 开发工具的模拟环境不一定能完整执行真实支付流程。支付通常需要在支付宝 App 内通过预览版或体验版测试。
- 备案审核可能影响发布或部分线上能力,但“交易不存在”更直接地表示支付宝侧没有查到对应交易,因此应先检查订单创建过程和订单号的使用方式。
- 如果控制台明确提示支付能力未开通、签约未生效、应用未上线或备案状态受限,就需要按照控制台提示处理,单纯修改代码无法解决。
应用状态和权限配置仍有可能造成影响,但这类问题通常会伴随明确的接口错误码。只看到“订单处理失败”和“交易不存在”时,应优先检查 alipay.trade.create 的完整响应,以及 trade_no 从服务端传到小程序的整个过程。
建议的排查顺序
- 打印
alipay.trade.create返回的code、sub_code、sub_msg和trade_no。 - 确认
trade_no不为空,并且确实来自支付宝响应。 - 确认小程序传给
my.tradePay的tradeNO不是自行生成的out_trade_no。 - 使用创建交易时相同的
app_id、商户身份和网关环境查询订单。 - 检查
buyer_id是否属于当前用于测试的支付宝账号。 - 在支付宝 App 中使用开发版或体验版测试,不要只依赖开发工具模拟器。
- 检查开放平台控制台中的支付产品签约、应用绑定和能力状态。
- 根据支付宝返回的
sub_code和sub_msg定位具体的配置问题。
支付完成后,应以服务端异步通知或服务端主动查询的结果为准。小程序端 my.tradePay 的回调只能说明客户端调用结果,不能作为发货、充值或更新最终支付状态的唯一依据。
备注:内容仅供参考。
