多个网关的通用数据库设计

时间:2016-02-01 11:58:38

标签: php mysql payment-gateway omnipay

我正在开发一个需要支持多个支付网关的网站(有付款)。我将使用omnipay包(感谢上帝有一个包来处理这个)但现在我想知道什么是将所有支付信息存储在数据库中而不将其绑定到特定网关的最佳方式。

我的第一个想法是拥有以下表格:

  • 网关(gateway_id,gateway_name,...)
  • 付款(payment_id,payment_amount,...)
  • 交易(transaction_id,gateway_id,payment_id,transaction_reference,transaction_type transaction_status,transaction_request_data, transaction_response_data ...)。 类型可以是“授权”,“购买”,“退款”,“无效”等类似状态,例如“成功”,“失败”,“待定”等等。

通过这种方式,我可以有一个网关列表(Paypal,Stripe,TargetPay,WorldPay),每个支付可以有多个交易(支付尝试可能在第一次失败然后再次尝试并且工作但是无效或退款)但一笔交易属于一笔付款。每个交易都是使用特定网关执行的,这也将被存储。

我不知道这是不是最好的方法(也许这太简单了?)我想听听其他一些想法。

谢谢!

2 个答案:

答案 0 :(得分:1)

您的初始结构是一个良好的开端。我要包括的其他事情是:

  • 响应,用于保存从网关发回的响应消息,以响应您的购买电话
  • 回调。越来越多的网关在通知URL上向呼叫者提供POST消息。这些表示从网关更改状态消息,例如取消的交易或退款
  • 退款和空白,我会存储在一张桌子里。
  • 对回调,退款和空白的回复,如果您正确构建,则可以将其存储在与常规回复相同的表中

您可能必须将某些数据存储为JSON blob,因为来自每个网关的消息结构会有所不同。您可能想要加密的一些数据,例如,如果它包含可以识别客户或信用卡的数据

答案 1 :(得分:0)

我认为最好的答案是:它取决于网关提供/相互提供的数据的接近程度。如果它们彼此接近,或者您可以映射各种状态类型,则将所有这些存储在单个事务表中。如果没有,那么您需要为每个支付网关维护单独的表。

但是,即使在后一种情况下,我也会有一个事务表来整合所有提供商中最重要和最常见的数据,例如金额,付款状态,并且只在相应的表中存储供应商特定数据。