Остановить Magento от опорожнения корзины покупок до подтверждения оплаты?
Это одна из самых важных проблем, которые я нашел с тех пор, как начал тестировать Magento для своего интернет-магазина. Это как-то неинтересно, что абсолютно ненужно и вредно для продаж пустая корзина до подтверждения оплаты, к сожалению, Magento делает.
Если пользователь выбирает PayPal (стандарт веб-сайта) для способа оплаты и по какой-либо причине нажимает "Вернуться к xxxx" (ваше фирменное наименование в PayPal) на странице оплаты PayPal без оплаты, PayPal перенаправит пользователь возвращается к http://www.example.com/checkout/cart/, который теперь является ПУСТОЙ тележкой.
Я думаю, должно быть после подтверждения платежа/IP-адреса PayPal, что тележка будет пустой, вместо любой точки до этого.
Даже если пользователь хочет продолжить снова, он или она будет раздражаться от поиска и добавления всех продуктов снова и, вероятно, просто уйдет.
Любая идея, как я могу обойти это?
Ответы
Ответ 1
Это сработало для меня:
Файл: ~/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));
Ответ 2
Для Paypal я обнаружил действие отмены внутри приложения/кода/ядра/Mage/Paypal/controllers/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');
}
Это сработало неплохо для меня, и нет необходимости менять какое-либо другое место для этого.
Он отмечает текущий заказ как Отмененный и восстанавливает корзину с использованием этого заказа и снова перенаправляет пользователя в корзину.
Ответ 3
Начиная с версии Magento 1.6.0.0 (juli 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
Удачи:)
Ответ 4
/app/code/core/Mage/Checkout/controllers/OnepageController.php этот файл является фактическим файлом контроллера, но зависит от расширений метода оплаты, который он изменит с помощью Namespace/Modulename/Checkout/controllers/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();
и добавьте ниже коды внутри условия if, чтобы условие выглядело как.
//$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));
Это я сделал с сторонним Платежным расширением.
Ответ 5
Ваша проблема связана с тем, как ведет себя Mage_Checkout_OnepageController::saveOrderAction()
.
Более конкретно: open 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));