如何在确认页面上存储用于支付处理的数据?
Posted
技术标签:
【中文标题】如何在确认页面上存储用于支付处理的数据?【英文标题】:How do I store data for payment processing on a confirmation page? 【发布时间】:2011-11-27 03:02:48 【问题描述】:我正在向我的新 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。
【问题讨论】:
最佳实践是让知道他们在做什么的人处理付款,您将用户与客户和订单详细信息一起退回给他们,然后退回给您进行确认。这也为您节省了数万美元用于超安全基础架构和审计的费用。 【参考方案1】:在研究了我们的选择之后。我们决定进行预授权交易。因此,我们只需要存储来自处理器的 Order Id,然后在确认详细信息后,我们将发送 Post Authorization 交易以实际发布付款。
【讨论】:
【参考方案2】:实际上不要在该页面上显示信用卡号。只需显示最后四位数字,以便他们验证他们使用的是正确的信用卡。
我知道您可能想要显示它以验证他们没有输入错误。除了很少有用户会仔细检查整个信用卡号这一事实之外,您还可以通过根据Luhn Algorithm 验证信用卡号来发现大多数潜在错误。如果信用卡号码输入错误,它通过 Luhn 算法的机会非常非常小。然后您可以要求他们在进入摘要页面之前重新输入卡号。
【讨论】:
我添加了我现在正在做的事情(在这篇文章之前)。但是如何将此信息传递给下一个实际处理付款的操作?【参考方案3】:您可以在加载确认页面之前将模型存储到会话变量中。请记住,会话变量不一定只是变量,而是可以是整个对象。
Session["submitted_data"] = util.Encrypt(Model); //Util.Encrypt would be your custom Encryption lib
编辑
糟糕,错过了 CC 凭据位。
这有点棘手。您可以在订单确认页面之后询问信用卡凭证,或者您可以在数据库中创建一个 Temp_Confirmation 表。从那里您将加密 CC 凭据,将其存储在数据库中,直到它们通过确认页面(将表 GUID 存储在隐藏字段中),然后在另一端检索它。只需确保加密和解密,并在完成后删除记录。
【讨论】:
加密对象会在会话中起作用吗?有没有更好的方法来做我想做的事情? 我会亲自加密并放入数据库中。 这里有一些Secure Session State 使用 SHA1/MD5/... 或其他单向加密方案,这使得无法从其存储的哈希中反向工程凭据。 将 cc 号码加密到服务器端数据库是一个坏主意。您立即陷入 PCI-DSS 领域。【参考方案4】:从概念上讲,您只需要“保存”信息服务器端以供以后处理。没有理由将此信息作为隐藏字段、cookie、parms 或其他任何内容发送回客户端。现在,鉴于您需要将其保存在服务器端,您有两种选择:
1) 会话状态 - 优势,它现在就在那里,它会自动清理,并且(也许)它只是内存。缺点是每个会话只有一个。随着标签式浏览的出现,我们发现在会话状态中存储任何事务性都是有问题的。
2) 保存在数据库中 - 优点是保存简单,检索简单。只要您拥有正确的密钥,您就可以在同一个会话中,或在另一个会话中,甚至从另一台机器上检索它。缺点是你保留了信息,你需要清理它。
我会选择选项 2。只需将信息写入表格,然后在需要时将其读回。您当然应该加密 CC 号码,但这是一项微不足道的任务。
【讨论】:
将卡号加密到服务器端是个坏主意。加密很容易。密钥管理不是。此外,PCI-DSS 审计的全部重任都落在了您的肩上。 是的,但是如果您要存储它们,则需要对其进行加密。在某些(很多?)情况下,将问题交给第三方处理者会更简单,但是当您遇到自行处理整个流程的大型组织时,这并不奏效。以上是关于如何在确认页面上存储用于支付处理的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WooCommerce 的订单支付页面上检索订单 ID