Magento付款stream程

我正在为Magento实现一个新的支付模块,并希望了解这个逻辑背后的核心概念。 我知道我必须从Mage_Payment_Model_Method_Abstract或其任何子类扩展,但我的问题是什么时候使用以及如何在我的模型中使用捕获和授权方法。 例如,如果我像这样分步整个过程:

  1. 用户来到购物车,select一些支付方式即网关。
  2. 系统拦截请求,收集所有提交的数据并将用户发送到网关的url。
  3. 用户将他的订单(或取消)发送到我的商店发送信息的网关站点。
  4. 我的商店会对接收到的数据进行更多的订单修改,并保存完成或取消状态的订单。

在这些步骤中,我将不得不使用授权和捕获方法? 如果有人能向我解释什么是授权和捕获手段,我将不胜感激。

以下是我一直理解这些概念的方式,以及在Magento中实现支付模块时需要了解的内容。 你的具体“发生在哪里”的答案在下面加上粗体,尽pipe它不像你希望的那么简单。

互联网前,信用卡交易是两个阶段的过程。

在销售时,当商人拿走消费者的信用卡进行购买时,他们将通过销售点将其滑入信用卡中心办公室,并询问“该卡是否被授权用于该networking,并且是这个特殊的消费者的可用信用额度是否足以允许这种购买“。

如果购买被接受(而不是被拒绝),据说这项指控是被授权的 。 消费者会拿他们的产品,销售点系统/收银机会注意到交易是被授权的。 然后,在一天结束时,或者在本周结束时,在其他一些预定的定期时间表,或者当所有者决定停止饮用时,商家将通过他们的所有授权收据,并向中央办公室发送另一个请求从授权交易中获取资金。 获取资金就是把钱存入商人的账户。

这仍然是大多数网关使用的模式,也是Magento Inc.select为其付款模块实施的域模型。

事情应该运行的方式是, 当消费者到达像Magento这样的系统中的最终结账步骤时,Magento向网关的API发出授权请求。 如果交易成功,则订单被接受到系统中,并且存储来自授权请求的唯一ID。 接下来,当消费者的货物发货时,店主使用Magentopipe理员创build发票 。 此发票的创build将发出一个捕获请求(使用从授权请求返回的商店ID)。 这是这些方法调用在Magento中发出的地方

然而,事情变得棘手,因为每个支付网关对这些概念的解释都有些不同,每个商家都会解释他们的“直到我们出货”的职责不同。 除了上述情况之外,支付模块还具有称为支付操作的系统configuration值。 这可以设置为仅授权 ,这将实现上述stream程。 它也可以被设置为授权和捕获 ,当订单被下达时,授权和捕获将授权和捕获付款。 它变得更加令人困惑,因为虽然这个方法被称为授权和捕获,但当前版本的Magento只会在这个模式下(至less对于Authorize.net)发出捕获请求,并且Authorize.net会在内部留下捕获请求在一天中的大部分时间都处于授权但未被捕获的状态。 Magento如何处理订单和付款以及发票是代码库中一个从版本到版本变化很大的领域。

所以,Magento支付模块系统背后的想法是将您从集群F —即编程支付网关逻辑中屏蔽掉。 在您的authorize方法中,您可以调用您的支付网关的授权API(或者执行您希望在此处发生的任何检查和逻辑)。 此方法传递一个付款对象和金额。 如果你让你请求/执行你的逻辑,并确定它无论如何都是无效的,你就会抛出Exception

 Mage::throwException('...'); 

这告诉Magento授权失败,并会相应地执行(显示错误消息等)。 否则,您在Payment对象上设置数据成员并发出一个

 return $this; 

数据成员是您在捕获付款时以后需要的东西。 这将我们带到了付款模块的capture方法。 这个方法也发送一个支付对象和一个金额。 在这个方法中,你发出你的捕获请求。 付款对象将有cc_trans_id数据成员

 $payment->getCcTransId() 

这将允许您针对您的网关发出捕获。 这是您负责保存authorize的数据成员之一。 同样,如果你的代码确定捕获失败了,你会抛出一个exception。 否则,您将return $this

authorize.net支付模块有很好的例子。

 app/code/core/Mage/Paygate/Model/Authorizenet.php 

例如,考虑capture方法的这一部分

 public function capture(Varien_Object $payment, $amount) { if ($payment->getCcTransId()) { $payment->setAnetTransType(self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE); } else { $payment->setAnetTransType(self::REQUEST_TYPE_AUTH_CAPTURE); } $payment->setAmount($amount); $request= $this->_buildRequest($payment); $result = $this->_postRequest($request); //... 

这里的捕获方法是检查付款是否有cc_trans_id 。 根据结果​​,它将anet_trans_type设置为:

 self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE self::REQUEST_TYPE_AUTH_CAPTURE 

这个值然后被API请求对象用来发送API调用

  1. 捕获预授权的交易
  2. 立即捕获

希望有所帮助,祝你好运!