PAYATHON 2026

AlipayTradeCreateRequest 未设置过期时间时多久关闭?

支付阿杰

结论

调用 alipay.trade.create 时,如果没有设置 timeout_express 或 time_expire,支付宝通常会按交易的默认规则处理,常见的默认关闭时间是创建后 15 天,并非几分钟。

因此,下单几分钟后提示「订单已关闭」,通常不是因为没有设置过期时间。更常见的原因是商户系统主动关单、相同 out_trade_no 对应的交易已经关闭,或实际请求中带有其他有效期限制。

具体默认值仍要以当前接入产品、接口版本和支付宝开放平台的对应接口文档为准。不同支付产品和渠道的规则可能不同。生产环境不建议依赖默认值,最好明确设置订单有效期。

显式设置订单有效期

相对过期时间可以通过 AlipayTradeCreateModel#setTimeoutExpress 设置。以下示例将订单有效期设为 30 分钟:

AlipayTradeCreateRequest alipayRequest =
        new AlipayTradeCreateRequest();

AlipayTradeCreateModel model =
        new AlipayTradeCreateModel();

model.setOutTradeNo(outTradeNo);
model.setTotalAmount("100.00");
model.setSubject("商品名称");

// 订单创建后 30 分钟未支付则关闭
model.setTimeoutExpress("30m");

alipayRequest.setBizModel(model);

常用单位有:

  • m:分钟,例如 30m
  • h:小时,例如 2h
  • d:天,例如 1d

有效范围和格式应以当前 alipay.trade.create 接口文档为准。不要使用 1.5h 这类小数形式,需要设置 1.5 小时时,可以写成 90m。

部分 SDK 版本还支持设置绝对过期时间:

model.setTimeExpire("2026-09-09 18:30:00");

使用绝对时间时,需要确认服务器时区和时间格式。相对时间与绝对时间最好不要同时设置,避免对参数优先级产生误解。

排查几分钟后关闭的问题

先调用 alipay.trade.query 查询支付宝侧的实际交易状态,重点确认:

  • trade_status 是否为 TRADE_CLOSED
  • 查询到的 out_trade_no 是否属于本次新订单
  • 返回结果中是否有具体的关闭原因或错误信息

再检查商户服务端日志,确认系统是否调用过:

alipay.trade.close

还需要排查以下情况:

  1. 重复使用 out_trade_no

    out_trade_no 是商户订单号,必须保持唯一。已经关闭的订单号不能作为新订单重复使用,否则前端可能仍然获取到旧交易的关闭状态。

  2. 业务系统自行关单

    很多系统会通过定时任务关闭超过 5 分钟、10 分钟或 15 分钟仍未支付的订单。这种情况下,支付宝订单的关闭时间由商户系统控制,与支付宝的默认值无关。

  3. 请求参数被其他代码补充或覆盖

    不要只检查对象初始化处的代码,还要查看最终发送给支付宝的请求内容,确认 timeout_express、time_expire 等字段是否确实为空。

  4. 前端重复使用支付凭证

    如果页面保存了旧的 trade_no,或者重新下单后仍使用上一笔交易号,也可能直接提示订单已关闭。

  5. 接入产品有额外限制

    小程序支付、行业解决方案或特定收银产品可能有自己的订单有效期规则,应以对应产品的开放平台文档为准。

建议

无论默认关闭时间是多少,商户都应根据业务要求明确设置 timeout_express,并让业务订单有效期、支付宝交易有效期和前端倒计时保持一致。例如,业务要求用户在 15 分钟内完成付款,可以直接设置:

model.setTimeoutExpress("15m");

每次重新下单时,还要生成新的 out_trade_no。如果订单在几分钟内异常关闭,应根据 alipay.trade.query 的查询结果和服务端关单日志定位原因,不能只凭支付页面的提示判断。

备注:内容仅供参考。