强大的支付处理架构

时间:2010-10-15 11:29:18

标签: web-services architecture payment-gateway

想象一下3个系统组件: 1.用于处理信用卡交易的外部电子商务Web服务 2.本地数据库存储处理结果 3.本地UI(或赢取服务)以执行客户订单文档的付款处理

外部Web服务显然不是事务性的,所以如何保证: 1.从Web服务接收时最终持久保存到数据库的结果,即使在那时无法访问数据库(网络问题,数据库超时) 2.阻止客户在其他客户发起付款时处理客户订单,但结果尚未成功保留到数据库(并在某种恢复队列中等待)

目的是进行具有非事务性系统组件的处理,并保证在发生故障时其他进程不会重复该事务。

(请在售后付款处理的背景下查看,多个运营商可能会尝试手动付款处理;不是网络结账申请)

3 个答案:

答案 0 :(得分:3)

询问付款处理商是否可以根据您提供的订单ID检测重复的交易。然后,如果由于数据库故障而无法存储响应,则可以安全地重新提交请求,而不必担心双重收费(在此方案中,我使用过的至少一个PSP返回相同的响应/身份验证代码,以及标志着说这是重复的。)

或者,只需在尝试付款之前立即在您的订单上设置一个标记,如果已设置标记,则不要尝试付款。如果在付款期间出现错误,您可以随意调查并修复数据。

我不愿意尝试自动取消订单并重新提交,因为这只会让人感到困惑(例如,如果取消失败 - 你应该重试还是不行?)。最好保持逻辑简单,以便在出现问题时确切知道自己的立场。

答案 1 :(得分:2)

在任何类似的系统中,您都需要强大的错误处理和错误报告。在处理付款方面,这是非常正确的,在这种情况下,您绝对不希望不小心拿走某人的钱而不交付货物。

由于您将付款处理外包给第三方,因此您最终非常依赖具有强大错误处理和报告系统的网关。

通常情况下,您将控制权移交给支付网关并启动等待网关响应的任务,即“付款接受”或“付款被拒”。当你得到答案时,你会进入你的过程的下一步,一切都很好。

如果您根本没有得到回复(超时),或者回复无效,那么您的行动方式将取决于支付网关:

  • 如果网关支持,则发送“取消付款”样式请求。如果付款成功取消,那么您可能希望将用户发送到“抱歉,请再试一次”样式页。

  • 如果网关不支持取消,或者您没有与网关通信,那么您需要手动(亲自,如电话)联系第三方以发现问题所在以及如何继续。为此,您需要尽可能多地转储错误日志,例如日期/时间,客户ID,交易价值,产品ID等。

一旦你回到你的网站上(并且接受了付款),你就可以更好地控制错误,但是如果你不能完成订单,那么你应该将细节转储到磁盘上(例如用于手动处理的csv文件)或联系网关取消付款。

它还值得建立一个系统来跟踪发生的错误,如果出现过多的数据,那么请考虑应该发生什么。例如,如果它是一个高流量站点,您可能希望暂时阻止其他客户在调查问题时下订单。

答案 2 :(得分:0)

分布式消息传递。

当您的支付网关返回时,会向持久队列提交一条消息,以确保处理程序最终获取并处理它。处理程序将更新数据库。如果此时发生故障,处理程序可以将消息保留在队列中或将其重新发布到队列中,或者发布备用消息。

如果稍后发生使事务无效的事情,则可以将另一条消息排队以“撤消”更改。

最近有很多关于最终一致性和分发消息的嗡嗡声。 NServiceBus是新组件的热点。我建议调查一下,我知道我们是。