Подтвердить что ты не робот

Остановить Magento от опорожнения корзины покупок до подтверждения оплаты?

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

Если пользователь выбирает PayPal (стандарт веб-сайта) для способа оплаты и по какой-либо причине нажимает "Вернуться к xxxx" (ваше фирменное наименование в PayPal) на странице оплаты PayPal без оплаты, PayPal перенаправит пользователь возвращается к http://www.example.com/checkout/cart/, который теперь является ПУСТОЙ тележкой.

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

Даже если пользователь хочет продолжить снова, он или она будет раздражаться от поиска и добавления всех продуктов снова и, вероятно, просто уйдет.

Любая идея, как я могу обойти это?

4b9b3361

Ответ 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));