电脑网站支付未扫码时为何查询不到支付订单?
支付小周
结论
电脑网站支付接口调用成功,通常只说明支付页面或跳转表单已生成,不代表支付平台已经创建了可查询的交易记录。
如果用户还没有扫码、登录或确认支付,支付平台可能尚未生成对应交易。此时调用统一收单交易查询接口,可能会返回“交易不存在”,例如 ACQ.TRADE_NOT_EXIST。这通常不是下单参数丢失,也不能说明支付失败。
原因说明
电脑网站支付一般分为两个阶段:
- 商户系统创建业务订单并生成
out_trade_no。 - 用户进入收银台,通过扫码、登录等方式发起实际支付。
调用电脑网站支付接口后,商户拿到的通常是跳转至收银台所需的表单或页面内容。此时商户订单已经存在,但支付平台侧的交易可能还无法查询。
还需要区分两个编号:
out_trade_no:商户订单号,由商户系统生成。trade_no:支付平台交易号,通常在支付平台创建交易后生成。
用户没有扫码时,trade_no 可能还未生成,统一收单交易查询接口也就无法返回完整的支付订单信息。
建议的处理方式
1. 在商户系统中保存订单
调用支付接口前,应先将订单写入商户自己的数据库,至少保存:
out_trade_no- 订单金额
- 创建时间
- 本地订单状态
- 支付渠道
- 支付超时时间
订单的初始状态可以设为“待支付”。不要通过交易查询接口来判断商户订单是否创建成功。
2. 正确处理“交易不存在”
查询接口返回“交易不存在”时,应根据本地订单状态和订单有效期分别处理:
- 订单仍在有效期内:继续显示“待支付”,并允许用户重新进入收银台。
- 用户已经进入支付流程:按照合理的时间间隔再次查询。
- 订单已经超过支付有效期:关闭本地订单或将其标记为超时。
- 不要直接将“交易不存在”更新为“支付失败”。
“交易不存在”表示当前未查询到支付平台交易,与支付明确失败是两种不同的状态。
3. 以异步通知为主要支付结果来源
支付完成后,应优先根据支付平台发送的异步通知更新订单状态。处理通知时,需要校验:
- 签名是否有效
app_id是否匹配out_trade_no是否存在- 支付金额是否与本地订单一致
- 卖家账号或商户身份是否匹配
- 交易状态是否表示支付成功
主动查询适合用于补偿、对账或处理通知延迟,不应作为判断支付结果的唯一方式。
4. 查询时使用正确的订单号
如果尚未取得 trade_no,可以使用商户订单号 out_trade_no 查询。该订单号必须与发起支付时使用的值完全一致,并且查询操作应使用同一商户应用和对应的支付环境。
Java 查询示例
以下示例只展示查询和状态判断的基本结构。SDK 初始化、密钥配置和异常处理需要根据项目实际情况补充。
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", outTradeNo);
request.setBizContent(bizContent.toJSONString());
AlipayTradeQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
String tradeStatus = response.getTradeStatus();
switch (tradeStatus) {
case "TRADE_SUCCESS":
case "TRADE_FINISHED":
// 支付成功,校验金额等信息后更新本地订单
break;
case "WAIT_BUYER_PAY":
// 交易已创建,等待用户付款
break;
case "TRADE_CLOSED":
// 交易已关闭
break;
default:
// 记录未知状态,等待通知或稍后补查
break;
}
} else if ("ACQ.TRADE_NOT_EXIST".equals(response.getSubCode())) {
// 支付平台暂未创建或暂时查询不到该交易
// 本地订单应继续保持待支付,不能直接标记为支付失败
} else {
// 记录 code、sub_code、msg 和 sub_msg,便于排查
}
轮询策略示例
业务需要主动查询时,可以限制查询次数并逐步延长间隔,避免频繁请求:
创建本地订单
↓
生成并展示支付页面
↓
等待异步通知
↓
必要时主动查询
├─ TRADE_SUCCESS / TRADE_FINISHED → 校验后更新为支付成功
├─ WAIT_BUYER_PAY → 保持待支付
├─ ACQ.TRADE_NOT_EXIST → 短暂等待后补查
└─ 超过订单有效期 → 执行关单或标记超时
具体的查询频率、持续时间和关单规则,应以实际支付产品的接口文档和业务要求为准。
注意事项
- 支付接口调用成功不等于支付成功,也不一定表示支付平台已经创建交易。
ACQ.TRADE_NOT_EXIST不能直接映射为“支付失败”。- 不要将同一个
out_trade_no随意用于不同的业务订单。 - 正式环境与沙箱环境的数据不互通,查询时必须确认环境一致。
- 支付状态更新应采用幂等设计,避免异步通知和主动查询同时到达时重复记账。
- 订单超时后需要关闭交易时,应先确认支付状态,避免支付成功和关单操作发生竞态。
- 如果用户已经扫码或付款,经过较长时间仍查询不到交易,应进一步核对
app_id、商户身份、out_trade_no、接口环境,以及查询响应中的code和sub_code。
备注:内容仅供参考。
