Magento 2 - Cart empty after successful payment
-
28-02-2021 - |
Question
I have a custom payment method, after successful payment; payment page return to a controller where it updates order status and truncate current cart items like this:
$this->quote->load($orders->getQuoteId());
$this->quote->setReservedOrderId(null);
$this->quote->setIsActive(true);
$this->quote->removePayment();
$this->quote->save();
$this->cart->truncate();
$this->cart->saveQuote();
Where $this->quote
is object of Magento\Quote\Model\Quote
and $this->cart
is object of Magento\Checkout\Model\Cart
The cart is truncating properly, but the cart summery count is still appearing on header, and when I go to view cart, it is showing empty cart with previous order total, as shown in image below
My question is, how can I fully empty my cart data after successful payment?
Solution
You may try to use checkout session Model to clear quote data (i.e Magento\Checkout\Model\Session.php ).
Update your payment module controller code as follow.
I assume your custom payment module controller file name is MypaymentController.php
classs MypaymentController extends \Magento\Framework\App\Action\Action
{
/**
* @var \Magento\Checkout\Model\Session
*/
private $checkoutSession;
public function __construct(
........................
........................
SessionManagerInterface $checkoutSession,
........................
........................
){
........................
$this->checkoutSession = $checkoutSession;
........................
}
public function execute()
{
........................
$this->_checkoutSession->clearQuote();
$this->_checkoutSession->clearStorage();
$this->_checkoutSession->restoreQuote();
........................
}
}
** Note:**
If your payment module controller already injected the Checkout Session Model (i.e \Magento\Checkout\Model\Session) then do not reinject Session Model, just try to use the functions below in your controller code block.
$this->_checkoutSession->clearQuote();
$this->_checkoutSession->clearStorage();
$this->_checkoutSession->restoreQuote();
OTHER TIPS
You need to do following things.
- create
sections.xml
at the following location with the code.
app\code\Vendor\Extension\etc\frontend\sections.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
<action name="module/controller/action">
<section name="cart"/>
<section name="checkout-data"/>
</action>
</config>
NOTE : replace module/controller/action
with your above controller action path.
Try with Delete() method to delete a quote
$quote = $this->_customerSession->getCustomer()->getQuote()->getCollection();
$quote->delete();