PAYATHON 2026

alipay.trade.create与alipay.trade.precreate有什么区别?

支付小周

结论

alipay.trade.create 和 alipay.trade.precreate 都能创建支付宝交易,区别在于后续的支付方式:

  • alipay.trade.create 创建一笔由指定买家继续支付的交易,核心返回结果一般是支付宝交易号 trade_no。它适用于支付宝小程序、生活号等需要通过支付宝客户端收银台完成支付的场景。
  • alipay.trade.precreate 创建一笔扫码支付预订单,核心返回结果一般是二维码内容 qr_code。商户将其生成二维码,买家再使用支付宝扫码付款。

可以简单理解为:前者是拿到交易号后调起支付,后者是生成二维码供用户扫码。

核心区别

对比项alipay.trade.createalipay.trade.precreate
接口名称统一收单交易创建接口统一收单线下交易预创建接口
创建后的关键返回值trade_noqr_code
用户交互方式通过支付宝客户端能力或收银台继续支付商户展示二维码,用户扫码支付
典型场景支付宝小程序、生活号等指定买家支付场景门店收银台、桌贴码、POS 动态二维码
是否直接完成扣款否否
是否需要后续支付动作是,需要使用交易号调起支付是,需要买家扫描二维码并确认支付
买家信息通常需要提前明确买家身份,如 buyer_id创建二维码时通常不需要提前指定扫码用户
支付结果确认异步通知,并建议主动查询异步通知,并建议主动查询

这两个接口都只负责创建交易。接口调用成功不等于买家已经付款。

alipay.trade.create 的交易流程

常见流程是:

  1. 用户在支付宝客户端内进入商户页面。
  2. 商户服务端取得当前用户对应的支付宝买家标识。
  3. 服务端调用 alipay.trade.create 创建交易。
  4. 支付宝返回 trade_no。
  5. 前端使用 trade_no 调起支付宝支付能力。
  6. 用户确认付款。
  7. 商户根据异步通知或 alipay.trade.query 确认最终交易状态。

下面的参数只用于说明请求结构。实际必填项应以商户签约产品和当前开放平台接口文档为准:

{
  "method": "alipay.trade.create",
  "biz_content": {
    "out_trade_no": "ORDER_202609130001",
    "total_amount": "88.00",
    "subject": "门店商品",
    "buyer_id": "2088xxxxxxxxxxxx"
  }
}

交易创建成功后,响应中一般包含:

{
  "alipay_trade_create_response": {
    "code": "10000",
    "msg": "Success",
    "out_trade_no": "ORDER_202609130001",
    "trade_no": "202609132200xxxxxxxxxxxx"
  }
}

以支付宝小程序支付为例,前端可以使用返回的交易号继续调起支付:

my.tradePay({
  tradeNO: tradeNo,
  success: (result) => {
    // 前端结果只用于页面提示
    // 最终状态应由服务端通过异步通知或查询接口确认
  },
  fail: (error) => {
    console.error(error);
  }
});

my.tradePay 是否可用、具体参数如何填写,取决于支付宝客户端产品和实际运行环境。这段代码不能直接用于普通浏览器。

alipay.trade.precreate 的交易流程

常见流程是:

  1. 商户服务端生成唯一的商户订单号。
  2. 服务端调用 alipay.trade.precreate。
  3. 支付宝返回 qr_code。
  4. 商户将 qr_code 转换成二维码图片并展示。
  5. 买家打开支付宝扫码并确认付款。
  6. 商户通过异步通知或主动查询确认支付结果。
  7. 收银页面根据最终状态显示支付成功、失败或订单关闭。

请求结构示例:

{
  "method": "alipay.trade.precreate",
  "biz_content": {
    "out_trade_no": "ORDER_202609130002",
    "total_amount": "88.00",
    "subject": "门店扫码支付"
  }
}

创建成功后,响应中一般包含二维码内容:

{
  "alipay_trade_precreate_response": {
    "code": "10000",
    "msg": "Success",
    "out_trade_no": "ORDER_202609130002",
    "qr_code": "https://qr.alipay.com/xxxxxxxxxxxxxxxx"
  }
}

服务端应将 qr_code 原样交给二维码组件编码,不要自行修改、截取或拼接:

QRCode.toCanvas(
  document.getElementById("payment-qrcode"),
  response.qr_code,
  function (error) {
    if (error) {
      console.error(error);
    }
  }
);

应该选择哪个接口

如果业务页面运行在支付宝小程序等客户端环境中,已经取得买家身份,并且需要通过交易号调起支付宝支付,一般选择:

alipay.trade.create

如果业务发生在线下收银台,需要生成动态二维码供顾客扫码,一般选择:

alipay.trade.precreate

如果由收银员扫描顾客的支付宝付款码,也就是”商家扫用户”,一般不使用这两个接口,而应使用付款码支付相关接口,例如:

alipay.trade.pay

因此,线下支付需要区分扫码方向:

  • 用户扫商家:通常使用 alipay.trade.precreate。
  • 商家扫用户:通常使用 alipay.trade.pay。

服务端调用注意事项

不要仅凭接口返回判断支付成功

alipay.trade.create 返回 trade_no,只能说明交易创建成功。alipay.trade.precreate 返回 qr_code,也只能说明二维码预订单创建成功。此时用户可能还没有付款。

商户应结合以下查询接口:

alipay.trade.query

以及支付宝异步通知确认最终状态。只有交易状态明确为支付成功后,才能执行发货、核销或记账等业务操作。

保证 out_trade_no 唯一且可幂等处理

out_trade_no 是商户侧订单号,在商户系统内必须保持唯一。如果发生网络超时或响应丢失,不要立即更换订单号并重复创建,否则可能产生多笔交易。

更稳妥的处理步骤是:

  1. 使用原 out_trade_no 查询交易状态。
  2. 确认交易不存在后,再决定是否重试。
  3. 对异步通知做幂等处理,避免重复发货或重复记账。

金额必须由服务端确定

不要直接信任前端提交的 total_amount。服务端应根据商品、优惠和运费等数据重新计算金额,再调用支付宝接口。

金额一般用以元为单位的字符串表示,例如:

{
  "total_amount": "88.00"
}

不要使用二进制浮点数直接计算金额。建议改用整数分或高精度十进制类型。

验证异步通知

收到支付宝通知后,至少要完成以下检查:

  • 验证通知签名。
  • 检查 app_id 和收款方信息。
  • 检查 out_trade_no 是否属于当前商户。
  • 检查通知金额与本地订单金额是否一致。
  • 检查交易状态是否符合业务要求。
  • 对同一订单的重复通知做幂等处理。

前端的”支付成功”回调不能代替服务端验签。

处理二维码超时和关单

扫码支付页面一般需要设置等待时间。长时间未支付时,应停止轮询,并按业务规则调用关单接口:

alipay.trade.close

不要只在页面上隐藏二维码,却不处理对应订单。二维码有效期、订单关闭策略和相关可选参数,应以商户当前签约产品的接口文档为准。

一句话判断

需要支付宝交易号,并由客户端继续调起支付时,使用 alipay.trade.create;需要生成二维码供顾客扫码时,使用 alipay.trade.precreate。两个接口都不代表付款已经完成,最终支付结果必须由商户服务端确认。

备注:内容仅供参考。