【问题标题】:Chicken and Egg: save model before proceed to payment gateway? (Rails)鸡和蛋:在进行支付网关之前保存模型? (导轨)
【发布时间】:2011-06-28 11:40:57
【问题描述】:

我正在将 Barclays ePDQ CPI 支付集成到我们的应用程序中。

到目前为止我的编码方式是:

1.用户输入详细信息 2.模型保存到会话(不是数据库) 3. 用户跳转到支付页面。 4. 用户输入付款详情。 5. eDPQ 服务器执行回发,由控制器接收。这应该保存订单详细信息并保存用户模型。 6. CPI 将用户重定向到结果页面。

我不想在发送到付款页面之前保存用户详细信息的原因是,如果用户输入了错误的详细信息,可以在浏览器上按回,然后重新提交表单。

但是 - 我现在意识到,由于 eDPQ 服务器直接回调帖子,因此不会有会话。可以将 order_id 发送到作为参考发回的支付页面。所以现在我想在将用户发送到付款页面之前返回并保存用户,所以我在 order_id 中发送了一个参考。然后可以通过 post_back 方法获取它,该方法将找到用户并完成注册过程。

但是,如果他们点击返回并尝试重新提交,则会出现错误,因为用户已经存在。

解决此问题的一种方法是确保永远不会缓存用户的“新”页面。因此,当他们单击返回时,实际上会显示一个“编辑”页面,该页面看起来像一个“新”页面。 但是,这看起来会增加一些编码复杂性。

我希望有人遇到过类似的事情,并且可以在这里提供一些建议。

感谢阅读!

【问题讨论】:

    标签: ruby-on-rails web-services ruby-on-rails-3 payment-gateway payment


    【解决方案1】:

    总的来说,我认为最好完全保存您的模型。如果您想跟踪进度,可以使用进度列来实现。例如,在您的订单中,您可以执行以下操作:

    class Order
      def processed?
        status == 'processed'
      end
    
      def entered_details?
        status == 'details entered'
      end
    
      def can_process?
        entered_details?
      end
    end
    

    然后您可以简单地随着您的进度更新您的状态。例如,在用户输入他们的付款详细信息后,您可以将状态更新为“已输入的详细信息”,并且在您使用支付网关进行处理后,您可以将状态更新为“已处理”。这将允许您在模型中强制执行状态,而无需将其临时存储在会话中。

    对于后退按钮,您无法控制用户单击后退按钮时看到的内容。他们被带到他们之前所在的页面,并且您的服务器不会收到通知。这就是后退按钮的诅咒。解决这个问题的唯一方法是确保第二个表单提交会导致验证错误,或者如果它来自同一个会话,它会执行更新,但通常这不是你应该尝试适应的情况,因为它不遵循您的应用程序的流程。这就是为什么许多支付网站在处理付款时经常写“不要点击后退按钮”的原因。也就是说,您应该在页面上提供自己的后退按钮,但您可以调整它以重定向到编辑页面而不是新页面。

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 2013-05-22
      • 1970-01-01
      • 2018-04-11
      • 2011-12-15
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2015-11-21
      相关资源
      最近更新 更多