【问题标题】:Best practice for POST'ing to a new page with a redirect?使用重定向发布到新页面的最佳实践?
【发布时间】:2012-03-01 14:54:52
【问题描述】:

我正在尝试解决一个看起来像这样的工作流:(在 PHP 中)

  1. 用户在我的购物车中输入订单信息。
  2. 订单被捕获并存储到我的数据库中(没有信用卡信息)
  3. 用户被重定向到 authorize.net 的 SIM 页面进行支付

当前设置:

shoppingcart.php - 收集用户送货信息/等

storeorder.php - 将订单存储在我的数据库中,然后用适当的所需 authorize.net POST 字段组装一个表单

简而言之,用户最终不得不查看一个不必要的中间页面,他们必须点击“付款”表单提交按钮,然后将他们发送到 authorize.net。

结合这些步骤的最佳做法是什么? (接收 POST,将信息存储在我的数据库中,然后使用新的 POST 字段自动重定向到 authorize.net,无需任何用户交互)

【问题讨论】:

    标签: php post redirect http-headers


    【解决方案1】:

    不要干涉用户的钱!
    即使您不想存储信用卡详细信息,您的网站也可能被黑客入侵,并且攻击者会得到它。

    1. 用户在我的购物车中输入订单信息。
    2. 订单通过 authorize.net 的 SIM 页面进行支付处理
    3. authorize.net 联系您的网站并提供付款详情。

    是唯一正确的方法。
    世界上的每个站点都以这种方式工作。所以你必须这样做。不要把自己当作聪明的王牌。

    【讨论】:

      【解决方案2】:

      shoppingcart.php 上,您可以放置​​一个结帐按钮。在按下提交用户操作时。 Do not save item prices/quantity in hidden fields. 在发布用户结帐按钮时,您可以将所有信息保存在数据库中,并在 PHP 发布条件中制作 HTML 表单,以设置 authorize.net 的值并将您的标题重定向到付款页面。

      【讨论】:

        【解决方案3】:

        用户是否必须在 authorize.net 页面上进行任何类型的输入,或者您的表单是否提供了所有需要的信息?如果您生成所有信息,那么最简单的方法是通过 cUrl 调用 authorize.net 将数据直接推送给他们并检查返回状态代码/输出以查看是否成功/不成功等。

        如果用户仍需要输入帐单明细,请使用以下方法。

        表单帖子到 /somepage.php

        somepage.php 运行它的处理,并在处理完成后一直在底部添加 header("Location: https://www.authorize.net/dopaymenthere");

        确保您仍然在此页面上回显“付款”按钮,以防万一用户做了一些不寻常的事情,他们强制重定向停止等。这样它看起来不像是损坏的代码,但对于很少有对他们的浏览器造成不寻常的事情的例外,你仍然可以优雅地处理它们

        PS:这只能通过将 post 变量连接为 get 请求来工作,假设 authorize.net 会将 get 请求作为变量处理。

        在不使用 get 请求的情况下,真正简单的方法是使用 javascript,通过在 dom ready 上提交表单...这样您就可以向用户显示处理订单消息。并使用嵌入式隐藏表单将它们直接发布到 authorize.net,以防您的处理时间比预期的长等。

        在 processing.php 页面上的 jquery 术语中,您将有类似的内容:

        echo $form; // HTML form with all it's values required by authorize.net
        echo "<h1>Processing your request</h1>";
        <script type='text/javascript'>$(document).ready(function(){$('#hiddenformid').submit();});</script>
        

        【讨论】:

        • ORIGINAL POSTER:是的,我们使用的是 SIM 卡方式,因此用户必须在 authorize.net 页面上输入所有账单信息。 (信用卡号、有效期、安全码)。我们不直接传递该信息的原因是因为从技术上讲,它会使您稍微超出 PCI 合规性。 (上面的用户在技术上使用的是直接发布方法 (DPM),而不是 SIM)。
        • 使用托管表单的全部意义在于不让敏感信息通过您的服务器运行。如果您正在收集付款数据,然后将其发送到 authorize.net,您不妨使用 AIM。
        • 根据您的回答,解决问题的最简单方法是使用用户看不到的即时重定向。我将编辑我的分析器以使其更清晰...
        猜你喜欢
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 2010-12-27
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        相关资源
        最近更新 更多