通常,当客户点击电子商务网站上的“结帐”按钮时,他们会经历以下结帐流程:
客户在结账的第4步点击“确认”后,我们通常会想要创建一些数据库对象,包括:
Order
Invoice
(与相应的Order
Payment
(与相应的Invoice
我的第一个想法是应该发生这样的事情:
Order
对象Invoice
对象Payment
创建status=PENDING
对象并尝试从信用卡中收费Payment
更新为status=SUCCESS
并将客户重定向至“谢谢”页面Payment
更新为status=FAIL
并将客户返回到步骤4并显示错误消息但是,此流程存在问题:如果费用失败且客户返回到第4步,则再次点击“确认”即会生成重复的Order
和Invoice
重新尝试付款。
为了避免这种情况,我们可以将此流程修改为仅创建新的Order
和Invoice
(如果它们尚不存在)。然而,问题在于用户可以点击回到步骤1,改变顺序,然后再尝试再次付款。在这种情况下,Order
和Invoice
对象将不正确,因为订单已更改。
为了避免这种情况,我们可以更新现有的Order
和Invoice
(如果它们已经存在),但这现在看起来过于复杂,并且还打破了发票应该是不可变的共同约定。 / p>
对此进行建模的最佳方法是什么?
答案 0 :(得分:0)
简单回答 - 直到交易确认后才会发生任何事情。如果信用卡没有通过您,请再次使用相关的错误消息向他们显示结算表单。这可能是一个简单的错误。或者可能是他们并没有真正去做订单。
'发票'意味着欠款。实际上,这可能是一种有趣的方式来描述客户购物时的流程订单。但是你处于最后一步,一旦交易完成了它的订单。所以你不需要单独创建任何东西。
=========编辑
嘿,我非常感谢你详细说明你的其他评论中的发票要求 - 不知道这一点。而且我仍然会在你知道根本就会有订单的情况下推迟创建订单的想法。
否则 - 您为什么不在发票上做同样的事情而不是付款?交易完成后,发票似乎只是“不可变”。因此,有一个状态字段 - 待处理,成功,失败等等,并且如果付款失败则非常重要 - 在提交交易之前 - 您正在检查购物车等以重新确认所有总计。
您需要让客户无法点击并更改订单。购物车必须有一个令牌或某种标识符,这使得这是不可能的。
此外,我强烈建议 - 如果订单被更改 - 例如退货,交换等 - 您发出新订单。因为部分变化也是手头库存变化的原因。