Остановить Magento для очистки корзины до подтверждения оплаты? - PullRequest
11 голосов
/ 15 февраля 2012

Это одна из самых важных проблем, которые я обнаружил с тех пор, как начал тестировать Magento для своего интернет-магазина.Это довольно просто: совершенно необязательно и вредно для продажи пустой корзины до подтверждения оплаты , что, к сожалению, делает Magento.

Если пользователь выбирает PayPal (стандарт веб-сайта) дляспособ оплаты и по какой-то причине нажимает «Вернуться к хххх» (название вашей компании в PayPal) на странице оплаты PayPal без оплаты , PayPal перенаправляет пользователя обратно на http://www.example.com/checkout/cart/,, который теперь являетсяПустая корзина.

Я думаю, что после подтверждения оплаты / IPN PayPal корзина должна быть пуста, а не до этого.

Даже если пользователь захочет продолжить, он или онаЯ был бы раздражен поиском и добавлением всех продуктов снова и, скорее всего, просто ушел бы.

Есть идеи, как мне обойти это?

Ответы [ 5 ]

6 голосов
/ 03 октября 2013

Это сработало для меня:

Файл: ~/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));
4 голосов
/ 15 мая 2014

Для Paypal я обнаружил действие отмены в приложении / code / core / 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');
}

Это сработало очень хорошо для меня, и нет необходимости менять другое место для этого.

Помечает текущий заказ как Отмененный, восстанавливает корзину с использованием этого заказа и перенаправляет пользователя в корзину снова.

0 голосов
/ 16 февраля 2016

/ 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));

Это я сделал со сторонним расширением Payment.

0 голосов
/ 04 марта 2015

Начиная с версии 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 голосов
/ 19 октября 2012

Ваша проблема связана с поведением 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));
...