扫码支付--统一收单交易创建接口在什么场景下使用?
支付小周
明确结论
“扫码支付统一收单交易创建接口”通常是指 alipay.trade.create。该接口用于在支付宝侧创建交易并获取支付宝交易号 trade_no。它适用于已经确定付款用户身份,并需要通过 trade_no 唤起收银台或继续支付的场景。
通常的调用时机是:
- 用户确认商品、金额等订单信息。
- 商户系统生成自己的订单号
out_trade_no。 - 商户服务端调用
alipay.trade.create创建支付宝交易。 - 接口返回
trade_no。 - 前端使用
trade_no发起支付。 - 商户通过异步通知或主动查询确认最终支付结果。
alipay.trade.create 只负责创建交易。接口调用成功,并不表示用户已经付款。
适用场景
常见场景包括:
- 用户扫码进入支付宝小程序或商户页面,选购商品并提交订单。
- 扫码后已经完成用户识别,商户可以取得创建交易所需的支付宝用户标识。
- 商户先通过服务端创建交易,再将
trade_no交给前端支付组件。 - 用户扫码进入线下门店点餐、自助售货或停车缴费页面,确认订单后完成支付。
这里的“扫码”可能只是进入业务页面的方式,并不表示创建接口会生成二维码或扫描付款码。
如果商户展示收款二维码,由用户直接扫码付款,通常应评估 alipay.trade.precreate。如果收银员扫描用户付款码并立即扣款,通常应评估 alipay.trade.pay。最终使用哪个接口,仍应以当前接入的产品和支付宝开放平台文档为准。
调用流程
可以按以下顺序处理:
- 服务端校验商品价格、库存和订单状态,不要直接信任前端提交的金额。
- 生成全局唯一且可重复查询的
out_trade_no。 - 使用保存在服务端的商户私钥调用
alipay.trade.create。 - 保存接口返回的
trade_no,再将它返回给前端。 - 前端通过当前运行环境支持的支付能力发起付款。
- 服务端验签并处理支付异步通知。
- 必要时调用交易查询接口核对订单状态。
Java 示例
下面只展示核心调用结构。SDK 版本、用户标识的获取方式和前端唤起方法,需要根据实际接入环境确定。
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setBizContent("""
{
"out_trade_no": "ORDER_202609150001",
"total_amount": "19.90",
"subject": "门店消费",
"buyer_id": "用户的支付宝标识"
}
""");
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
String tradeNo = response.getTradeNo();
// 将 tradeNo 保存到订单,并返回给前端用于后续支付
} else {
String subCode = response.getSubCode();
String subMsg = response.getSubMsg();
// 记录错误信息,并根据业务规则决定是否重试
}
前端取得 trade_no 后,应调用当前支付宝运行环境提供的支付能力。不要在浏览器或小程序前端直接调用开放平台网关,也不要将商户私钥放在客户端。
注意事项
response.isSuccess()只表示创建交易请求已被受理,不能据此将订单标记为“已支付”。- 最终支付结果应以验签通过的异步通知为主,主动查询作为补充。
out_trade_no必须保持唯一。遇到网络超时,不要立即更换订单号并重复创建,应先查询原订单。- 服务端应根据商品和优惠规则重新计算金额。
buyer_id等用户标识的名称和获取方式可能随产品及授权模式变化,不要自行拼接或伪造。- 同一订单需要防止重复支付,并正确处理关闭、退款、超时和支付中等状态。
- 沙箱与正式环境的网关、应用、密钥和账号数据必须相互配套,不能混用。
备注:内容仅供参考。
