2011-09-28 73 views
1

我正在爲我的新ASP.NET MVC 3項目添加一個「確認付款」頁面。驗證輸入後,我會顯示一個確認頁面,以允許用戶確保他們正確輸入了所有內容。我的下一個問題是如何「存儲」輸入的數據,以便在點擊「確認」後處理付款。很明顯,我不想用完整的信用卡號碼創建隱藏字段。如何在確認頁面上存儲付款處理數據?

我正在使用我們的購物車的會話,但它是否加密數據,以便信用卡號碼不能被黑客入侵?這方面推薦的方法是什麼?我在Google上完成的搜索並沒有真正發揮。

我將顯示他們在前一頁輸入的信息(以確認數據輸入)。正確掩蓋當然的信用卡號碼。

付款信息

的信用卡名稱:名稱

信用卡號碼:XXXX XXXX XXXX 1111

截止日期:10/2011

信用卡驗證碼:100

總共需收費:$ 50.86

當然這個帖子上的所有數字都是假的。

這是我目前使用的代碼。

// 
    // POST: /Checkout/AddressAndPayment 
    [HttpPost] 
    public ActionResult AddressAndPayment(Cart cart, PaymentForm formData) 
    { 
     if (cart.Items.Count() == 0) 
     { 
      ModelState.AddModelError("", "Sorry your cart is empty!"); 
     } 

     if (ModelState.IsValid) 
     { 
      var viewModel = new AddressPaymentViewModel 
      { 
       FormData = formData, 
       Cart = cart 
      }; 

      return View("Confirm", viewModel); 
     } 
     else 
     { 
      var viewModel = new AddressPaymentViewModel 
      { 
       FormData = formData, 
       Cart = cart, 
       States = States.GetStatesDDL(), 
       CreditCardTypes = CreditCartTypes.GetCreditCardTypesDDL() 
      }; 
      return View(viewModel); 
     } 
    } 

    // 
    // GET: /Checkout/Confirm 
    public ViewResult Confirm() 
    { 
     return View(); 
    } 

所以從那裏,當我運行

// 
    // POST: /Checkout/Confirm 
    [HttpPost] 
    public ViewResult Confirm(Cart cart, PaymentForm formData) 
    { 
     return View(); 
    } 

我需要仍然有表單數據發送到信用卡處理器。

有沒有更好的方法來做到這一點?什麼是「最佳實踐」?

Another method我見過的是用信用卡處理器做一個「PreAuth」和「PostAuth」,不存儲那個數據週期,只是一個訂單ID。

+0

最佳做法是讓知道自己在做什麼的人處理付款,將用戶與顧客和訂單詳細信息反彈給他們,然後彈回給您確認。這也可以幫助您在超安全的基礎架構和審計上花費數十萬美元。 – cjk

回答

3

經過研究我們的選擇。我們決定進行預授權交易。因此,我們必須存儲的是處理器的訂單ID,然後在確認詳細信息後,我們將發送「後授權」事務以實際發佈付款。

0

在加載確認頁面之前,您可以將模型存儲到會話變量中。請記住,會話變量不一定只是變量,但可以是整個對象。

Session["submitted_data"] = util.Encrypt(Model); //Util.Encrypt would be your custom Encryption lib 

編輯

哎呀,錯過了CC證書位。

這有點棘手。您可以在訂單確認頁面後詢問信用卡憑證,或者可以在數據庫中創建Temp_Confirmation表格。從那裏你可以加密CC憑證,將它存儲在數據庫中,直到它們經過確認頁面(將GUID存儲在隱藏字段中),並在另一端檢索它。只要確保加密和解密,並在完成後刪除記錄。

+0

將信用卡憑證存儲在隱藏字段中? –

+0

哎呀,錯過了。不不不!!! –

+0

做了編輯... –

0

不實際顯示該頁面上的信用卡號碼。只需顯示最後四位數字,以確認他們正在使用正確的信用卡。

我知道你可能想顯示它來驗證他們沒有輸入錯誤。除了幾乎沒有用戶會仔細檢查整個信用卡號的事實之外,您還可以通過驗證Luhn Algorithm的信用卡號來驗證大部分潛在錯誤。如果信用卡號碼輸入錯誤,它通過Luhn算法的機會非常非常小。然後您可以請求他們在進入摘要頁面之前重新輸入卡號。

+0

我添加了我現在正在做的事情(在這篇文章之前)。但是,如何將這些信息傳遞給實際處理付款的下一個操作? –

0

從概念上講,您只需要「保存」服務器端的信息以便日後處理。沒有理由將此信息作爲隱藏字段,cookie,參數或其他信息發回給客戶端。現在,鑑於你需要保存它在服務器端,你有幾個選擇:

1)會話狀態 - 優勢,它現在在那裏,它自動清理,並且(也許)它只是內存。缺點是,每個會話只有其中一個。隨着標籤式瀏覽的出現,我們發現在會話狀態下存儲任何事務是有問題的。

2)保存在數據庫中 - 優點是保存簡單,檢索簡單。只要您擁有正確的密鑰,您就可以在同一個會話中或另一個會話中甚至從另一臺計算機上檢索它。缺點是,你堅持信息,你需要清理它。

我會選擇選項2.只需將信息寫入表格,然後在需要時將其讀回。你當然應該加密CC號碼,但這是一個微不足道的任務。

+0

將卡號加密到服務器端是個不錯的主意。加密很簡單。關鍵管理不是。此外,PCI-DSS審計的全部重量落在您的肩上。 – PaulG

+0

好的,但如果你打算存儲它們,你需要加密它們。在一些(很多?)的情況下,將問題交給第三方處理器會更簡單,但這並不適用,因爲您可能會遇到處理整個流程的大型組織。 –