这是我一直了解这些概念的方式,以及在Magento中实现付款模块所需了解的内容。您的特定“发生位置”的答案在下面以粗体显示,尽管它并没有您期望的那么简单。
预互联网,实体信用卡交易是两个阶段的过程。
在销售时,商家将消费者的信用卡用于购买时,他们将其滑过销售点设备,该设备会打入信用卡的中央办公室并询问“此卡是否已为此网络授权,并且该特定消费者的可用信贷额度是否足够大以允许此次购买”。
如果接受了购买(而不是拒绝购买),则表示该笔费用已被授权。消费者将购买他们的产品,而销售点系统/收银机将记录该交易已被授权。然后,在一天的结束或一周中的某个预定的预定时间表结束时,或者在所有者决定停止饮酒时,商人将查看所有授权收据,并向中央办公室发送另一个请求以捕获从资金授权的交易。捕捉资金是将钱存入商人账户的原因。
这仍然是大多数网关使用的模型,也是Magento Inc.选择为其付款模块实施的域模型。
事情的运行方式是,当消费者在Magento之类的系统中到达最终结帐步骤时,Magento向网关的API发出授权请求。如果交易成功,则订单将被接受到系统中,并存储来自授权请求的唯一ID。接下来,当消费者的商品发货时,商店所有者使用Magento管理员创建发票。此发票的创建发出捕获请求(使用授权请求返回的商店ID)。 这是在Magento中发出这些方法调用的地方。
但是,事情变得棘手,因为每个支付网关对这些概念的解释都有些不同,并且每个商人对“在我们发货之前都不要捕获”责任的解释不同。除了上述方案外,支付模块还具有称为“支付操作”的系统配置值。可以将其设置为仅授权,它将实现上述流程。也可以将其设置为Authorize and Capture,这将在下订单时授权并捕获付款。它变得更多令人困惑的是,尽管该方法称为Authorize and Capture,但当前版本的Magento仅在以这种模式设置时(至少对于Authorize.net)才会发出捕获请求,而Authorize.net在内部将捕获请求保留在授权但在一天的大部分时间里都没有捕获状态。Magento如何处理订单,付款和发票是代码库的一个区域,在不同版本之间变化很大。
因此,Magento支付模块系统背后的想法是使您免受集群F-(即对支付网关逻辑进行编程)的困扰。在您的authorize
方法中,您实现对支付网关的授权API的调用(或执行您此时想要进行的任何检查和逻辑操作)。此方法传递了付款对象和金额。如果让您请求/执行逻辑并出于任何原因确定它无效,则抛出Exception与
Mage::throwException('...');
这告诉Magento授权失败,并且它将相应地执行操作(显示错误消息等)。否则,您可以在Payment对象上设置数据成员,然后发出
return $this;
数据成员是您以后捕获付款时需要的东西。这使我们进入了capture
您的“付款”模块的方法。还向该方法发送了付款对象和金额。使用这种方法,您可以发出捕获请求。付款对象将具有cc_trans_id
数据成员
$payment->getCcTransId()
这将使您可以对网关发出捕获。这是您负责保存在其中的数据成员之一authorize
。同样,如果您的代码确定捕获失败,则会引发异常。否则,您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的API调用
- 捕获预先授权的交易
- 立即捕获
希望对您有所帮助,祝您好运!