I am making REST API calls to magento website for order placement. Below is the sequence of my calls.
- Create a cart
rest/V1/guest-carts/
- Get the cart
rest/V1/guest-carts/bae0af147b83f1561f66cc4e3c97916e
- Add products to cart
rest/V1/guest-carts/24/items
- Add billing information, set payment method and place order
rest/V1/guest-carts/24/payment-information
In this sequence the order is getting the placed with order status "pending". I am wondering how the payment is captured through api if any payment gateway(Ex. PayPal) is involved to process payment and generate invoice.
Is there any api missing in the above flow for capturing payments.
Best Answer
I have used a fresh installation for the following using Magento2 CE 2.2.0-dev, and left the default "Luma" theme as well.
Concerning external payment methods (gateways) such as MiGS, Braintree, PayPal, and others, Magento supports these gateways out of the box but provides NO APIs for them that you can use along with other "Checkout" APIs.
So, if you are planning to build a checkout app/page using Magento's APIs, you will need to manually integrate with these services using their SDK/API, fortunately, you can learn a lot by checking how Magento integrates with these services in the built-in integrations.
To understand this, i had to configure Braintree since it is the easiest:
Upon adding a product to the cart and proceeding to checkout, in the last step, choose the Braintree payment method, then after clicking the "Place Order" button, you will notice the following AJAX requests:
guest-carts/cartId/payment-information
with the usual body as explained in Magento's API documentation.After that the process continues as expected with redirection to success page when the last request responds in JSON containing the order
entity_id
This confirms that calls to external services -Braintree in our example- is performed by the checkout page NOT by Magento internally, so we will need to do the same if we are to develop our own checkout page/app.
As for controlling the order status, i dug deeper and found out that using payment methods like MiGS, Braintree, or PayPal, resulted in an order with status
processing
instead of the usualpending
, i suspected that this is either a payment-method configuration or an observer, but it appeared to be a configuration, here are more details.Class: Magento\Sales\Model\Order\Payment
Method: Place()
There is a conditional that checks if
Initialization
is required for the methodif ($methodInstance->isInitializeNeeded())
, if that's the case, a methodinitialize()
is executed which you define, and allows you to specify bothstate
andstatus
.