1. 程式人生 > >購物車與商城訂單的關係以及技術實現深入分析

購物車與商城訂單的關係以及技術實現深入分析

本站所有文章均為原創,歡迎轉載,來源:技術小樹懶(www.drw1314.com),作者:錦煥同學

接觸商城開發已經有一段時間了,我們從B2C拼團專案做到了C2C視訊電商系統。雖然專案都還不算成功,但還是積累了些業務經驗,希望可以對大家有用。其實商城最主要的還是訂單相關邏輯,例如購物車,下單,改價等。當然,電商還有一些比較麻煩的一些業務,例如sku,運費的合理計算,這不屬於我們討論的範圍,今天我們主要分析購物車,商城,以及訂單這三者的關係,以及相關資料庫設計與虛擬碼實現。

- 透過現象看本質

首先我們從商城入手,來看看各家的購物車與訂單的介面。

1、七樂康(比較傳統的B2C醫藥電商網站)

             (1)購物車

             (2)生成訂單

2、微店(微商的開店好幫手,C2C商城)

           (1)購物車

          (2)生成訂單

3、有贊(移動零售服務商,C2C商城)

        (1)購物車

        (2)生成訂單

- 購物車與商城以及訂單的關係

從一般的商城來看,可以分為B2C與C2C,也就是單商城系統和多商城系統。單商城的系統,基本上就是全部商品生成一個訂單,而多商城系統裡面的購物車則是可以根據店鋪來分別支付生成訂單(如微店)或者全部統一支付然後根據店鋪拆分訂單(如有贊,淘寶等)。

      總結如下:

      如上圖所示:

     (1)根據每個店鋪生成訂單去支付,很好理解,例如我在店鋪A,買了1,2,3這幾個商品,我只需要生成一個訂單號,然後去支付就可以了,後續的退款等各種處理,只需要根據該訂單號進行處理即可。

     (2) 那麼,最後一個,購物車裡面有多個店鋪的商品,又需要一起支付的時候怎麼辦呢?假定我們使用微信支付,微信支付每次下單隻能使用唯一一個單號,那麼我們只能把不同的店鋪,例如店鋪A和店鋪B的所有商品,都統一放到一個訂單號去微信下單支付。但是,這樣子又違反了訂單規則:不同的店鋪存在著不同的訂單業務,店鋪和訂單是一對多的關係,而且每個訂單號必須是唯一的。怎麼辦?這個時候,我們可以把內部訂單號和微信下單號做一個對映(也就是圖所說的拆單),後續做各種處理例如退款等,就可以通過對映關係去進行處理,如下圖:

      總結一下他們之間的關係:

      (1)購物車可以存在多個店鋪多個商品,可以一次性給錢購買購物車所有商品

      (2)一個訂單隻能對應一個店鋪,一個店鋪可以擁有多個訂單

      (3)微信下單號只有一個,一個微信下單號可以對應多個內部訂單號,一個內部訂單號只能對應一個微信下單號。

- C2C商城購物車資料庫設計與技術實現

 由於B2C商城和C2C大同小異,這裡暫且不討論B2C的設計和實現,相信會C2C實現而不會B2C的同學是不存在的。且縱觀目前的商城,大部分慢慢傾向於增加商家入住功能,所以建議預留多商鋪功能,即先把商鋪表加進去,與商品相關的帶上商鋪id,只不過目前商鋪只有一個就是自己,就這樣可以減少業務需求改動帶來的大量資料庫結構和程式碼的改動。

如果使用者購物車內的商品都是一個店鋪的,那麼就不存在拆單、對映表這種說法,直接生成唯一訂單號作為微信訂單號支付就可以,但是誰都不知道需求是如何變化的,既然淘寶都是可以統一支付不同店鋪的商品,那麼設計的時候最好是支援購物車所有商品統一支付的,這樣子就通殺了,不管你是B2C的購物車,還是微店的購物車,還是淘寶的購物車,都能滿足需求。如果只能支援不同店鋪做分別支付,類似微店這樣,那麼萬一產品要改成支付寶這樣子,就又得重新設計對映表,進行拆單了。本人所在公司的產品經理剛開始比較傾向於微店這種產品設計,而我設計系統時,也僅僅往產品的需求思考,而沒考慮到淘寶的設計,現在換一個產品又要改為淘寶這種購物車,就感覺深深地掉進了坑裡面。這裡學到了一個道理,那就是永遠不要相信產品經理(哭),當然也不要過度設計,這裡其實不是過度設計,只是用多一點時間,就能減少以後的巨大時間,而且產品人員也很喜歡參考大公司的產品功能,畢竟一些基礎功能都是經過大量的使用者反饋的。

那麼我們就以有贊這種做法來設計我們的購物車和訂單吧。

      1、訂單表

     2、購物車表

      最主要的是:商鋪訂單號in_trade_no和第三方支付下單號out_trade_no

- 下單核心實現(非完整程式碼)

一》購物車提交過來的下單最終是以不同店鋪組成的陣列
  如:             

 $data = arrray(
           '店鋪A' => array('商品1''商品2'),
           '店鋪B' => array('商品1''商品2'),
);
二》只有一個數組時,讓商鋪訂單號in_trade_no和第三方支付下單號out_trade_no一致,這樣子的好處是,我們可以認為訂單號和下單號一致時就是在一個店鋪支付的,而不是多個,這樣就可以複用微信下單介面返回的數據,從而對該待付款訂單進行付款,而不是再調下單介面生成新的訂單號去支付(既可以減少介面呼叫,也可以減少費單)
        如:            
1234 =1234 

$unified_order = WeixinPay::unifiedOrder(
         $this->conf['weixin']['pay_key'],
         $this->openid,1234,$order['pay']*100,$this->appid,
         $this->conf['weixin']['mch_id'],
         $this->conf['weixin']['pay_notify_url'],
         WeixinPay::getNonceStr(),$order['title']
);

$data = array(                              
    'appId' => $this->appid,
    'nonceStr' => $unified_order['nonce_str'],
    'package' => "prepay_id={$unified_order['prepay_id']}",
    'signType' => 'MD5',
     'timeStamp' => strval($_SERVER['time']),
);
$data['paySign'] = WeixinPay::MakeSign($data, $this->conf['weixin']['pay_key']);

$this->vshop_orderWeixinPrepay->setPrePay(1234,$data);
$this->err_msg['ok']['data'] = $data;
$this->_showJsonMsg('ok');
使用者支付待付款訂單時直接把之前存著的下單資料拿出來:
if(商鋪訂單號==第三方支付下單號){           //在一個店鋪內購買東西
         去微信檢查1234這個下單號是否已經支付過了,支付過了則退出,而且如果訂單不是未付款狀態,例如網路超時等直接報錯退出
          通過執行下面程式碼
          $data = $this->vshop_orderWeixinPrepay->getPrePay(1234);
       	  $this->err_msg['ok']['data'] = $data;
           $this->_showJsonMsg('ok');

}else{          //不一致為什麼這麼做?請看《三》
    
    重新生成商鋪訂單號和第三方支付下單號,讓其一致
    呼叫微信下單介面,根據該訂單金額等,重新下單

}
《三》多個數組時,每個店鋪訂單對應相同的第三方支付下單號,但是商鋪訂單號不能與下單號出現一致的情況,否則就會導致超額付款問題。

    如
      

       1234 => 1111
       4567 => 1111
       8910 => 1111

       而不能是
       1234 => 4567
       4567 => 4567
       8910 => 4567
為什麼商鋪訂單號不能與下單號出現一致的情況,否則就會導致超額付款?
場景是使用者把幾個店鋪的商品提交過來,假如3個店鋪,我們內部會生成3個內部訂單號和一個微信下單號,如果成功支付問題很好解決,假如沒有成功支付,前端就會像有贊那樣出現3個待付款的訂單。
假如這麼巧,使用者就對        4567 => 4567  這個單進行付款操作,按照上面《二》的邏輯,就會進到getPrePay獲取到微信下單號4567的下單資料,記住,微信下單號4567的金額是內部訂單號1234,4567, 8910三者金額的和,使用者本來想支付第二個內部訂單4567的錢,最後卻變成了支付三個訂單的錢,這是萬萬不可的,因此要確保商鋪訂單號不能與下單號出現一致的情況,這很簡單,例如加個字母字首等即可      
       1234 => o_4567
       4567 =>o_4567
       8910 =>o_4567
這樣子,使用者單獨支付訂單時,永遠走的是:《 重新生成商鋪訂單號和第三方支付下單號,讓其一致; 呼叫微信下單介面,根據該訂單金額等,重新下單》這個邏輯,請看《二》

四》訂單的退款,成功付款,只需要結合內部訂單號和第三方下單號處理就可以了

相關推薦

購物車商城訂單關係以及技術實現深入分析

本站所有文章均為原創,歡迎轉載,來源:技術小樹懶(www.drw1314.com),作者:錦煥同學 接觸商城開發已經有一段時間了,我們從B2C拼團專案做到了C2C視訊電商系統。雖然專案都還不算成功,但還是積累了些業務經驗,希望可以對大家有用。其實商城最主要的還是訂單相關

範數距離的關係以及在機器學習中的應用

1 範數 向量的範數可以簡單形象的理解為向量的長度,或者向量到零點的距離,或者相應的兩個點之間的距離。 向量的範數定義:向量的範數是一個函式||x||,滿足非負性||x|| >= 0,齊次性||cx|| = |c| ||x|| ,三角不等式||x+y|| <= ||x|| + |

Apache Shiro V1.2 SecurityUtilsSecurityManager的關係以及Subject的建立

SecurityUtils是一個抽象的工具類,提供了 SecurityManager 例項的儲存和獲取的方法,以及建立Subject的方法。 一、SecurityUtils中的方法 SecurityUtils提供了 getSecurityManager()和setS

JspServlet的關係以及JspHtml的區別

首先,一定要知道的是:所有的網頁最終顯示的都是HTML程式碼,我們現在所看到的網頁都是靜態頁面,都是由HTML組成的。任何的動態語言都不能脫離HTML而單獨存在於一個網站上,因為沒有靜態的頁面顯示,無法

java中類類的關係以及UML類圖

類圖主要是用來顯示系統中的類、介面以及它們之間的靜態結構和關係的一種靜態模型。 類圖的3個基本元件:類名、屬性、方法。 關係 內容 is-a 繼承 實現 us

C++父類子類關係以及函式過載、覆蓋和隱藏規則

今天去HTC面試,筆試考了邏輯、c語言、c++語言幾個部分,C/C++考的全是基本語法,沒有考演算法。C語言部分做的還不錯,C++部分卻做的那麼多不確定,其中大部分是C++父子類之間關係以及函式過載、覆蓋以及隱藏規則。 在C++語言中,虛擬函式是非常重要的概念,虛擬函式是

基礎網路概念(四)route、ipMAC的關係以及ICMP協定

宣告:本文為筆者複習計算機網路相關知識時的摘錄,文章中的圖片及語句均出自《鳥哥的Linux私房菜》,這裡僅作為整理自用。 喜歡鳥哥文章的朋友可以到鳥哥的主頁檢視:http://linux.vbi

購物車訂單專案總結

package cn.my.bookstore.order; import java.math.BigDecimal; import java.util.Date; import java.util.LinkedHashSet; import java.util.Map; import java.util.

webservice學習筆記(六):使用CXF開發web service的服務端和客戶端以及WebService請求深入分析

1.使用CXF開發web service -加入cxf的jar包即可,其他不需要改動   a.建立一個java專案,把之前的jdk開發webservice服務端的程式碼複製進去,把cxf的jar複製到lib下面並build path, 注意cxf的lib下有一個不是j

Java UrlRewriter偽靜態技術運用深入分析

偽靜態 就會 patch nco 常用 正則 isp pre 壓力 通常我們為了更好的緩解服務器壓力,和增強搜索引擎的友好面,都將文章內容生成靜態頁面。 但是有時為了能實時的顯示一些信息,或者還想運用動態腳本解決一些問題,不能用靜態的方式來展示網站內容,必須用到動態頁面顯示

線性規劃中的單純形法內點法(原理、步驟以及matlab實現)(三)

應用 最大化 round 並不是 兩個 生產 陰影 3.3 ima 在本系列的第三篇博客中,筆者討論對偶單純形法的相關理論和應用 2.3 Dual Simplex Method(對偶單純形法) Contents   2.3.1 對偶問題產生的原因   2.3.2 對偶問題的

基於百度理解交互技術實現機器問答

也有 文檔 展示 分解 += 集群 erro var returns 一、前言 我們都知道現在聊天對話機器是一個很有意思的東西,比如說蘋果siri,比如說微軟的小冰。 聊天對話機器的應用場景也很廣泛,比如說:銀行的自助辦卡機器人、展會講解解說等等。 我們對機器人

通過MSTP技術實現小型制造工廠的網絡鏈路備份以及負載均衡

MSTP技術實現網絡鏈路的備份以及負載均一、網絡拓撲圖二、思路:將同部門的PC機規劃到同一個VLAN中,然後通過MSTP技術對交換機上的vlan進行優先級劃分。三、構建網絡拓撲圖,將所需的網絡設備添加到拓撲圖中,並連上網線。四、配置PC機的IP地址及子網掩碼,標識出所屬的VLAN、IP地址、所屬車間。以及vl

偏導數全導數的關係 以及 偏微分全微分的關係

1.偏導數 代數意義  偏導數是對一個變數求導,另一個變數當做數 對x求偏導的話y就看作一個數,描述的是x方向上的變化率 對y求偏導的話x就看作一個數,描述的是y方向上的變化率 幾何意義 對x求偏導是曲面z=f(x,y)在x方向上的切線 對y求偏導是曲面z=f(x,y)在x方向

介面抽象類的繼承和實現關係

參考:https://blog.csdn.net/hudfang/article/details/50556277 //c++多繼承與多層繼承 參考:https://blog.csdn.net/Lingfeng928/article/details/51917955  

Tomcat(二) Tomcat實現: Servletweb.xml介紹 以及 原始碼分析Tomcat實現細節

轉載自;http://blog.csdn.net/tjiyu/article/details/54590259     -------如有侵權  請聯絡我 我會進行刪除    在《Tomcat(一

php的一些理解(物件類的概念以及相互關係理解)

先來看一段簡單的程式碼: <?php class Person{ public $name; public $age; public $sex; public function who() { echo $this->

C#中類物件的關係以及方法申明的static修飾符

C#中,類(class)的書寫,是class 類名稱:例如class Program這就是一個Program類,類理解起來就是同一類事物,具有同樣的特性,就如同我們常說的人類,鳥類,這樣具有相同特性和行為的一類事物的統稱,在程式設計中這種特性我們可以把它用一些方法功能來表示,例如程式:

32位64位作業系統以及CPU的關係

32位和64位的區別:  從硬體看,  1、目前32位和64位是指CPU的通用暫存器位寬(資料匯流排的位寬),所以64位的CPU資料處理位寬是32位CPU的2倍;  2、可定址範圍擴充套件,32位系統支援最大記憶體位4G(地址匯流排位寬已經是32位),64位系

day79_淘淘商城專案_12_購物車流程 + 商城購物車系統的搭建 + 商城購物車系統的實現分析 + 購物車實現增刪改查_匠心筆記

課程計劃 1、購物車的流程 2、購物車的實現 a) 登入狀態下的購物車實現 b) 未登入狀態下的購物車實現 1、購物車流程 1.1、以前的購物車流程 使用者將商品新增到購物車時,判斷使用者是否登入,如果已經登入將購物車放入se