如何在确认页面上存储用于支付处理的数据?

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

如何在上阿里巴巴买东西

仅在确认付款后,如何在 NodeMailer 中发送电子邮件?

如何在网格存储数据的所有页面上查询/过滤?

我如何确认客户端(安卓应用程序)数据已由 GCP 云功能完成处理?