我正在为Magento创建一个开源扩展。它处于非常早期的阶段。我正在努力解决取消订单问题。我在这里找到了一些解决方案
Magento - How can I run code when my order is canceled or refunded。
但是,每当我取消订单时,它既不会无效(仅在授权付款行动的情况下)也不会退款(如果是授权 - 捕获付款行为)。
当我使用捕获退款时,它说订单无法取消。
当我使用authorize-void时,它说订单已被取消。但是根本没有调用Void()函数。我在里面保留了一些Mage :: Log()函数。其中没有显示在日志文件中。
我不明白出了什么问题。
这是代码。 这是付款方式模型
<?php
class Package_Cashondelivery_Model_Createorder extends Mage_Payment_Model_Method_Abstract
{
protected $_code = 'cashondelivery';
protected $_canCapture = true;
protected $_canUseCheckout = true;
protected $_canFetchTransactionInfo = true;
protected $_isGateway = true;
protected $_canUseInternal = true;
protected $_canVoid = true;
protected $_canRefund = true;
public function validate()
{
$paymentInfo = $this->getInfoInstance();
if ($paymentInfo instanceof Mage_Sales_Model_Order_Payment) {
$postCode = $paymentInfo->getOrder()->getBillingAddress()->getPostcode();
}
else {
$postCode = $paymentInfo->getQuote()->getBillingAddress()->getPostcode();
}
$res=Api->validatePostCode($postCode);
$r = $res=='false'? FALSE : TRUE;
if (!$r) {
Mage::throwException($this->_getHelper()->__('Sorry ! Service is not available in your area'));
}
return $this;
}
public function authorize(Varien_Object $payment, $amount)
{
-------------------------------
-------------------------------
-------------------------------
#This is working fine
$transactionId = Api->someCall();
$payment->setTransactionId();
-------------------------------
-------------------------------
-------------------------------
-------------------------------
-------------------------------
-------------------------------
return $this;
}
public function void(Varien_Object $payment)
{
if (!$this->canVoid($payment)) {
Mage::throwException($this->_getHelper()->__('Void action is not available.'));
}
-------------------------------
-------------------------------
-------------------------------
-------------------------------
Mage::Log('Starting Void here....');
$transactionId = $Payment->getTransactionId();
Api->cancelOrder($transactionId);
return $this;
-------------------------------
-------------------------------
-------------------------------
}
}
?>
这是配置文件。
<?xml version="1.0"?>
<config>
<modules>
<Package_Cashondelivery>
<!-- declare module's version information for database updates -->
<version>0.1.0</version>
</Package_Cashondelivery>
</modules>
<global>
<!-- declare model group for new module -->
<models>
<!-- model group alias to be used in Mage::getModel('newmodule/...') -->
<cashondelivery>
<!-- base class name for the model group -->
<class>Package_Cashondelivery_Model</class>
</cashondelivery>
</models>
<helpers>
<cashondelivery>
<class>Package_Cashondelivery_Helper</class>
</cashondelivery>
</helpers>
<!-- declare resource setup for new module -->
<resources>
<!-- resource identifier -->
<cashondelivery_setup>
<!-- specify that this resource is a setup resource and used for upgrades -->
<setup>
<!-- which module to look for install/upgrade files in -->
<module>Package_Cashondelivery</module>
</setup>
<!-- specify database connection for this resource -->
<connection>
<!-- do not create new connection, use predefined core setup connection -->
<use>core_setup</use>
</connection>
</cashondelivery_setup>
<cashondelivery_write>
<connection>
<use>core_write</use>
</connection>
</cashondelivery_write>
<cashondelivery_read>
<connection>
<use>core_read</use>
</connection>
</cashondelivery_read>
</resources>
</global>
<!-- declare default configuration values for this module -->
<default>
<payment>
<cashondelivery>
<active>1</active>
<model>cashondelivery/createorder</model>
<order_status>Processing</order_status>
<payment_action>authorize</payment_action>
<title>Cash On Delivery</title>
<example_uri>services.example.com</example_uri>
</cashondelivery>
</payment>
</default>
</config>
任何人都知道为什么会这样,以及如何解决。
答案 0 :(得分:0)
可悲的是,我没有足够的“经验”来评论,所以我会将其作为答案发布。
您可以在取消前验证订单是否处于正确状态?例如,某些订单会自动处理,例如软件下载。信用卡收费和产品分发都可以自动完成,我怀疑它可以让你取消。您能否确认订单仍处于待处理状态?
答案 1 :(得分:0)
您应该只能'取消'或'无效'尚未捕获的订单。即没有相关发票的订单。
如果您想退款已捕获的订单,则应通过在发票上创建 creditmemo 来完成此操作。
对于您的付款方式无效功能未被调用的问题 - 您应该使用 X-Debug 设置 Netbeans 等IDE ,并在 Mage_Adminhtml_Sales_OrderController 中的 cancelAction 和 voidPaymentAction 函数的第一行添加一个断点。通过这种方式,您可以单步执行代码并查看问题所在。
例如, void 的路径应该是......
<强> Mage_Adminhtml_Sales_OrderController 强> - &GT;的 voidPaymentAction 强>:629
的 Mage_Sales_Model_Order_Payment 强> - &GT;的空隙强>:602
的 Mage_Sales_Model_Order_Payment 强> - &GT;的 _void 强>:1088
的 Package_Cashondelivery_Model_Createorder 强> - &GT;的空隙强>:
如果您不想使用正确的调试环境,那么,然后将您的日志语句放在该路径上,并检查所有条件是否有效,以调用您的付款方式的void函数。< / p>
答案 2 :(得分:0)
问题在于,当您按取消时,Magento确实不会调用Void或Refund。按void后,它会运行void方法,当您点击退款时,它会调用退款方式。猜猜看,当你按下取消时,它实际上会调用取消方法。
我同意,当你按下取消时,你实际上想要取消授权,但是如果你想要做其他事情,那么使用单独的方法会很方便。所以你可以这样做:
/*
* Your class stuff
*/
public function cancel(Varien_Object $payment){
// void the order if canceled
$this->void($payment);
return $this;
}
public function void(Varien_Object $payment){
/* Whatever you call to void a payment in your gateway */
}