我正在将巴克莱ePDQ消费物价指数支付集成到我们的应用程序中。
到目前为止,我的编码方式是:
1.用户输入详细信息2.模型被保存到会话(而不是数据库) 3.用户被转发到付款页面。4.用户输入付款明细。5. eDPQ服务器执行post回发,由控制器拾取。这将保存订单详细信息并保存用户模型。6. CPI将用户重定向到结果页面。
我不想在发送到付款页面之前保存用户详细信息的原因是,如果用户输入了错误的详细信息,则可以在浏览器上按back,然后重新提交表单。
然而,我现在意识到,由于eDPQ服务器直接回调post,因此不会有会话。可以将order_id发送到付款页面,该页面将作为参考发送回来。因此,现在我想在将用户发送到支付页面之前返回并保存他们,因此我在order_id中发送了一个引用。然后,可以通过post_back方法获取该信息,该方法将查找用户并完成注册过程。
但是,如果他们单击“上一步”并尝试重新提交,则会出现错误,因为用户已经存在。
解决这个问题的一种方法是确保用户的“新”页面不会被缓存。因此,当他们单击“上一步”时,他们实际上会看到一个“编辑”页面,看起来就像一个“新”页面。然而,这看起来会增加一些编码的复杂性。
我希望有人遇到了类似的事情,也许能在这里给出一些建议。
感谢您的阅读!
发布于 2011-02-17 01:10:14
总的来说,我认为最好的做法是完全保存你的模型。如果您想要跟踪进度,可以使用进度列进行跟踪。例如,在您的订单中,您可以执行以下操作:
class Order
def processed?
status == 'processed'
end
def entered_details?
status == 'details entered'
end
def can_process?
entered_details?
end
end然后,您可以简单地更新您的状态随着您的进展。例如,在用户输入他们的付款详细信息后,您可以将状态更新为“已输入详细信息”,并且在您使用支付网关进行处理后,您可以将状态更新为“已处理”。这将允许您在模型中强制执行状态,而不必将其临时存储在会话中。
至于后退按钮,您无法控制用户单击后退按钮时所看到的内容。它们被带到它们之前所在的页面,并且您的服务器不会收到通知。这就是后退按钮的诅咒。解决这个问题的唯一方法是确保第二个表单提交导致验证错误,或者如果它来自同一个会话,它将执行更新,但通常情况下,您不应该尝试适应这种情况,因为它不遵循您的应用程序流。这就是为什么许多支付网站在处理支付时经常写着“不要点击后退按钮”。也就是说,您应该在页面上提供自己的后退按钮,但您可以对其进行调整,以重定向到编辑页面而不是新页面。
https://stackoverflow.com/questions/5018990
复制相似问题