首页 文章

Magento付款流程

提问于
浏览
68

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

  • 用户来购物车和choses让我们说一些支付方式是网关 .

  • 系统拦截请求,收集所有提交的数据并将用户发送到网关URL .

  • 用户将他的订单(或取消)下放到网关站点,该站点将有关它的信息发送到我的商店 .

  • 我的商店使用收到的数据对订单进行了一些修改,并保存订单状态已完成或取消 .

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

1 回答

  • 147

    这是我一直理解这些概念的方式,以及在Magento中实施支付模块需要了解的内容 . 你特定的“这种情况发生在哪里”的答案在下面加粗,尽管它并不像你希望的那么简单 .

    互联网前,实体信用卡交易分为两个阶段 .

    在销售时,当商家拿走消费者的信用卡进行购买时,他们会通过销售点设备将其滑入信用卡的中心办公室并询问“该卡是否被授权用于该网络,并且这个特定消费者的可用信贷额度是否足以允许此次购买“ .

    如果购买被接受(而不是拒绝),则说该费用是经过授权的 . 消费者会拿走他们的产品,销售点系统/现金登记处会注意到交易是经过授权的 . 然后,在一天结束时,或一周结束时,在某个其他预定的常规时间表,或者当所有者决定停止饮酒时,商家将通过他们所有的授权收据并向中央办公室发送请求 . 从授权交易中获取资金 . 捕获资金是将钱存入商家账户的原因 .

    这仍然是大多数网关使用的模型,并且是Magento Inc.选择为其支付模块实施的域模型 .

    应该运行的方式是,在像Magento这样的系统中,Magento向网关's API. If the transaction is successful, the order is accepted into the system, and a unique ID from the authorization request is stored. Next, when the consumer'的货船发出授权请求,商店所有者 uses the Magento admin to create an invoice . 创建此发票会发出捕获请求(使用从授权请求返回的商店ID) . This is where these method calls are issued in Magento .

    然而,事情变得棘手,因为每个支付网关对这些概念的解释略有不同,每个商家都以不同的方式解释他们的责任 . 除了上述场景之外,支付模块还具有称为支付行为的系统配置值 . 这可以设置为仅授权,这将实现上述流程 . 它也可以设置为授权和捕获,它将在下订单时授权和捕获付款 . 它甚至变得令人困惑,因为虽然该方法称为Authorize and Capture,但当前版本的Magento只会在此模式下设置时发出捕获请求(至少对于Authorize.net),并且Authorize.net将在内部保留捕获请求在一天中的大部分时间内处于授权但未捕获状态 . Magento如何处理订单和付款以及发票是代码库中的一个区域,它在版本之间发生了很大变化 .

    因此,Magento支付模块系统背后的想法是保护您免受Cluster F ---编程支付网关逻辑的影响 . 在您的 authorize 方法中,无论出于何种原因,您实施了对您的支付网关's authorize API (or perform whatever checks and logic you want to happen at this point). This method is passed a payment object and an amount. If you make you request/perform-your-logic and determine it'无效的调用,您将抛出异常

    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调用

    • 捕获预授权交易

    • 立即捕获

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

相关问题