2016-07-08 142 views
3

通常,當客戶點擊電子商務網站的「結賬」按鈕,就完成結帳過程是這樣走:建模電子商務網站結賬

  1. 更新/確認的產品數量在購物車
  2. 輸入地址,選擇送貨方式
  3. 輸入信用卡的詳細信息
  4. 檢查所有訂單的詳細信息,點擊「確定」進行支付
  5. 「謝謝你」頁面,訂單號

客戶點擊結賬的步驟4「確認」後,我們通常需要創建一些數據庫對象包括:

  • Order
  • Invoice(其中有一個關係到相應的Order
  • Payment(其具有相對於對應的Invoice

我首先想到的是應該發生這樣的事情:

  1. 創建訂單細節的Order對象
  2. 與訂單的總成本創建一個Invoice對象
  3. 創建status=PENDING一個Payment對象並嘗試對信用卡收費
  4. 如果收費成功,請將Payment更新爲status=SUCCESS,並將客戶重定向至「謝謝」頁面
  5. 如果扣款失敗,系統更新Paymentstatus=FAIL並返回客戶提供錯誤信息到步驟4中顯示

然而,這個流程的一個問題:如果扣款失敗並返回客戶步驟4,如果再次點擊「確認」重新嘗試付款,將會生成重複的OrderInvoice

爲避免這種情況,我們可以修改此流程,只創建新的OrderInvoice(如果它們不存在)。但是,問題在於用戶可能會回到步驟1,更改訂單,然後嘗試再次付款。在這種情況下,OrderInvoice對象將不正確,因爲訂單已更改。

所以爲了避免這種情況,我們可以更新現有的OrderInvoice(如果它們已經存在),但現在看起來過於複雜,並且打破了發票應該是不可變的通用慣例。

建模的最佳方式是什麼?

回答

0

簡單的答案 - 直到交易確認後纔會發生任何事情。如果信用卡未通過,請再次嘗試使用相關錯誤消息向他們顯示結算表單。這可能是一個簡單的錯誤。或者它可能是他們並不真正執行訂單。

'發票'意味着欠款。實際上,這可能是一個有趣的方式來描述客戶購物時的流程訂單。但是,你正處於最後一步,一旦交易完成了它的一個訂單。所以你不需要單獨創建任何東西。

=========編輯

嘿我真的很感謝你詳細說明了在你的其他評論發票要求 - 不知道。而且我還是會推遲這個想法,不得不建立一個訂單,然後才知道會有訂單。

否則 - 您爲什麼不在付款時對發票做同樣的事情?在交易完成後,似乎發票只是「不可變的」。因此,有一個狀態欄 - 待處理,成功,失敗等,如果付款失敗,則非常重要 - 在提交交易之前 - 您正在檢查購物車等,以確認所有總計。

而且您需要讓客戶無法點擊並更改訂單。購物車必須有令牌或某種標識符,這使得這是不可能的。

此外,我會強烈建議 - 如果訂單改變 - 如退貨,交換等 - 你發出一個新的訂單。因爲這一變化的一部分也是庫存變化的原因。

+0

我認爲,但我會失敗沒有鏈接到任何訂單或客戶的付款對象。 – aco

+0

讚賞這個討論 - 編輯上面 – cartalot

+0

謝謝,我想我會做的只是一旦支付成功創建'Order'和'Invoice'對象,並有一個'Payment.notes'字段,我可以添加關於什麼的消息付款是用於失敗的付款。 – aco