所以,霍瑞 - 我正在尝试创建一个新的自定义支付网关。它旨在通过第三方API进行身份验证/捕获,但不需要重定向到第三方网站。
根据我的理解,当在Magento中下达/最终确定订单并且网关设置为“授权和捕获”时,它应该从网关模型中触发“捕获”方法。目前,它没有这样做。
当然,如果我从管理订单视图中专门捕获,它会尝试捕获,但这需要在结账时立即发生(同样,我的理解是它已经应该)。
在我的网关模型中,我有以下内容(为了便于阅读而被截断):
<?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事件 - 但我很确定这不是正确的方法。
我认为Magento应该在初始订单保存时自动调用capture()
我没有错,如果网关设置为authorize_capture,那么......?
答案 0 :(得分:3)
解决!你需要这个:
protected $_isInitializeNeeded = false;
我没有想法为什么这是必要的,但在这一点上,我已经放弃了试图找出magento为什么支持实际完成任务。我和你有完全相同的问题,当我通过源代码跟踪它时,我发现当isInitializeNeeded返回true时,Payment.php没有调用_authorize。所以,在你的模型中坚持这一行,它会起作用。
答案 1 :(得分:2)
我认为该方法应该是:“authorize_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_action”为空,因此根本没有触发“authorize”方法。我能够通过在方法本身中对其进行硬编码来解决这个问题。调用“getConfigPaymentAction”来获取授权方法。
public function getConfigPaymentAction() {
return 'authorize';
}
答案 2 :(得分:0)
好吧,我用一个观察者手动调用捕获方法 不是最优雅的解决方案,但它运作良好。