alipay.trade.create与alipay.trade.precreate有什么区别?
结论
alipay.trade.create 和 alipay.trade.precreate 都能创建支付宝交易,区别在于后续的支付方式:
alipay.trade.create创建一笔由指定买家继续支付的交易,核心返回结果一般是支付宝交易号trade_no。它适用于支付宝小程序、生活号等需要通过支付宝客户端收银台完成支付的场景。alipay.trade.precreate创建一笔扫码支付预订单,核心返回结果一般是二维码内容qr_code。商户将其生成二维码,买家再使用支付宝扫码付款。
可以简单理解为:前者是拿到交易号后调起支付,后者是生成二维码供用户扫码。
核心区别
| 对比项 | alipay.trade.create | alipay.trade.precreate |
|---|---|---|
| 接口名称 | 统一收单交易创建接口 | 统一收单线下交易预创建接口 |
| 创建后的关键返回值 | trade_no | qr_code |
| 用户交互方式 | 通过支付宝客户端能力或收银台继续支付 | 商户展示二维码,用户扫码支付 |
| 典型场景 | 支付宝小程序、生活号等指定买家支付场景 | 门店收银台、桌贴码、POS 动态二维码 |
| 是否直接完成扣款 | 否 | 否 |
| 是否需要后续支付动作 | 是,需要使用交易号调起支付 | 是,需要买家扫描二维码并确认支付 |
| 买家信息 | 通常需要提前明确买家身份,如 buyer_id | 创建二维码时通常不需要提前指定扫码用户 |
| 支付结果确认 | 异步通知,并建议主动查询 | 异步通知,并建议主动查询 |
这两个接口都只负责创建交易。接口调用成功不等于买家已经付款。
alipay.trade.create 的交易流程
常见流程是:
- 用户在支付宝客户端内进入商户页面。
- 商户服务端取得当前用户对应的支付宝买家标识。
- 服务端调用
alipay.trade.create创建交易。 - 支付宝返回
trade_no。 - 前端使用
trade_no调起支付宝支付能力。 - 用户确认付款。
- 商户根据异步通知或
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 的交易流程
常见流程是:
- 商户服务端生成唯一的商户订单号。
- 服务端调用
alipay.trade.precreate。 - 支付宝返回
qr_code。 - 商户将
qr_code转换成二维码图片并展示。 - 买家打开支付宝扫码并确认付款。
- 商户通过异步通知或主动查询确认支付结果。
- 收银页面根据最终状态显示支付成功、失败或订单关闭。
请求结构示例:
{
"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 是商户侧订单号,在商户系统内必须保持唯一。如果发生网络超时或响应丢失,不要立即更换订单号并重复创建,否则可能产生多笔交易。
更稳妥的处理步骤是:
- 使用原
out_trade_no查询交易状态。 - 确认交易不存在后,再决定是否重试。
- 对异步通知做幂等处理,避免重复发货或重复记账。
金额必须由服务端确定
不要直接信任前端提交的 total_amount。服务端应根据商品、优惠和运费等数据重新计算金额,再调用支付宝接口。
金额一般用以元为单位的字符串表示,例如:
{
"total_amount": "88.00"
}
不要使用二进制浮点数直接计算金额。建议改用整数分或高精度十进制类型。
验证异步通知
收到支付宝通知后,至少要完成以下检查:
- 验证通知签名。
- 检查
app_id和收款方信息。 - 检查
out_trade_no是否属于当前商户。 - 检查通知金额与本地订单金额是否一致。
- 检查交易状态是否符合业务要求。
- 对同一订单的重复通知做幂等处理。
前端的”支付成功”回调不能代替服务端验签。
处理二维码超时和关单
扫码支付页面一般需要设置等待时间。长时间未支付时,应停止轮询,并按业务规则调用关单接口:
alipay.trade.close
不要只在页面上隐藏二维码,却不处理对应订单。二维码有效期、订单关闭策略和相关可选参数,应以商户当前签约产品的接口文档为准。
一句话判断
需要支付宝交易号,并由客户端继续调起支付时,使用 alipay.trade.create;需要生成二维码供顾客扫码时,使用 alipay.trade.precreate。两个接口都不代表付款已经完成,最终支付结果必须由商户服务端确认。
备注:内容仅供参考。
