How to get order id using "sales_order_place_after" event
sales_order_place_after: This event is dispatched after the order payment is placed.
$order = $observer->getEvent()->getOrder();
$incrementId = $order->getIncrementId();
sales_order_save_after: This event is called every time the order is saved. For eg. Order status changed, invoiced, shipped & credit memo.
$order = $observer->getEvent()->getOrder();
$orderId = $order->getId();
The event sales_order_place_after triggers after payment processed but before the order has been saved to database. Id will be available after order was successfully saved to database. So sales_order_place_after will not give you orderId though you will get order incremental id.
On the other hand, if you use sales_order_save_after, it will be triggered every time the order is saved.
If you like to get order id just after place an order using after plugin for Magento\Sales\Api\OrderManagementInterface::place will be the best option.
etc/di.xml
<?xml version="1.0" ?>
<config>
<type name="Magento\Sales\Api\OrderManagementInterface">
<plugin name="MyOrderPlaceAfterPlugin" type="My\Module\Plugin\Order\PlaceAfterPlugin" sortOrder="99" />
</type>
</config>
My\Module\Plugin\Order\PlaceAfterPlugin.php
//namespace My\Module\Plugin\Order;
class PlaceAfterPlugin {
/**
* @param \Magento\Sales\Api\OrderManagementInterface $orderManagementInterface
* @param \Magento\Sales\Model\Order\Interceptor $order
* @return $order
*/
public function afterPlace(\Magento\Sales\Api\OrderManagementInterface $orderManagementInterface , $order)
{
$orderId = $order->getId();
// do something with order object (Interceptor )
return $order;
}
}