PAYATHON 2026

电脑网站支付二维码约2小时后扫码报错是什么原因?

支付老李

结论

这条提示通常说明原支付页面或二维码对应的支付会话已经失效。二维码生成后约 2 小时仍未使用,确实可能已经超时,但不能只根据“系统有点忙”判断具体原因。这是一条通用提示,订单关闭、支付状态异常、风控拦截或临时服务异常都可能触发它。

不要继续使用旧二维码。先查询交易状态,如果订单尚未支付,再重新发起支付,生成新的支付页面或二维码。

常见原因

支付会话或订单超时

电脑网站支付通常通过 alipay.trade.page.pay 创建支付请求。二维码展示后,收银台会话和对应交易并非永久有效。出现以下任一情况,旧二维码都可能无法继续支付:

  • 请求中设置了 timeout_express,订单超过该时间后失效;
  • 商户系统设置了订单有效期;
  • 支付平台的收银台会话已经过期;
  • 页面停留时间过长,二维码携带的临时信息已经失效。

“2 小时”并不是所有电脑网站支付二维码的固定有效期。具体时间要结合请求参数、商户订单配置和支付平台当时返回的交易状态判断。

订单状态已经变化

旧二维码对应的交易可能已经变为以下状态:

  • TRADE_CLOSED:交易已关闭,不能继续付款;
  • TRADE_SUCCESS:已经支付成功,不应再次创建同一笔付款;
  • TRADE_FINISHED:交易已完成;
  • 查询不到交易:支付请求可能没有成功建立,也可能是查询参数不匹配。

临时异常或风控限制

如果订单仍然有效,但新生成的二维码也无法支付,还要检查以下问题:

  • 支付账号或交易触发了安全校验;
  • 金额、商品信息或商户配置存在异常;
  • 网络、网关或支付服务出现短时异常;
  • 同一订单被多次提交,导致状态冲突。

前端提示只能说明用户遇到的现象。具体原因要以交易查询接口的返回信息和服务端日志为准。

处理步骤

1. 查询旧交易状态

使用 alipay.trade.query,通过原 out_trade_no 查询交易,不要看到扫码页面提示后就直接创建新订单。

可按以下原则处理:

  • TRADE_SUCCESS 或 TRADE_FINISHED:按已支付处理;
  • WAIT_BUYER_PAY:根据业务规则关闭旧交易,再创建新的支付请求;
  • TRADE_CLOSED:使用新的 out_trade_no 重新下单;
  • 查询失败或没有交易记录:检查应用、环境、签名和订单号是否一致。

2. 关闭仍未支付的旧交易

如果旧交易仍是 WAIT_BUYER_PAY,但二维码已经无法使用,可以调用 alipay.trade.close 关闭旧交易。确认关闭成功后,再生成新的商户订单号。

旧交易状态尚未确认时,不要直接重复下单,以免发生重复付款,或导致订单状态难以核对。

3. 使用新订单号重新发起支付

重新调用 alipay.trade.page.pay,生成新的支付表单或收银台页面。建议根据业务需要明确设置 timeout_express,并在页面上显示剩余有效时间。

以下是 Java SDK 示意代码。具体的 SDK 类名和可用参数,应以项目实际使用的支付宝开放平台 SDK 版本为准:

AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();

request.setReturnUrl("https://www.example.com/pay/return");
request.setNotifyUrl("https://www.example.com/pay/notify");

String bizContent = """
{
  "out_trade_no": "ORDER_20260913_0002",
  "total_amount": "99.00",
  "subject": "订单支付",
  "product_code": "FAST_INSTANT_TRADE_PAY",
  "timeout_express": "30m"
}
""";

request.setBizContent(bizContent);

AlipayTradePagePayResponse response = alipayClient.pageExecute(request);

if (response.isSuccess()) {
    String paymentForm = response.getBody();
    // 将 paymentForm 返回给浏览器并提交,进入支付宝收银台
} else {
    // 记录 code、subCode、msg、subMsg,避免只保留前端提示
    System.err.println(response.getCode());
    System.err.println(response.getSubCode());
    System.err.println(response.getMsg());
    System.err.println(response.getSubMsg());
}

查询交易状态的示意代码:

AlipayTradeQueryRequest queryRequest = new AlipayTradeQueryRequest();

queryRequest.setBizContent("""
{
  "out_trade_no": "ORDER_20260913_0001"
}
""");

AlipayTradeQueryResponse queryResponse = alipayClient.execute(queryRequest);

if (queryResponse.isSuccess()) {
    String tradeStatus = queryResponse.getTradeStatus();

    switch (tradeStatus) {
        case "TRADE_SUCCESS":
        case "TRADE_FINISHED":
            // 按已支付处理
            break;
        case "WAIT_BUYER_PAY":
            // 根据业务规则等待、关闭或重新发起支付
            break;
        case "TRADE_CLOSED":
            // 使用新的 out_trade_no 创建支付请求
            break;
        default:
            // 记录未知状态并进一步核查
            break;
    }
} else {
    System.err.println(queryResponse.getCode());
    System.err.println(queryResponse.getSubCode());
    System.err.println(queryResponse.getMsg());
    System.err.println(queryResponse.getSubMsg());
}

建议的页面处理方式

支付页面应设置倒计时。达到商户设定的有效期后,页面应主动隐藏旧二维码,并提供“刷新二维码”或“重新支付”按钮,避免用户继续扫描已经展示数小时的二维码。

用户重新支付时,服务端应按以下流程处理:

  1. 查询原交易状态;
  2. 如果已经支付,直接展示成功结果;
  3. 如果尚未支付且可以关闭,先关闭原交易;
  4. 生成新的 out_trade_no;
  5. 调用 alipay.trade.page.pay,返回新的支付页面。

注意事项

  • out_trade_no 必须在商户侧保持唯一。重新创建交易时,不要无条件复用旧订单号。
  • 支付结果应以服务端异步通知和主动查询为准,不能把浏览器跳转结果或扫码页面提示作为最终依据。
  • 异步通知需要验签,同时校验 app_id、out_trade_no、total_amount、seller_id 等重要字段。
  • 服务端日志应保存接口返回的 code、sub_code、msg、sub_msg 和交易状态,以便区分超时、风控和系统异常。
  • 如果新订单和新二维码仍能稳定复现相同错误,应携带接口返回码、订单号和发生时间联系支付平台技术支持,进一步排查原因,不要只根据通用提示作出判断。

备注:内容仅供参考。