B2B2C多店铺支付宝小程序收款如何结算?
明确结论
用户选择支付宝余额还是花呗分期,只会影响付款方式,不会自动改变收款主体。
通常,交易款会进入该笔支付请求所对应的支付宝商家账户。支付宝不会根据订单中的店铺编号,自动把款项结算到平台内商家的支付宝账户。即使多个店铺都接入了同一个支付宝小程序,也不能据此实现按店铺自动分账或分别收款。
多店铺 B2B2C 平台通常采用以下两种模式:
- 平台统一收款:所有订单先由平台商户号收款,再通过支付宝提供的合规分账能力或其他合规结算流程向商家结算。
- 商家分别收款:每个商家完成支付宝商家签约和授权,平台创建交易时指定实际收款商家。
平台能使用哪些产品和接口、具备哪些资金权限,取决于平台主体、商家类型、经营类目以及支付宝开放平台的实际签约结果。
为什么不会自动结算给店铺
支付宝处理交易时,识别的是支付接口中的应用身份、商家身份、授权关系和签约产品,并不认识业务数据库里的 shop_id。
例如,平台保存了以下订单数据:
{
"order_no": "P202609080001",
"shop_id": "SHOP_1001",
"amount": "299.00"
}
如果后端始终使用平台自己的应用凭证和商家身份调用支付接口,那么 shop_id 只是平台内部字段。支付宝不会因此把资金转入 SHOP_1001 对应商家的账户。
花呗分期也是一种支付产品或付款渠道。手续费由谁承担、可以选择多少期,可能会受到签约配置影响,但交易请求和商户签约关系仍然决定了收款主体。
方案一:平台统一收款后分账
这种模式适合由平台提供统一交易入口,并且已经取得相应的平台型支付、分账或结算能力的场景。
基本流程如下:
- 平台完成支付宝小程序和支付产品签约。
- 商家按支付宝要求完成入驻、实名验证和分账接收方配置。
- 用户下单后,平台以自身商户身份创建支付交易。
- 用户在小程序中完成付款。
- 平台通过异步通知或主动查询确认交易成功。
- 平台根据订单中的商家、佣金和退款预留等信息计算分账金额。
- 平台调用已经签约的支付宝分账能力,把资金分配给相应商家。
- 平台保存支付、分账、退款和对账记录。
假设订单实付 100 元,平台服务费为 8 元,商家结算金额可以这样计算:
商家结算金额 = 订单实付金额 - 平台服务费 - 其他约定费用
= 100.00 - 8.00
= 92.00
业务系统可以先生成分账明细:
{
"order_no": "P202609080001",
"trade_no": "支付宝交易号",
"total_amount": "100.00",
"receivers": [
{
"merchant_id": "MERCHANT_1001",
"amount": "92.00"
}
],
"platform_amount": "8.00"
}
这只是平台内部的数据结构,并非支付宝接口的固定请求格式。实际使用的分账 API、接收方标识和参数,必须以平台已开通产品对应的支付宝开放平台文档为准。
还要注意,平台不能仅凭技术手段代商家收款,再自行转账。统一收款是否涉及二清、资金存管或其他合规要求,需要结合业务合同、平台资质和支付宝签约方案确认。
方案二:每个商家分别收款
如果希望订单款直接进入对应商家的支付宝账户,就需要让该商家成为实际收款主体。
典型流程如下:
- 每个商家准备符合要求的支付宝商家账户。
- 商家签约平台所需的支付产品。
- 平台以服务商身份接入支付宝开放平台。
- 商家向平台应用授权,平台安全保存授权关系和商家标识。
- 用户下单后,后端根据
shop_id查找对应商家的授权信息。 - 后端以该商家的身份创建支付交易。
- 小程序调用支付能力完成付款。
- 支付成功后,资金按签约规则进入该商家的支付宝账户。
- 平台通过服务费、佣金分账或其他已经签约的方式获得收益。
后端不能直接接受前端传入的收款账号,并以此创建交易。收款主体必须通过可信的店铺配置确定:
async function createPayment(order, currentUser) {
const shop = await shopRepository.findById(order.shopId);
if (!shop || shop.status !== "ACTIVE") {
throw new Error("店铺不可用");
}
if (!shop.alipayAuthorizationId) {
throw new Error("店铺尚未完成支付宝签约或授权");
}
assertOrderOwner(order, currentUser);
assertAmount(order.totalAmount);
// createAlipayTrade 代表服务端支付封装。
// 商家授权字段和实际接口参数应以签约产品文档为准。
return createAlipayTrade({
merchantAuthorizationId: shop.alipayAuthorizationId,
outTradeNo: order.orderNo,
totalAmount: order.totalAmount,
subject: order.subject
});
}
小程序收到后端返回的支付参数后,再发起支付:
my.tradePay({
tradeNO: paymentTradeNo,
success: (result) => {
// 前端成功回调不能作为最终入账依据,
// 仍需由服务端查询交易状态或处理支付宝异步通知。
console.log(result);
},
fail: (error) => {
console.error(error);
}
});
my.tradePay 所需的字段会因支付创建方式而异,不能根据示例固定使用某个字段。具体字段应以当前接入方案的官方文档为准。
多商家订单如何处理
如果一个购物车中同时包含多个店铺的商品,不宜把整笔订单交给某一个商家收款。通常有两种处理方式。
按店铺拆分支付
平台把总订单拆成多个子订单,每个子订单由对应商家收款:
平台订单 P202609080001
├── 子订单 S202609080001:店铺 A,80.00 元
└── 子订单 S202609080002:店铺 B,120.00 元
这种方式下,资金归属比较清楚,但用户可能需要完成多次支付。实际付款体验取决于支付宝支持的支付组合方式。
平台统一支付后分账
用户只需支付一次。交易成功后,平台再按子订单金额分账:
支付金额:200.00 元
├── 店铺 A:76.00 元
├── 店铺 B:114.00 元
└── 平台服务费:10.00 元
这种方式可以统一支付体验,但平台必须开通相应的分账产品,还要处理退款、部分退款、分账撤销和对账。
推荐的系统配置
系统中不应只保存商家的支付宝登录账号。建议为每个店铺维护独立的支付配置:
{
"shop_id": "SHOP_1001",
"settlement_mode": "DIRECT_OR_SPLIT",
"alipay_merchant_id": "签约后获得的商家标识",
"authorization_status": "AUTHORIZED",
"authorization_reference": "加密保存的授权引用",
"payment_status": "ENABLED",
"settlement_status": "ENABLED"
}
敏感授权凭证需要加密保存,不能返回给小程序前端,也不能写入普通业务日志。
订单至少应记录以下信息:
- 平台订单号和店铺子订单号;
- 实际收款主体;
- 支付宝交易号;
- 实付金额和支付状态;
- 分账状态以及各接收方金额;
- 退款金额、退款状态和分账退回状态;
- 异步通知原文摘要和验签结果。
支付回调与对账
支付结果必须以服务端验签后的异步通知或支付宝交易查询结果为准。处理通知时,需要校验以下内容:
- 签名是否合法;
app_id是否属于本平台;- 商家或授权上下文是否与订单一致;
- 商户订单号是否存在;
- 订单金额和币种是否一致;
- 通知是否重复;
- 当前订单状态是否允许更新。
回调处理还必须具备幂等性:
async function handleAlipayNotification(notification) {
verifyAlipaySignature(notification);
const order = await orderRepository.findByOrderNo(
notification.out_trade_no
);
if (!order) {
throw new Error("订单不存在");
}
verifyAppId(notification, order);
verifyAmount(notification, order);
if (order.paymentStatus === "PAID") {
return "success";
}
await database.transaction(async (tx) => {
await tx.orders.markPaid(order.id, notification.trade_no);
await tx.paymentLogs.save(notification);
await tx.settlementTasks.createForOrder(order.id);
});
return "success";
}
这段示例只说明处理原则。通知字段和验签方法应采用支付宝官方 SDK,并以当前支付产品文档中的定义为准。
退款和分账注意事项
多店铺场景除了正向支付,还要同时设计逆向流程:
- 未分账订单发生退款时,通常先办理退款,再取消后续分账任务。
- 已分账订单发生退款时,可能需要先执行分账退回,再办理退款。
- 部分退款应根据商品所属店铺和原分账比例计算。
- 商家余额不足、授权失效或分账退回失败时,需要转入人工处理队列。
- 支付手续费和花呗分期手续费由谁承担,需要在签约配置和商家协议中明确。
- 交易金额必须由服务端根据商品、优惠和运费重新计算,不能信任前端传入的金额。
最终选择哪种方案,并不只取决于支付宝小程序绑定了哪个账号。支付请求使用的商家身份以及平台开通的支付宝产品,才会决定资金如何收取和结算。如果商家尚未完成入驻、授权或分账配置,订单款默认不会自动结算给平台内的对应店铺。
备注:内容仅供参考。
