我遇到了Magento 1.9和PayPal付款方式的问题。 当客户使用PayPal付款并且有付款审核时,在这种情况下订单状态的订单将被设置为"付款审核"这是正确的。
然而,问题是,在付款实际失败的情况下(即客户账户中的资金不足),Magento将订单状态更新为" Processing" &安培;客户最终获得免费商品。
我需要做的是,当这样的"失败"调用IPN我需要设置"已关闭"该特定订单的状态。我花了4个多小时才找到解决方案,但没有找到任何合适的解决方案。
如果有人对此有任何疑问,请与我分享。
PayPal IPN响应变量:
[payer_email] => xxx@xxx.com
[payer_id] => xxxxxxxxxxxx
[payer_status] => unverified
[payment_date] => 14:33:46 Jun 08, 2015 PDT
[payment_gross] => 43.24
[payment_status] => Failed
[payment_type] => echeck
[protection_eligibility] => Ineligible
提前致谢。
答案 0 :(得分:4)
我们遇到了同样的问题并找到了它的根本原因。它似乎是Magento Bug Tracker的一个悬而未决的问题。
请参阅https://www.magentocommerce.com/bug-tracking/issue/index/id/1041
您可以通过重写Ipn模型来修复它,如下所示:
<?php
/**
* Rewrite the core fix an issue with IPN notifications of "failed" payments
*/
class Magento_CoreFixes_Model_Paypal_Ipn extends Mage_Paypal_Model_Ipn
{
/**
* @see https://www.magentocommerce.com/bug-tracking/issue/index/id/1041
*/
protected function _registerPaymentFailure()
{
$this->_importPaymentInformation();
// This is the fix allowing order to get the cancelled status
foreach ($this->_order->getInvoiceCollection() as $invoice){
$invoice->cancel()->save();
}
$this->_order
->registerCancellation($this->_createIpnComment(''), false)
->save();
}
}
希望它有所帮助!
答案 1 :(得分:0)
Pierre MARTIN's answer让我直接找到了这个问题的根源,并且解决了这个问题。
我把这个修复程序包装到一个可以轻松安装到任何商店的模块中。您可以找到the source and installation instructions on GitHub
这是因为,如果订单有未开发票,则对registerCancellation()
的调用会引发异常。异常意味着状态永远不会改变,默认为“处理”。