你打開后臺(tái)看到第4筆用戶投訴:A店下單的商品,B店點(diǎn)了發(fā)貨,款項(xiàng)卻凍結(jié)在平臺(tái)賬戶里無法分賬。這不是個(gè)例——多商戶商城的架構(gòu)問題從來不在首頁(yè),而在錢流、權(quán)責(zé)和并發(fā)邏輯的交叉點(diǎn)上。

多商戶商城(Multi-Vendor Marketplace)指一個(gè)消費(fèi)者前端整合多個(gè)獨(dú)立商戶的商品,統(tǒng)一交易、統(tǒng)一用戶體驗(yàn),但每個(gè)商戶在后臺(tái)只管理自己的商品、庫(kù)存和訂單。它與單商戶B2C商城的核心區(qū)別在于:交易參與方從「平臺(tái)-消費(fèi)者」變成「平臺(tái)-商戶-消費(fèi)者」,多了商戶這一層獨(dú)立利益主體,所有數(shù)據(jù)模型和業(yè)務(wù)流程都必須為此重構(gòu)。

很多團(tuán)隊(duì)把多商戶當(dāng)成單商戶系統(tǒng)加一個(gè)店鋪?zhàn)侄?,上線后立刻撞上三堵墻:分賬不合規(guī)、促銷費(fèi)用無人買單、商戶糾紛讓客服癱瘓。下面從五個(gè)最高頻的燒錢問題切入,說明開發(fā)時(shí)真正需要提前鎖定的設(shè)計(jì)決策。

1. 訂單分賬:先定資金流,再寫代碼

訂單支付完成后,錢怎么從消費(fèi)者流向商戶和平臺(tái),決定了你的商業(yè)模式是否合法且可審計(jì)。這里有兩條完全不同的路徑。

路徑A:平臺(tái)代收代付 消費(fèi)者支付給平臺(tái)收款賬戶,平臺(tái)在結(jié)算周期內(nèi)將貨款結(jié)算給商戶。優(yōu)點(diǎn)是平臺(tái)擁有資金主動(dòng)權(quán),可以處理退款凍結(jié)、先平臺(tái)抽傭再打款。缺點(diǎn)是需要持有《支付業(yè)務(wù)許可證》或通過持牌支付機(jī)構(gòu)做“賬戶分賬”產(chǎn)品,否則構(gòu)成“二清”違規(guī)。

如果你沒有支付牌照,只能在正規(guī)支付機(jī)構(gòu)(如支付寶、微信支付的“分賬”接口)的內(nèi)部分賬體系里完成資金拆分。此時(shí)你需要在開發(fā)中對(duì)接分賬接口,示例請(qǐng)求參數(shù)結(jié)構(gòu)如下:

{
  "out_order_no": "MP202506011405",
  "transaction_id": "4200002471202506018349123456",
  "profit_sharing": [
    {
      "receiver_account": "商戶A在支付機(jī)構(gòu)的分賬接收方賬號(hào)",
      "amount": 88.00,
      "description": "訂單MP01405商品貨款"
    },
    {
      "receiver_account": "平臺(tái)服務(wù)費(fèi)接收方賬號(hào)",
      "amount": 12.00,
      "description": "平臺(tái)傭金"
    }
  ]
}

注意:分賬接收方必須在支付機(jī)構(gòu)后臺(tái)提前添加并通過審核,最高分賬比例通常不超過訂單金額的30%,這意味著你無法將全部貨款分給商戶而平臺(tái)不留存——這是反二清合規(guī)的紅線。

路徑B:商戶自行收款 消費(fèi)者支付時(shí)資金直接進(jìn)入各商戶的收款賬戶,平臺(tái)通過接口查詢支付結(jié)果并扣收服務(wù)費(fèi)。優(yōu)點(diǎn)是沒有二清風(fēng)險(xiǎn),缺點(diǎn)是你對(duì)資金零控制權(quán)。出現(xiàn)退款爭(zhēng)議時(shí),平臺(tái)只能“請(qǐng)求”商戶退款,無法強(qiáng)制執(zhí)行。這種模式更適合商戶已是成熟主體、平臺(tái)僅做信息撮合的場(chǎng)景。

決策點(diǎn):如果你計(jì)劃做交易抽傭、需要處理跨店優(yōu)惠的分?jǐn)?,必須走路徑A。開發(fā)排期時(shí),不要只評(píng)估接口聯(lián)調(diào)時(shí)間,要先完成支付機(jī)構(gòu)的合規(guī)審核入網(wǎng),這個(gè)流程通常需要2-4周。

2. 店鋪隔離:數(shù)據(jù)不能只靠where shop_id = ?

多商戶系統(tǒng)最危險(xiǎn)的錯(cuò)覺是“加個(gè)shop_id字段過濾就行”。事故往往出現(xiàn)在以下三個(gè)地方:

第一,API接口的越權(quán)風(fēng)險(xiǎn)。假如商品詳情接口只校驗(yàn)了登錄態(tài),沒有校驗(yàn)商品歸屬的店鋪是否屬于當(dāng)前登錄的商戶賬號(hào),商戶B可以遍歷商品ID讀取商戶A的成本價(jià)。解決方案不是修補(bǔ)接口,而是在數(shù)據(jù)訪問層統(tǒng)一注入店鋪上下文。一個(gè)更安全的做法是:從認(rèn)證令牌(JWT)中解析出merchant_id,在所有商戶端API的數(shù)據(jù)庫(kù)查詢條件中強(qiáng)制拼接WHERE merchant_id = :current_merchant,并且不依賴前端傳入的shop_id參數(shù)。

第二,庫(kù)存扣減的事務(wù)隔離。單一商品的庫(kù)存扣減可以通過行鎖解決,但多商戶場(chǎng)景下,如果購(gòu)物車中同時(shí)有商戶A和商戶B的商品,下單時(shí)需要在一個(gè)事務(wù)中對(duì)多個(gè)店鋪的庫(kù)存執(zhí)行扣減。如果商戶B的庫(kù)存扣減失敗,事務(wù)整體回滾,商戶A已鎖定的庫(kù)存必須釋放。你必須選擇支持分布式事務(wù)的數(shù)據(jù)庫(kù)方案,或采用TCC(Try-Confirm-Cancel)模式,讓每個(gè)商戶的庫(kù)存服務(wù)作為獨(dú)立的資源參與者。

第三,物流發(fā)貨的店鋪混淆。當(dāng)用戶一個(gè)訂單包含3個(gè)店鋪的商品,系統(tǒng)必須自動(dòng)拆單,生成3個(gè)獨(dú)立的包裹單,每個(gè)包裹單僅關(guān)聯(lián)對(duì)應(yīng)商戶的發(fā)貨流程。如果做不到自動(dòng)拆單,由人工手動(dòng)分單,店鋪量超過50就會(huì)崩潰。

3. 流量分配與促銷沖突:誰(shuí)買單必須提前定義

首頁(yè)商品的排序邏輯是多商戶平臺(tái)抱怨最多的環(huán)節(jié)。如果你承諾商戶“按銷售額排序”,新商戶永遠(yuǎn)沒有曝光。如果你使用“按最近上架排序”,會(huì)導(dǎo)致刷屏行為。你需要在系統(tǒng)設(shè)計(jì)時(shí)就定義可替換的排序策略,并讓商戶看到規(guī)則透明。常見做法是引入加權(quán)綜合分:score = a*銷量因子 + b*評(píng)分因子 + c*新品加權(quán) + d*付費(fèi)推廣加權(quán),其中a,b,c,d構(gòu)成可配置參數(shù)集,允許運(yùn)營(yíng)在不改代碼的情況下調(diào)整。

促銷帶來的問題更隱蔽。假如平臺(tái)發(fā)起“全場(chǎng)滿200減30”活動(dòng),消費(fèi)者在一個(gè)訂單中購(gòu)買了商戶A150元和商戶B60元的商品,總金額210元滿足條件,優(yōu)惠30元。這30元由誰(shuí)承擔(dān)?如果你沒有提前定義分?jǐn)傄?guī)則,賬務(wù)對(duì)不上就會(huì)導(dǎo)致商戶拒絕發(fā)貨。系統(tǒng)必須在促銷創(chuàng)建時(shí)強(qiáng)制綁定分?jǐn)偛呗浴瓷唐方痤~比例分?jǐn)偸亲畹鸵螅缟虘鬉分?jǐn)?1.43元,商戶B分?jǐn)?.57元。并在分賬時(shí)將優(yōu)惠金額分別從各自貨款中扣除。

4. 履約責(zé)任與售后判斷:系統(tǒng)必須能找出“誰(shuí)干的”

消費(fèi)者收到破損商品時(shí),他不在乎是哪個(gè)商戶發(fā)的貨,他只會(huì)說“你們平臺(tái)”。你的客服系統(tǒng)必須在訂單詳情頁(yè)清晰展示:該商品由哪個(gè)商戶提供、發(fā)貨倉(cāng)庫(kù)、物流節(jié)點(diǎn)、以及該商戶的售后規(guī)則。更重要的是,退款審批流必須支持商戶先審核的平臺(tái)代管機(jī)制:消費(fèi)者發(fā)起退款申請(qǐng)→商戶在24小時(shí)內(nèi)可駁回/同意→超時(shí)未處理則系統(tǒng)自動(dòng)通過,資金從商戶賬戶劃扣。這個(gè)超時(shí)自動(dòng)通過機(jī)制不能是口頭流程,必須寫在代碼的狀態(tài)機(jī)里,否則退款糾紛會(huì)被無限期掛起。

當(dāng)商戶因違規(guī)被處罰凍結(jié)資金時(shí),你需要一個(gè)獨(dú)立于商戶賬號(hào)的風(fēng)控凍結(jié)體系。凍結(jié)操作應(yīng)記錄完整的操作時(shí)間、操作人、凍結(jié)金額范圍和解凍條件,并生成不可篡改的操作日志。如果商戶提起訴訟,這些日志是你唯一的自證依據(jù)。

5. 行動(dòng)路線:別從用戶端開始開發(fā)

直接從App界面和商品列表下手的項(xiàng)目,80%會(huì)在第一期就遇到上述結(jié)構(gòu)性返工。建議的開發(fā)順序是:

  1. 商戶入駐與資質(zhì)審核模型(含證照上傳、類目經(jīng)營(yíng)權(quán)限映射)——沒有這個(gè),連真實(shí)商戶都進(jìn)不來。
  2. 商品SPU-SKU結(jié)構(gòu)綁定商戶ID,并實(shí)現(xiàn)商戶后臺(tái)商品發(fā)布時(shí)的平臺(tái)審核流程(機(jī)審+人工抽檢)。
  3. 交易-分賬鏈路閉環(huán):下單拆單→支付→分賬請(qǐng)求→分賬結(jié)果回調(diào)→對(duì)賬文件生成,這是財(cái)務(wù)線,上線后極難重構(gòu)。
  4. 售后糾紛狀態(tài)機(jī)與多商戶端通知體系(短信/郵件/站內(nèi)信模板需預(yù)留店鋪名稱變量)。
  5. 最后才做首頁(yè)展示、搜索、推薦等前臺(tái)模塊。

技術(shù)棧選擇上,如果你的商戶量預(yù)期在三年內(nèi)不超過500家,單體架構(gòu)配合數(shù)據(jù)庫(kù)shop_id隔離可以勝任。一旦商戶量可能突破1000且多個(gè)商戶同時(shí)做直播活動(dòng),你需要從一開始就在訂單服務(wù)和庫(kù)存服務(wù)之間使用異步消息解耦,并保證消息的至少一次投遞與消費(fèi)冪等。

多商戶商城開發(fā)真正的成本不在代碼行數(shù),而在處理“利益沖突時(shí)刻”的邏輯分支數(shù)。你在PRD中寫下的每一行“如果用戶下單時(shí)同時(shí)存在A、B兩種情況”,就是開發(fā)成本翻倍的起點(diǎn)。優(yōu)先把資金流、權(quán)限邊界、促銷分?jǐn)傄?guī)則用明確的狀態(tài)圖畫出來,再讓團(tuán)隊(duì)開始寫代碼。

← 上一篇 企業(yè)官網(wǎng)的產(chǎn)品與案例頁(yè)面,為什么總是講不清楚自己賣的是什么 下一篇 → 你的應(yīng)用真的需要為 iOS 和 Android 各寫一套代碼嗎?