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:分钟,例如30mh:小时,例如2hd:天,例如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
还需要排查以下情况:
-
重复使用
out_trade_noout_trade_no是商户订单号,必须保持唯一。已经关闭的订单号不能作为新订单重复使用,否则前端可能仍然获取到旧交易的关闭状态。 -
业务系统自行关单
很多系统会通过定时任务关闭超过 5 分钟、10 分钟或 15 分钟仍未支付的订单。这种情况下,支付宝订单的关闭时间由商户系统控制,与支付宝的默认值无关。
-
请求参数被其他代码补充或覆盖
不要只检查对象初始化处的代码,还要查看最终发送给支付宝的请求内容,确认
timeout_express、time_expire等字段是否确实为空。 -
前端重复使用支付凭证
如果页面保存了旧的
trade_no,或者重新下单后仍使用上一笔交易号,也可能直接提示订单已关闭。 -
接入产品有额外限制
小程序支付、行业解决方案或特定收银产品可能有自己的订单有效期规则,应以对应产品的开放平台文档为准。
建议
无论默认关闭时间是多少,商户都应根据业务要求明确设置 timeout_express,并让业务订单有效期、支付宝交易有效期和前端倒计时保持一致。例如,业务要求用户在 15 分钟内完成付款,可以直接设置:
model.setTimeoutExpress("15m");
每次重新下单时,还要生成新的 out_trade_no。如果订单在几分钟内异常关闭,应根据 alipay.trade.query 的查询结果和服务端关单日志定位原因,不能只凭支付页面的提示判断。
备注:内容仅供参考。
