Magento付款流程


69

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

  1. 用户来到购物车并选择说一些网关的付款方式。
  2. 系统拦截请求,收集所有提交的数据,然后将用户发送到网关URL。
  3. 用户在网关站点下订单(或取消订单),该站点将有关订单的信息发送到我的商店。
  4. 我的商店使用接收到的数据对订单进行了更多修改,并保存了状态为已完成或已取消的订单。

在这些步骤中,我将在哪里使用授权和捕获方法?如果有人可以向我解释授权和捕获的含义,我将不胜感激。

Answers:


149

这是我一直了解这些概念的方式,以及在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调用

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

希望对您有所帮助,祝您好运!


4
谢谢您的这个哇,而且更像是它,现在对我而言,事情看起来更加清晰了。
zokibtmkd 2011年

2
谢谢艾伦。它解释了很多。
naquiuddin

2
非常感谢您的解释:)
nnevala 2012年

9
感谢您(非常感谢,除了您所有有用的博客文章之外)非常宝贵的回复:)
maff 2012年

这是我发现的关于Paymnet流的第一个很好的解释。非常感谢!
EmilVikström'15
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.