LikeShop 多商户版分账对接:第三方分账(汇付)接入实战

📅 发布时间:2026/10/11 17:11:21
LikeShop 多商户版分账对接:第三方分账(汇付)接入实战
一、为什么多商户必须接第三方分账多商户平台B2B2C有一个单商户不存在的核心矛盾消费者付款时钱打到了平台账户但其中大部分其实是商家的货款。举个例子消费者在平台上买了 A 商家 100 元的商品平台佣金 5%5 元商家应得 95 元。如果资金流是这样的消费者 100 元 → 平台银行账户 → 平台再打 95 元给商家这就叫二清——平台没有央行颁发的《支付业务许可证》却在归集、清算、分配用户资金。这是监管明确禁止的轻则叫停业务重则涉及刑事风险。合规的做法是接入持牌支付机构的分账产品汇付天下、微信支付服务商分账、支付宝分账让资金在支付那一刻就按预设比例直接路由到平台和商家各自的账户平台不沉淀商家资金。LikeShop 多商户版本身预留了分账接口位置二开的主要工作就是把汇付这套通道接进来。下面按整体架构、商家进件、下单分账、退款回退、结算对账、合规红线拆解。二、整体架构消费者付款 ↓ 汇付托管账户体系虚拟账户不是实体银行账户 ↓ 支付成功的同时按分账规则实时拆分 ├── 平台佣金 → 平台商户号平台在汇付的结算账户 ├── 商家货款 → 商家子商户号每个入驻商家在汇付的独立账户 └── 可选服务商分润 → 服务商账户几个关键概念先讲清楚平台商户号平台自己在汇付开立的主结算账户佣金和平台收入进这里子商户号每个入驻商家在汇付开立的独立账户。这个账户不是平台的是商家自己的平台只是代为进件分账规则按订单维度配置每笔订单支付成功时自动拆分托管账户体系所有资金都在汇付的虚拟账户里流转不经过平台实体银行账户。三、数据库表结构3.1 商家结算档案ls_merchant_settle(id,merchant_id,-- 进件状态huifu_mchnt_no,-- 汇付子商户号settle_status,-- pending / active / rejected / frozen-- 结算配置settle_cycle,-- T1 / T7commission_rate,-- 默认佣金比例可被类目覆盖-- 进件资料加密存储license_no,legal_person,legal_id_card_enc,bank_card_enc,bank_name,create_time,update_time);3.2 订单分账快照ls_order_settle(id,order_id,pay_order_no,-- 汇付支付单号split_json,-- 分账明细快照JSONplatform_amount,-- 平台佣金merchant_amount,-- 商家货款split_status,-- pending / split / partially_returned / returnedrefunded_amount,-- 已退款金额create_time,settle_time);注意split_json这张表的设计分账明细必须落快照。原因是商家的佣金比例以后可能调但历史订单的分账要按下单时的规则算不能跟着改。3.3 商家提现记录ls_merchant_withdraw(id,merchant_id,amount,-- 提现金额status,-- applying / approved / paid / rejectedbank_card_enc,apply_time,audit_time,pay_time,reject_reason);四、第一步商家进件商家入驻 LikeShop 后台时同步完成汇付进件。没有进件的商家不能上架商品、不能收款——这一条要在系统里硬卡。?php// app/service/partner/HuifuMerchantService.phpclassHuifuMerchantService{/** * 商家进件把营业执照、法人、银行卡资料提交给汇付 */publicfunctionapplySubMerchant(Merchant$m):array{$settle$m-settle;$params[merchant_name$m[shop_name],merchant_short_name$m[shop_short_name],legal_person$settle[legal_person],legal_id_noencrypt_data($settle[legal_id_card_enc]),business_license$settle[license_no],bank_account$settle[bank_name],bank_card_noencrypt_data($settle[bank_card_enc]),mobile$m[contact_mobile],email$m[contact_email],];$resultHuifuClient::execute(v2/mchnt/order,$params);if($result[resp_code]0000){$settle-update([huifu_mchnt_no$result[mchnt_no],settle_statuspending,// 汇付审核中]);}return$result;}/** * 汇付异步回调进件审核结果 */publicfunctionhandleApplyNotify(array$notify){$settleMerchantSettle::where(huifu_mchnt_no,$notify[mchnt_no])-find();if($notify[audit_status]ACCEPT){$settle-update([settle_statusactive]);// 通知商家进件成功可以上架商品}else{$settle-update([settle_statusrejected,reject_reason$notify[audit_msg],]);// 通知商家进件失败补资料}}}几个硬要求敏感字段加密存储法人身份证、银行卡号必须加密数据库里不能存明文日志里不能打敏感字段调试日志、错误日志里都不能出现身份证号、银行卡号进件状态要硬卡业务settle_status ! active的商家前台商品不展示、下单接口直接拒绝。五、第二步下单时计算分账明细消费者下单时后端要实时计算这笔订单的分账比例。规则通常是按经营类目设置佣金比例。?php// app/service/SettleRuleService.phpclassSettleRuleService{/** * 计算一笔订单的分账明细 */publicfunctionbuildSplitDetail(Order$order):array{$merchantMerchant::find($order[merchant_id]);$category$merchant-category;// 类目佣金比例优先商家默认比例兜底$commissionRate$category?$category-commission_rate:$merchant-settle-commission_rate;$total$order[pay_price];$commissionround($total*$commissionRate,2);$merchantAmountround($total-$commission,2);$detail[[account$merchant-settle-huifu_mchnt_no,amount$merchantAmount,// 商家货款name商家货款,],[accountconfig(huifu.platform_mchnt_no),amount$commission,// 平台佣金name平台佣金,],];// 落快照OrderSettle::create([order_id$order[id],split_jsonjson_encode($detail,JSON_UNESCAPED_UNICODE),platform_amount$commission,merchant_amount$merchantAmount,split_statuspending,]);return$detail;}}六、第三步支付时绑定分账规则调汇付支付接口时把分账明细一起传进去。支付成功的同时汇付自动完成分账。?php// app/service/PayService.phppublicfunctioncreatePay(Order$order):array{$splitDetailapp(SettleRuleService::class)-buildSplitDetail($order);$params[order_sn$order[order_sn],amount$order[pay_price],subject$order[goods_name],// 关键分账明细split_infojson_encode($splitDetail),];returnHuifuClient::execute(v2/pay/jsapi,$params);}支付成功后汇付异步通知我们的后端。这时候要做两件事?phppublicfunctionhandlePayNotify(array$notify){$orderOrder::where(order_sn,$notify[order_sn])-find();if(!$order)returnfail;// 1. 更新订单状态$order-update([pay_status1,pay_timetime(),]);// 2. 更新分账记录$settleOrderSettle::where(order_id,$order[id])-find();$settle-update([pay_order_no$notify[pay_order_no],split_statussplit,settle_timetime(),]);returnsuccess;}七、第四步退款与分账回退最容易踩坑退款是分账对接里最容易出 bug 的地方。普通支付退款只需要调一个退款接口。但分账订单不一样钱已经分给商家了退款时要先把商家那部分钱回退到托管账户再从托管账户退给消费者。?php// app/service/RefundService.phppublicfunctionrefund(Order$order,float$amount,string$reason){$settleOrderSettle::where(order_id,$order[id])-find();// 1. 分账回退把已分给商家的钱退回到托管账户if($settle[split_status]split$amount0){// 按比例回退商家那部分$merchantRatio$settle[merchant_amount]/$order[pay_price];$returnToMerchantround($amount*$merchantRatio,2);HuifuClient::execute(v2/split/return,[org_pay_order_no$settle[pay_order_no],return_amount$returnToMerchant,reason$reason,]);}// 2. 从托管账户退款给消费者HuifuClient::execute(v2/pay/refund,[org_pay_order_no$settle[pay_order_no],refund_amount$amount,reason$reason,]);// 3. 更新记录$order-update([refund_status1,refund_amount$settle[refunded_amount]$amount,refund_timetime(),]);$settle-increment(refunded_amount,$amount);// 4. 全退完后标记if($settle[refunded_amount]$order[pay_price]){$settle-update([split_statusreturned]);}}这一段最容易出的问题只退给了消费者没有从商家那里回退。结果就是——平台自己掏钱退了款商家账上还多了一笔已经分到的钱。这种问题不发生则已一发生就是财务窟窿。八、第五步结算与提现TN 结算汇付按配置的结算周期通常 T1把商家货款从托管账户打到商家绑定的银行卡平台佣金进平台在汇付的账户平台自行提现商家主动提现LikeShop 后台商家可以看到自己的可提现金额发起提现申请平台财务审核后打款。?php// 商家发起提现publicfunctionapplyWithdraw(int$merchantId,float$amount){$merchantMerchant::find($merchantId);$available$merchant-settle-available_balance;if($amount$available){thrownewException(可提现余额不足);}MerchantWithdraw::create([merchant_id$merchantId,amount$amount,statusapplying,apply_timetime(),]);// 冻结这部分金额避免重复提现$merchant-settle-decrement(available_balance,$amount);}九、对账分账系统必须每天对账。没有对账分账 bug 可能几个月都发现不了。?php// 每天凌晨跑publicfunctiondailyReconcile(){// 1. 下载汇付前一天的对账文件$filesHuifuClient::execute(v2/settle/download,[datedate(Ymd,strtotime(-1 day)),]);// 2. 逐笔比对本地订单foreach($filesas$row){$orderOrder::where(order_sn,$row[order_sn])-find();if(!$order){// 本地无此订单 → 报警AlertService::send(本地缺失订单:.$row[order_sn]);continue;}if($order[pay_price]!$row[amount]){// 金额对不上 → 报警AlertService::send(金额差异:.$order[order_sn]);}}// 3. 本地有但汇付没有的订单 → 同样报警}十、合规红线这一节必须重点讲平台不能自建资金池所有商家货款必须在汇付托管账户体系内完成不能先到平台实体银行账户再打款给商家商家进件必须真实营业执照、法人、银行卡三要素要一致汇付会做四要素鉴权分账比例在用户支付前可见不能事后改改了也要按快照执行退款必须走分账回退不能只从平台账户退款敏感数据加密法人身份证、银行卡号不能明文存库、不能进日志商家提现审核大额提现要人工审核避免被异常账户洗钱。十一、常见坑沙箱先行汇付有专门的沙箱环境不要拿真实商户号调分账比例上限持牌通道对分账总比例有上限通常不超过订单金额的 30%~50%平台佣金不要设得过高提现手续费汇付提现按笔收费平台要算进成本对账文件每天下载对账文件和本地订单自动比对差异自动报警进件审核时效汇付进件不是即时通过通常 1~3 个工作日商家上线节奏要提前规划多渠道支付如果平台同时接了微信、支付宝、汇付三个通道分账逻辑要在每一个通道里都实现不能只接汇付。结语LikeShop 多商户版的分账对接技术本身不复杂真正难的是把资金链路想清楚钱从消费者出来那一刻起每一笔钱在哪个账户、谁能动、动多少、退款时怎么回退都要画得清清楚楚。接汇付的价值不是多了一个支付通道而是让平台从二清的违法状态变成持牌机构托管的合规状态。这件事做完平台才敢规模化招商、才敢接真实商家、才敢对外说自己是合规的 B2B2C 平台。