I am trying to add items to my cart by using the magento 2 Rest API.
Is it possible to get the Customer token by using the customer session?
I have looked into this and tried to implement a mix of a few ways to get the results i require.
public function getCustomerToken(){
$result = "null";
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');
if($customerSession->isLoggedIn()) {
$customerToken = $this->tokenModelFactory->create();
$tokenKey = $customerToken->createCustomerToken($customerSession->getCustomer()->getId())->getToken();
$result = $tokenKey;
}
else{
$result = "null";
}
return $result;
}
This is what i have so far. This is currently throwing an error
Undefined property: Vendor\Module\Block\Index\Index::$tokenModelFactory
To add the items to the cart I need 3 things, the product sku, the quantity and the QuoteID.
to get the quote ID, i must create a cart for the user and to do this i need the customers token.
This is the article I have been learning from:
http://devdocs.magento.com/guides/v2.1/get-started/order-tutorial/order-create-quote.html
Is it possible to do what i am trying to?
Thanks
Best Answer
From my own experiences, I could only seem to get the customer token using this -
http://devdocs.magento.com/guides/v2.1/get-started/order-tutorial/order-create-customer.html#get-token
This passes over the users email and password to get it, which isn't ideal.
I tried using the "/mine" and "/me" endpoint as well, but after Magento 2.1.7 or so, this no longer works.
I have achieved something similar to you though by using the customer email address to get their customer ID, and from this you can add items to their cart using -
This gives back a cart ID (quote ID) that can be used.
This method uses an admin bearer token in the request, which lets you add items to a customers / guest carts.
Edited in example -
The headers for these requests would look like -
Obviously with the generated admin bearer token.
Do a GET to
/rest/V1/customers/search
Use the params to fill in the customer you're trying to finds email address (i'm using Postman here to test) -
Making the endpoint -
/rest/V1/customers/search?searchCriteria[filter_groups][1][filters][0][field]=email&searchCriteria[filter_groups][1][filters][0][value]=email@address.com&searchCriteria[filter_groups][1][filters][0][condition_type]=eq
This will return information about the customer, including the customer ID -
You can also filter the response down to only get the email address (http://devdocs.magento.com/guides/v2.1/howdoi/webapi/search-criteria.html) but i'll skip that for now.
Now that you have the customer ID, you can start to populate their cart.
POST to
/rest/V1/customers/{customerID}/carts
The response here will be used as the quote ID. For this example I will use "62" as the quote ID.
Now if you do a GET to
rest/V1/carts/62
You will be able to see what parts still need filled in (product, shipping, billing, payment etc).
You can pretty much use this guide - http://devdocs.magento.com/guides/v2.1/get-started/order-tutorial/order-add-items.html to complete the order. Instead of using the /carts/mine endpoint, you'd replace /mine with the quote ID from earlier.
If you want me to finish the example fully, let me know.