2011-09-28 65 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

好的,但如果你打算存储它们,你需要加密它们。在一些(很多?)的情况下,将问题交给第三方处理器会更简单,但这并不适用,因为您可能会遇到处理整个流程的大型组织。 –