Hi everyone,
I'm having some issues creating and redirecting a user to a cart from an external catalogue.
I'm using an interactive catalogue (external website) where a client can add products to a temporary cart. When clicking checkout on this external catalogue, XML is posted to my controller (on my Magento 2.4.0 website).
- I'm able to grab the correct information from the XML
- I think that I'm able to build the cart (Debugging from getQuote(), I see my items correctly)
But when the user is redirected to the /checkout/cart page, the cart is empty.
My guess is that I'm building the cart in a different session ID?
During debugging, I rewrote almost all my code to use a solution proposed in
another post , and tweaked it to my needs and some errors I was getting.
Here is my code :
<?php /** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Mycompany\MyModule\Controller\Checkout; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\Data\Form\FormKey; use Magento\Checkout\Model\Cart; use Magento\Catalog\Model\Product; use Magento\Framework\App\CsrfAwareActionInterface; use Magento\Framework\App\RequestInterface; use Magento\Framework\App\Request\InvalidRequestException; use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Framework\Controller\ResultFactory; use Magento\Framework\Controller\Result\RedirectFactory; class View extends \Magento\Framework\App\Action\Action implements CsrfAwareActionInterface{ /** * @var \Magento\Checkout\Model\Cart */ protected $cart; /** * @var \Magento\Catalog\Model\Product */ protected $product; /** * @var \Magento\Framework\Controller\ResultFactory; */ protected $resultFactory; /** * @var \Magento\Framework\Controller\Result\ResultFactory; */ protected $resultRedirectFactory; public function createCsrfValidationException(RequestInterface $request): ?InvalidRequestException { return null; } public function validateForCsrf(RequestInterface $request): ?bool { return true; } public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\View\Result\PageFactory $resultPageFactory, \Magento\Framework\Controller\Result\Redirect $resultRedirectFactory, \Magento\Framework\Controller\ResultFactory $resultFactory, \Magento\Catalog\Model\Product $product, \Magento\Checkout\Model\Cart $cart ) { $this->resultFactory = $resultFactory; $this->resultPageFactory = $resultPageFactory; $this->resultRedirectFactory = $resultRedirectFactory; $this->cart = $cart; $this->product = $product; parent::__construct($context); } public function execute() { $rawdata = file_get_contents("php://input"); $new = simplexml_load_string($rawdata); $con = json_encode($new); $newArr = json_decode($con, true); //Build the cart $cartitems = []; foreach($new->lineitems->item as $item){ $product = []; $product[] = $item->qty; $product[] = $item->sku; $cartitems[] = $product; } try { foreach($cartitems as $citem){ $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $productId = $objectManager->get('Magento\Catalog\Model\Product')->getIdBySku($citem[1]); $qty = $citem[0]; $id = $citem[1]; $params = array(); $params['qty'] = $qty; $_product = $this->product->load($productId); if ($_product) { $this->cart->addProduct($_product, $params); $this->cart->save(); } } $this->messageManager->addSuccess(__('Add to cart successfully.')); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addException( $e, __('%1', $e->getMessage()) ); } catch (\Exception $e) { $this->messageManager->addException($e, __('error.')); } // START DEBUG // Check what is in the cart $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $cart = $objectManager->get('\Magento\Checkout\Model\Cart'); // get quote items collection $itemsCollection = $cart->getQuote()->getItemsCollection(); // get array of all items what can be display directly $itemsVisible = $cart->getQuote()->getAllVisibleItems(); // get quote items array $items = $cart->getQuote()->getAllItems(); foreach($items as $item) { echo 'ID: '.$item->getProductId().'<br />'; echo 'Name: '.$item->getName().'<br />'; echo 'Sku: '.$item->getSku().'<br />'; echo 'Quantity: '.$item->getQty().'<br />'; echo 'Price: '.$item->getPrice().'<br />'; echo "<br />"; } // END DEBUG header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); $carturl = 'https://'.$_SERVER['SERVER_NAME'].'/checkout/cart/'; header("Location: ".$carturl, true, 301); echo $carturl; exit; } }
I tried various redirection methods, but with the catalogue solution I'm using I need to output the cart URL in the browser in order to redirect correctly. Hence the echo $carturl;
Any help would be greatly appreciated Thank you!
I have exactly the same problem. Anyone got a suggestion? This is quiet a common issue
I'm having the same problem as the others. I am also encountering this issue.myaccountaccess Dont know why its hapenning. pleased to see your issue as I think I have the same problem I am also confused and in need of light on this same issue. Need help.
Hi everyone,
I'm having some issues creating and redirecting a user to a cart from an external catalogue.
I'm using an interactive catalogue (external website) where a client can add products to a temporary cart. When clicking checkout on this external catalogue, XML is posted to my controller (on my Magento 2.4.0 website) myaccountaccess
- I'm able to grab the correct information from the XML
- I think that I'm able to build the cart (Debugging from getQuote(), I see my items correctly)
I am facing this same issue since a few days when i try to Add a product to cart from an external website. Did anyone find a valid solution to this issue?. Please let me know this seems so frsutrating. https://my-estub.win/
@Anonymous wrote:Hi everyone,
I'm having some issues creating and redirecting a user to a cart from an external catalogue.
I'm using an interactive catalogue (external website) where a client can add products to a temporary cart. When clicking checkout on this external catalogue, XML is posted to my controller (on my Magento 2.4.0 website).
- I'm able to grab the correct information from the XML
- I think that I'm able to build the cart (Debugging from getQuote(), I see my items correctly) Upsers
But when the user is redirected to the /checkout/cart page, the cart is empty.
My guess is that I'm building the cart in a different session ID?
During debugging, I rewrote almost all my code to use a solution proposed in
another post , and tweaked it to my needs and some errors I was getting.
Here is my code :
<?php /** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Mycompany\MyModule\Controller\Checkout; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\Data\Form\FormKey; use Magento\Checkout\Model\Cart; use Magento\Catalog\Model\Product; use Magento\Framework\App\CsrfAwareActionInterface; use Magento\Framework\App\RequestInterface; use Magento\Framework\App\Request\InvalidRequestException; use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Framework\Controller\ResultFactory; use Magento\Framework\Controller\Result\RedirectFactory; class View extends \Magento\Framework\App\Action\Action implements CsrfAwareActionInterface{ /** * @var \Magento\Checkout\Model\Cart */ protected $cart; /** * @var \Magento\Catalog\Model\Product */ protected $product; /** * @var \Magento\Framework\Controller\ResultFactory; */ protected $resultFactory; /** * @var \Magento\Framework\Controller\Result\ResultFactory; */ protected $resultRedirectFactory; public function createCsrfValidationException(RequestInterface $request): ?InvalidRequestException { return null; } public function validateForCsrf(RequestInterface $request): ?bool { return true; } public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\View\Result\PageFactory $resultPageFactory, \Magento\Framework\Controller\Result\Redirect $resultRedirectFactory, \Magento\Framework\Controller\ResultFactory $resultFactory, \Magento\Catalog\Model\Product $product, \Magento\Checkout\Model\Cart $cart ) { $this->resultFactory = $resultFactory; $this->resultPageFactory = $resultPageFactory; $this->resultRedirectFactory = $resultRedirectFactory; $this->cart = $cart; $this->product = $product; parent::__construct($context); } public function execute() { $rawdata = file_get_contents("php://input"); $new = simplexml_load_string($rawdata); $con = json_encode($new); $newArr = json_decode($con, true); //Build the cart $cartitems = []; foreach($new->lineitems->item as $item){ $product = []; $product[] = $item->qty; $product[] = $item->sku; $cartitems[] = $product; } try { foreach($cartitems as $citem){ $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $productId = $objectManager->get('Magento\Catalog\Model\Product')->getIdBySku($citem[1]); $qty = $citem[0]; $id = $citem[1]; $params = array(); $params['qty'] = $qty; $_product = $this->product->load($productId); if ($_product) { $this->cart->addProduct($_product, $params); $this->cart->save(); } } $this->messageManager->addSuccess(__('Add to cart successfully.')); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addException( $e, __('%1', $e->getMessage()) ); } catch (\Exception $e) { $this->messageManager->addException($e, __('error.')); } // START DEBUG // Check what is in the cart $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $cart = $objectManager->get('\Magento\Checkout\Model\Cart'); // get quote items collection $itemsCollection = $cart->getQuote()->getItemsCollection(); // get array of all items what can be display directly $itemsVisible = $cart->getQuote()->getAllVisibleItems(); // get quote items array $items = $cart->getQuote()->getAllItems(); foreach($items as $item) { echo 'ID: '.$item->getProductId().'<br />'; echo 'Name: '.$item->getName().'<br />'; echo 'Sku: '.$item->getSku().'<br />'; echo 'Quantity: '.$item->getQty().'<br />'; echo 'Price: '.$item->getPrice().'<br />'; echo "<br />"; } // END DEBUG header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); $carturl = 'https://'.$_SERVER['SERVER_NAME'].'/checkout/cart/'; header("Location: ".$carturl, true, 301); echo $carturl; exit; } }
I tried various redirection methods, but with the catalogue solution I'm using I need to output the cart URL in the browser in order to redirect correctly. Hence the echo $carturl;
Any help would be greatly appreciated Thank you!
I built something like that as a custom plugin for a client a few months ago based on this guys post: https://community.magento.com/t5/Magento-2-x-Programming/Adding-a-product-to-the-cart-from-an-external-site-on-Magento-2/td-p/103066
- Create beforeExcuste plugin in checkout_cart_index, after file_get_contents() and add product to cart magento