2012-02-15 49 views
10

这是自从我开始为我的网上商店测试Magento后发现的最重要的问题之一。在付款确认前,清空购物车是很不必要的,也是有害的,因为不幸的是,Magento会这么做。在付款确认前停止Magento清空购物车?

如果用户无需支付的付款方式,由于某种原因,点击选择贝宝(网页标准)“回到XXXX”(在贝宝商户名称)支付宝付款页面上,贝宝将用户重定向回http://www.example.com/checkout/cart/,现在是EMPTY购物车。

我认为这应该是在付款确认/ PayPal IPN之后,购物车是空白的,而不是之前的任何一点。

即使用户想再次继续,他或她会因搜索并重新添加所有产品而感到不适,并且很可能会离开。

任何想法如何解决这个问题?

+3

嘿,你能否确认下面哪个解决方案适合你,因为它会帮助像我这样的其他人测试并获得解决方法。谢谢 – echoashu 2014-09-15 10:33:20

+1

@echoashu,尝试了所有这些,但没有为我工作。 – 2015-11-24 01:46:00

+0

@echoashu,对我来说也没有工作。我正在使用onepage结帐。 – 2016-08-11 07:11:50

回答

-1

你的问题是Mage_Checkout_OnepageController::saveOrderAction()的行为方式。

更具体:开放app/code/core/Mage/Checkout/controllers/OnepageController.php

$this->getOnepage()->getQuote()->save();//this makes the cart empty (sets the quote as converted to order) 
    if (isset($redirectUrl)) { 
     $result['redirect'] = $redirectUrl; 
    } 

    $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); 
} 

可以更换的最后一部分:

$this->getOnepage()->getQuote()->save();//.... 

有:

if (isset($redirectUrl)) { 
    $result['redirect'] = $redirectUrl; 
    $this->getOnepage()->getQuote()->setIsActive(1) ; 
} 
$this->getOnepage()->getQuote()->save(); 
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); 
+0

这是什么文件? – 2015-05-10 12:07:07

+0

@AryehArmon,我已插入此文件的路径。检查一次。 – 2016-07-27 10:29:46

6

这为我工作:

文件: ~/app/code/core/Mage/Checkout/controllers/OnepageController.php

替换此:

$this->getOnepage()->getQuote()->save(); 
/** 
* when there is redirect to third party, we don't want to save order yet. 
* we will save the order in return action. 
*/ 
if (isset($redirectUrl)) { 
    $result['redirect'] = $redirectUrl; 
} 
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); 

有了这一个:

/** 
* when there is redirect to third party, we don't want to save order yet. 
* we will save the order in return action. 
*/ 
if (isset($redirectUrl)) { 
    $result['redirect'] = $redirectUrl; 
    $this->getOnepage()->getQuote()->setIsActive(1) ; 
} 
$this->getOnepage()->getQuote()->save(); 
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); 
+0

核心文件不应该改变。你应该总是重写控制器。 – Sarvagya 2016-01-04 12:07:04

+0

我正在使用IWD onepage结帐。这段代码不适合我。 PLZ告诉如何做到这一点? – 2016-08-11 06:52:47

+0

请检查一次http://magento.stackexchange.com/questions/130941/cart-becomes-empty-when-cancel-the-transaction-in-onestep-checkout – 2016-08-11 07:10:30

4

贝宝我发现的应用程序/代码/芯内部的取消动作/法师/贝宝/控制器/ StandardController.php cancelAction

我改变了这样的代码取消动作

public function cancelAction() 
{ 
    $session = Mage::getSingleton('checkout/session'); 
    $cart = Mage::getSingleton('checkout/cart'); 
    $session->setQuoteId($session->getPaypalStandardQuoteId(true)); 
    if ($session->getLastRealOrderId()) { 
     $incrementId = $session->getLastRealOrderId(); 
     if (empty($incrementId)) { 
      $session->addError($this->__('Your payment failed, Please try again later')); 
      $this->_redirect('checkout/cart'); 
      return; 
     } 
     $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId()); 
     $session->getQuote()->setIsActive(false)->save(); 
     $session->clear(); 
     try { 
      $order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, true); 
      $order->cancel()->save(); 
     } catch (Mage_Core_Exception $e) { 
      Mage::logException($e); 
     } 
     $items = $order->getItemsCollection(); 
     foreach ($items as $item) { 
      try { 
       $cart->addOrderItem($item); 
      } catch (Mage_Core_Exception $e) { 
       $session->addError($this->__($e->getMessage())); 
       Mage::logException($e); 
       continue; 
      } 
     } 
     $cart->save(); 
     $session->addError($this->__('Your payment failed. Please try again later')); 
    } 
    $this->_redirect('checkout/cart'); 
} 

它对我来说非常好,而且没有必要为此改变任何其他地方。

它将当前订单标记为已取消,并使用该订单恢复购物车并将用户重新导向购物车。

+0

谢谢.. !!这是很好的解决方案.. – 2016-03-03 12:51:49

0

由于Magento的版本1.6.0.0(炬力2011)可以启用“永久购物车”

System > Configuration > Customers > Persistent Shopping Cart 

这应该解决这个问题。

使用这些设置,使其工作

Enable Persistence = Yes 
Persistence Lifetime (seconds) = 31536000 
Enable "Remember Me" = Yes 
"Remember Me" Default Value = Yes 
Clear Persistence on Log Out = No 
Persist Shopping Cart = Yes 

祝你好运:)

+0

但是这个购物车在结帐时也没有清空吗? (点击PAY并转到PSP页面) – 2015-12-19 14:35:21

0

/app/code/core/Mage/Checkout/controllers/OnepageController.php这个文件是实际控制文件,但在付款方式扩展取决于涨它就会与命名空间更改/ MODULENAME /结帐/控制器/ OnepageController.php

查找功能saveOrderAction()

发现这些线路

$this->getOnepage()->getQuote()->save(); 
     /** 
     * when there is redirect to third party, we don't want to save order yet. 
     * we will save the order in return action. 
     */ 
     if (isset($redirectUrl)) { 
      $result['redirect'] = $redirectUrl; 
     } 

     $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); 

评论这条线//$this->getOnepage()->getQuote()->save(); 并添加以下代码,如果条件中这样的情况会像..

//$this->getOnepage()->getQuote()->save(); 
     if (isset($redirectUrl)) { 
        $result['redirect'] = $redirectUrl; 
        $this->getOnepage()->getQuote()->setIsActive(1) ; 
       } 
     $this->getOnepage()->getQuote()->save(); 
     $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); 

这是我与第三方支付延期完成。