PAYATHON 2026

电脑网站支付未扫码时为何查询不到支付订单?

支付小周

结论

电脑网站支付接口调用成功,通常只说明支付页面或跳转表单已生成,不代表支付平台已经创建了可查询的交易记录。

如果用户还没有扫码、登录或确认支付,支付平台可能尚未生成对应交易。此时调用统一收单交易查询接口,可能会返回“交易不存在”,例如 ACQ.TRADE_NOT_EXIST。这通常不是下单参数丢失,也不能说明支付失败。

原因说明

电脑网站支付一般分为两个阶段:

  1. 商户系统创建业务订单并生成 out_trade_no。
  2. 用户进入收银台,通过扫码、登录等方式发起实际支付。

调用电脑网站支付接口后,商户拿到的通常是跳转至收银台所需的表单或页面内容。此时商户订单已经存在,但支付平台侧的交易可能还无法查询。

还需要区分两个编号:

  • 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。

备注:内容仅供参考。