Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多网关通用数据库设计_Php_Mysql_Payment Gateway_Omnipay - Fatal编程技术网

Php 多网关通用数据库设计

Php 多网关通用数据库设计,php,mysql,payment-gateway,omnipay,Php,Mysql,Payment Gateway,Omnipay,我正在开发一个网站(支付),需要支持多个支付网关。我打算使用omnipay软件包(谢天谢地,有一个软件包可以处理这个问题),但现在我想知道,在数据库中存储所有支付信息而不将其绑定到特定网关的最佳方式是什么 我的第一个想法是建立以下表格: 网关(网关id、网关名称等) 付款(付款id、付款金额等) 交易(交易id、网关id、支付id、交易参考、交易类型交易状态、交易请求数据、, 事务\响应\数据。 类型可以是“授权”、“购买”、“退款”、“无效”等,状态可以是“成功”、“失败”、“待定”等 通

我正在开发一个网站(支付),需要支持多个支付网关。我打算使用omnipay软件包(谢天谢地,有一个软件包可以处理这个问题),但现在我想知道,在数据库中存储所有支付信息而不将其绑定到特定网关的最佳方式是什么

我的第一个想法是建立以下表格:

  • 网关(网关id、网关名称等)
  • 付款(付款id、付款金额等)
  • 交易(交易id、网关id、支付id、交易参考、交易类型交易状态、交易请求数据、, 事务\响应\数据。 类型可以是“授权”、“购买”、“退款”、“无效”等,状态可以是“成功”、“失败”、“待定”等
通过这种方式,我可以拥有一个网关列表(Paypal、Stripe、TargetPay、WorldPay),每个支付可以有多个交易(一次支付尝试可能会在第一次失败,然后再次尝试,然后生效,但随后作废或退款),但一个交易属于一次支付。每个事务都是使用特定的网关执行的,这也将被存储

我不知道这是否是最好的方法(可能太简单了?),我想听听其他的想法


谢谢

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


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

您的初始结构是一个良好的开端。我还将包括以下内容:

  • responses,它将保存从网关返回的响应您的购买呼叫的响应消息
  • 回调。越来越多的网关在通知url上向调用者提供POST消息。这些指示来自网关的状态消息的更改,例如取消的交易或退单
  • 退款和空白,我会储存在一张桌子上
  • 对回调、退款和作废的响应,如果结构正确,可以将其存储在与常规响应相同的表中

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

我完全同意您的观点@Shadow。我认为这是一个非常复杂的问题,因为每个网关可能有自己的数据,还有另一件事:有不同类型的操作:“授权”、“购买”、“退款”、“作废”。。。每个操作也可能有自己的数据。因此,我不确定如何实现能够处理所有这些情况的可靠数据库结构。我在考虑以标准格式(例如,如您所说的JSON)将请求和响应存储在事务表中(transaction_request_数据和transaction_response_数据)。你认为把他们留在自己的桌子上更好吗?此外,退款和作废与付款相关,因此我也考虑将其存储为交易(在交易表中)。您认为将所有这些操作作为“事务”处理是错误的吗?我将在单独的表中添加响应。对于单个付款请求,可能有多个响应、回调等。您是否将请求数据存储在单独的表中是一个有争议的问题。您能举个例子吗?我不确定如何以这种方式存储响应。可能不是因为它有点超出了解释基本内容的范围。存储数据的方式还取决于所使用的框架。e、 g.在Laravel中,您将使用一个带有$casts参数的模型类,该参数指示cast=array的列,然后只需为该列分配一个数组值,它将为您转换为JSON。在其他框架中如何做到这一点可能超出了本文讨论的范围——您应该查看框架文档。在最常见的情况下,当从列中分配或检索数据时,您将手动执行json_encode()和json_decode。