Magento 自定义支付网关未触发“授权”或“捕获”方法

Posted

技术标签:

【中文标题】Magento 自定义支付网关未触发“授权”或“捕获”方法【英文标题】:Magento Custom Payment Gateway not firing 'authorize' or 'capture' methods 【发布时间】:2012-06-05 00:43:41 【问题描述】:

所以,万岁 - 我正在尝试创建一个新的自定义支付网关。它旨在通过第三方 API 进行身份验证/捕获,但不需要重定向到第三方站点。

据我了解,当在 Magento 中下订单/完成订单,并且网关设置为“授权和捕获”时,它应该从网关模型中触发“捕获”方法。目前,它没有这样做。

当然,如果我专门从 Admin Order 视图捕获,它会尝试捕获,但这需要在结帐时立即发生(同样,我的理解是它已经应该这样做了)。

在我的网关模型中,我有以下内容(为了便于阅读而被截断):

<?php
class Example_Gateway_Model_Payment extends Mage_Payment_Model_Method_Cc

    protected $_code = 'example';

    protected $_isGateway = true;
    protected $_canAuthorize = true;
    protected $_canCapture = true;
    protected $_canUseInternal = true;
    protected $_canUseCheckout = true;

    // This is an empty block class that extends Mage_Payment_Block_Form_Cc
    protected $_formBlockType = 'example/form_example';

    public function authorize(Varien_Object $payment, $amount)
    
        Mage::log('Authorizing!');
    

    public function capture(Varien_Object $payment, $amount)
    
        Mage::log('** Capturing **');
        // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc.
    

    public function assignData($data)
    
        Mage::log('Assigning Data');
    

这个支付模型本身确实有效——我得到assignData()validate() 的日志输出,如果我添加它,还有__construct()。但无论我做什么,实际下订单时捕获或授权方法都不会触发。

我的 config.xml 有点像这样:

<?xml version="1.0"?>
<config>
    <modules>
        <Example_Gateway>
            <version>0.0.5</version>
        </Example_Gateway>
    </modules>
    <global>
        <blocks>
            <gateway>
                <class>Example_Gateway_Block</class>
            </gateway>
        </blocks>
        <models>
            <gateway>
                <class>Example_Gateway_Model</class>
            </gateway>
        </models>
        <helpers>
            <gateway>
                <class>Example_Gateway_Helper</class>
            </gateway>
        </helpers>
    </global>
    <frontend>
      <!-- Snip.. Nothing special here -->
    </frontend>
    <default>
        <payment>
            <gateway>
                <sort_order>0</sort_order>
                <model>gateway/payment</model>
                <enabled>1</enabled>
                <order_staus>processing</order_status>
                <payment_action>authorize_capture</payment_action>
                <cctypes>VI,MC,AE,DI</cctypes>
                <useccv>1</useccv>
            </gateway>
        </payment>
    </default>
</config>

我认为不需要资源模型,因为我不需要任何额外的表;我的期望是它会简单地使用sales_flat_order_payment 和相关表来存储任何网关相关/提供的数据(txn id 等)

同样,我只是扩展了默认的 CC 块以获得标准的付款表单。

我错过了什么?它必须是我忽略的小而简单的东西。

提前致谢!


更新: 到目前为止,我已经实现了一个解决方法,它使用一个观察者来手动调用 capture() 方法的 checkout_type_onepage_save_order 事件 - 但我很确定这不是正确的方法。

如果网关设置为 authorize_capture,我认为 Magento 应该在初始订单保存时自动调用 capture() 并没有错,对吧..?

【问题讨论】:

您能否添加日志记录以查看是否以及何时为其他支付网关调用 authorize()capture() 您是否尝试过将帮助程序类从 Example_Gateway_Model 更改为 Example_Gateway_Helper,而不是在您的 config.xml 中?另外,您的system.xml 是什么样的,您是否安装了任何第 3 方结帐模块? Magento 版本也可能有所帮助。 @B00MER - 抱歉,打错了;在我的实际代码中,它是正确的Helper。这是一个 Enterprise 1.11 实例。未安装 3rd Party Checkout 模块。我将发布我的 system.xml,但我无法想象这会对任何事情产生太多影响。 能够单步执行 IDE 中的代码将有助于确定 Magento 在何处决定不在您的类上调用 authorize() 或 capture()。在 saveOrders 方法中设置断点并从那里逐步执行。 【参考方案1】:

嗯,我使用了一个观察者来手动调用捕获方法。 不是最优雅的解决方案,但效果很好。

【讨论】:

【参考方案2】:

解决了!你需要这个:

protected $_isInitializeNeeded      = false;

我不知道为什么这是必要的,但在这一点上,我已经放弃尝试找出 magento 的原因,转而支持实际完成工作。我遇到了和你完全相同的问题,当我通过源代码跟踪它时,我发现当 isInitializeNeeded 返回 true 时,Payment.php 没有调用 _authorize。所以,在你的模型中坚持这条线,它就会起作用。

【讨论】:

我遇到了同样的问题,将其更改为 false 触发了我的方法,它有效。 @Benubird,我正在搜索这个,所以我在这里找到了答案Magento Payment Model Wrapup【参考方案3】:

我认为方法应该是:“authorize_capture”,而不是配置中所述的“capture”

<payment_action>authorize_capture</payment_action>

这样:

public function authorize_capture(Varien_Object $payment, $amount)

    Mage::log('** Capturing **');
    // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc.

我有一个类似的问题,即“authorize”方法根本没有被触发,因为“authorize_action”是空的。我能够通过在方法本身中对其进行硬编码来解决这个问题。调用“getConfigPaymentAction”获取授权方法。

public function getConfigPaymentAction() 
    return 'authorize';
 

【讨论】:

以上是关于Magento 自定义支付网关未触发“授权”或“捕获”方法的主要内容,如果未能解决你的问题,请参考以下文章

为特定产品启用支付网关 - Magento 2

Magento - 自动重定向到配置的支付网关之一

Magento:使用 Authorize.net 网关检索付款信息

magento 自定义付款方式表单未显示

万事达支付网关 checkout.js 方法未触发完整的回调函数

使用 Magento 中的 EBS 支付网关进行定期支付(EMI)