用于多个支付网关的最佳模式

Posted

技术标签:

【中文标题】用于多个支付网关的最佳模式【英文标题】:Best pattern to be used for multiple payment gateways 【发布时间】:2015-09-06 11:01:04 【问题描述】:

要求:

我需要与多个支付网关集成。但是,客户端仅使用其中一种可用的,并且使用管理员设置进行配置。

当前系统:

我为每个支付网关编写了一个库。随着网关集成请求(源)的增加,这会造成维护噩梦和项目的潜在增加。

问题

有人可以建议我在这种情况下使用的设计模式,可以创建接口和通用设置并根据需要实现网关以减少重复代码吗?

【问题讨论】:

在我看来你已经回答了你自己的问题 我会去看看 NopCommerce 之类的公司是如何做到的。如果我没记错的话,他们每个提供商都有一个插件,而且几乎可以肯定至少有一个界面在使用。 策略设计模式怎么样? 如果您有一些代码在您的各种支付项目库中重复出现,那么创建另一个项目,您可以在其中定义一个抽象支付类,所有其他支付提供商都从该类派生。因此,现在跨多个项目的所有通用代码都在一个抽象类中,并且更易于维护。 【参考方案1】:

我会创建一个标准接口来处理常见的操作。拥有一组传递给这些方法的域对象。

例如,要创建付款,您可能有一个 PaymentCardDetails 模型、一个 AddressModel 等。您的接口将有一个 MakePayment 或类似方法,例如:

public MakePaymentResponse MakePayment(PaymentCardDetails cardDetails, AddressModel address);

那么您的每个支付网关都应该使用自己的实现来实现这个接口。

然后使用 IoC(控制反转)/DI(依赖注入)根据提供的配置值决定在运行时使用哪个接口。

在您的代码中使用支付网关的方法中,您将使用构造函数注入在接口中传递,您的 DI 框架将负责选择正确的实现。例如

public class Payment 

    private readonly IPaymentGateway _paymentGateway;

    public Payment(IPaymentGateway paymentGateway) 
        _paymentGateway = paymentGateway;
    

    public MyMethod() 
        //get your models prepared etc.
        _paymentGateway.MakePayment(cardDetails, addressDetails);
    

【讨论】:

以上是关于用于多个支付网关的最佳模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ruby​​ on rails 中集成多个支付网关(多个商家)?

PHP - 接受多个支付网关

一种可以将资金转移到多个支付网关的 API

Magento 多个 Authorize.net 网关

多网关的通用数据库设计

具有定期支付选项的最佳印度支付网关[关闭]