支付宝小程序支付能否使用alipay.trade.merge.precreate接口
支付小周
结论
alipay.trade.merge.precreate 不能直接替代 alipay.trade.create 来完成支付宝小程序内支付。
这两个接口适用的支付场景不同:
alipay.trade.create用于创建支付宝交易。服务端取得trade_no后,小程序可以调用my.tradePay拉起收银台。alipay.trade.merge.precreate用于预创建合并支付,通常返回供用户扫码付款的二维码链接,适合线下扫码合并付款,不能等同于小程序内支付接口。
支付宝小程序内支付仍应使用 alipay.trade.create。如果用户需要一次支付多个订单,可以先在商户系统中把多个业务订单合并成一笔支付单,再调用该接口创建交易。
推荐实现流程
- 小程序将待支付的业务订单提交给商户服务端。
- 服务端校验订单状态、商品金额和当前用户身份。
- 服务端计算合并后的总金额,并生成唯一的支付单号。
- 服务端调用
alipay.trade.create,通过buyer_id指定当前支付宝用户。 - 从接口响应中取得支付宝交易号
trade_no。 - 小程序调用
my.tradePay,将该交易号作为tradeNO传入。 - 服务端通过异步通知或主动查询确认最终支付结果。
- 支付成功后,将该支付单关联的各个业务订单更新为已支付。
服务端创建交易示例
以下代码仅展示主要业务结构。网关地址、应用私钥、支付宝公钥、签名方式和 SDK 版本应根据项目的实际配置确定。
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "PAY_202609090001");
bizContent.put("total_amount", "199.00");
bizContent.put("subject", "多个订单合并支付");
bizContent.put("buyer_id", buyerId);
request.setBizContent(bizContent.toJSONString());
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (!response.isSuccess()) {
throw new RuntimeException(
"支付宝交易创建失败:" + response.getSubCode() + " " + response.getSubMsg()
);
}
String tradeNo = response.getTradeNo();
服务端需要将 tradeNo 返回给小程序。应用私钥和签名逻辑必须留在服务端,不能放进小程序前端。
小程序拉起支付示例
my.tradePay({
tradeNO: tradeNo,
success: (result) => {
console.log('支付调用完成', result);
// 不应仅凭前端结果更新订单状态。
// 应请求服务端查询支付单的最终状态。
queryPaymentStatus();
},
fail: (error) => {
console.error('支付未完成', error);
}
});
多订单合并支付的处理方式
假设用户要同时支付三个业务订单:
ORDER_A:50.00
ORDER_B:69.00
ORDER_C:80.00
合计:199.00
商户系统可以为这三个订单生成一笔支付单:
{
"payment_no": "PAY_202609090001",
"total_amount": "199.00",
"order_ids": [
"ORDER_A",
"ORDER_B",
"ORDER_C"
]
}
然后使用 PAY_202609090001 作为 out_trade_no 调用 alipay.trade.create。支付成功后,商户系统再根据支付单与业务订单的关联关系更新这三个订单。
这种由业务层合单、支付层创建单笔交易的方式符合小程序内支付流程,也便于处理退款、对账和支付状态同步。
注意事项
total_amount必须由服务端根据可信的订单数据计算,不能直接使用前端传入的金额。out_trade_no在商户系统中必须唯一。同一支付单需要重试时,还要做好幂等处理。buyer_id必须是当前小程序用户对应的支付宝用户标识,具体获取方式取决于小程序的授权流程。my.tradePay的成功回调仅表示支付调用已返回,不能单独作为支付成功的依据。最终结果应以支付宝异步通知或服务端主动查询为准。- 处理异步通知时,需要验签,并校验
app_id、out_trade_no、金额、商户身份和交易状态。 - 多个订单合并成一笔支付宝交易后,需要提前制定部分退款、整单退款、关单和对账规则。
- 如果在扫码合并支付场景中使用
alipay.trade.merge.precreate,应按照接口返回的二维码完成付款,不能把其响应直接当作my.tradePay所需的tradeNO。 - 接口字段要求和产品权限可能发生调整。接入时应以支付宝开放平台当前发布的对应接口文档和小程序支付文档为准。
备注:内容仅供参考。
