PHP:模块化支付系统的最佳设计?

时间:2011-02-04 00:55:50

标签: php oop

使用PHP设计可以尽可能轻松添加的模块化系统的最佳方法是什么?例如,如果您有购物车,则可能有一个支付基类,其中包含您所需的所有方法。那么你可以有一个扩展该类的Paypal类,以及也扩展基类的Visa / Mastercard,但是你如何实际使用它们呢?

如果您使用了购物车的功能版本,则可以创建一个名为doExecute的函数并传递所需的信息。然后将所有文件命名为Payment_Method.php。然后读取文件名,创建可接受的付款方式列表。挑选一个文件后,该文件是脚本中唯一包含的文件,然后调用doExecute方法,保证支付方法包含文件中的方法是被调用的文件。

但是,对于面向对象的方法,这确实很有效。如何添加其他方法而不必继续修改代码以包含新类的对象?

2 个答案:

答案 0 :(得分:0)

我会这样做:

为所有支付系统使用基类(如您所述)

每个支付系统(例如paypal)扩展了支付类,您可以加载所有的PHP文件..只需确保它们都有一个与该文件对应的名称,反之亦然。

然后当选择付款选项时,您可以创建该实例的对象,而不是加载单个文件。并始终将该对象称为同名,如$ activePaymentGateway或类似名称。

然后,当你拨打$ activePaymentGateway-> processPayment(500,'EUR'); (或者像你的例子中的> doExecute())或者其他什么,相应的类应该知道那里发生了什么。

除了需要从基类继承的公共函数之外,每个类实际上不应该定义任何公共函数

我希望它有所帮助

答案 1 :(得分:0)

我实现这样的支付系统的方法是拥有基类,如你所提到的,但让基类实例化所需的支付供应商,这扩展了基类。然后基类控制加载的文件,集中控制,日志记录等。

public function loadVendor($vendorName) {
     static $validVendors = array('credit_card','paypal');
     if ( !in_array($vendorName, $validVendors ) {
         return false;
     }
     include('/path/to//vendors/'.$vendorName.'.php');
     $processor = new $vendorName();
     //additional default setup
     return $processor
}

由于所有供应商都有不同的数据提交结构。您的基类应具有“加载”数据的功能。这把它放在你的标准格式。然后,每个支付类都将具有“地图”功能,以将您的结构映射到其结构。例如,将日期拆分为单独的年,月,日字段。

然后,您可以使用“提交”功能将数据提交给处理供应商。然后是一个“解析响应”函数来解析响应并将其放入您提出的标准化响应数据结构中。

为简单起见,您可以使用一种方法调用所有三个函数(map-> submit-> map。但是对于测试,更容易将它们分开。      $处理器>属于MapData();      $处理器>提交();      $ response = $ processor-> parseResponse();

当然,这并不适用于Paypal。 Paypal是异步的,您将用户发送到他们的网站。然后,Paypal在完成处理后将其发送回您的网站。 Google结帐也是一样。

相关问题