我正在开发一个需要支持多个支付网关的网站(带有支付功能)。我打算使用 omnipay 包(感谢上帝,有一个包可以处理这个)但现在我想知道在数据库中存储所有支付信息而不将其绑定(bind)到特定网关的最佳方法是什么。
我的第一个想法是拥有以下表格:
- 网关(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),并且每次付款都可以有多个交易(一次付款尝试可能会在第一次失败,然后再次尝试并成功但随后作废或退款),但一笔交易属于一笔付款。每笔交易都使用特定的网关执行,这也将被存储。
我不知道这是否是最好的方法(也许它太简单了?),我想听听其他一些想法。
谢谢!
最佳答案
您的初始结构是一个好的开始。我要包括的其他内容是:
- responses,它将保存从网关发回的响应消息,以响应您的购买电话
- 回调。越来越多的网关在通知 url 上向调用者提供 POST 消息。这些指示来自网关的状态消息的变化,例如取消的交易或拒付
- 退款和无效,我会存储在一个表中。
- 对回调、退款和无效的响应,如果结构正确,您可以将其存储在与常规响应相同的表中
您可能必须将某些数据存储为 JSON blob,因为来自每个网关的消息结构会有所不同。您可能想要加密的一些数据,例如,如果它包含可以识别客户或信用卡的数据
关于php - 多网关的通用数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35129979/