Is there a way to detect orders that are placed via API? I want to add to those orders a different order number prefix.
I have already created an observer that is changing the prefix based on payment method of the order and I want to extend it to change the prefix based on order placed on web or API.
Event for observer now is sales_order_place_after
I have an observer that is doing that and I want to fix it in observer but what I need to take into consideration are the prefix for:
- web orders paid by card
- web orders with bank transfer
- API orders paid by card
- API orders with bank transfer
Basically I need 4 types of prefix.
Because of this, the functionality that I need now is a way to detect when an order comes from API vs orders that comes from web
Can someone please help me?
2 Answers 2
To identify the order placed on website or via API, you can check the HTTP Origin of the request (HTTP_ORIGIN). If the order placing on the website, the HTTP Origin will return the website base URL, otherwise, it will return an empty string.
Implementation of the Observer class:
<?php
namespace Vendor\Module\Observer;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class ChangeOrderPrefix implements ObserverInterface
{
/**
* @var RequestInterface
*/
private $request;
public function __construct(RequestInterface $request)
{
$this->request = $request;
}
/**
* Change the order prefix based on ...
*
* @param Observer $observer
* @return $this
*/
public function execute(Observer $observer)
{
/** @var \Magento\Sales\Model\Order $order */
$order = $observer->getEvent()->getOrder();
// If HTTP_ORIGIN has value that means the order placed on website
if ($this->request->getServer('HTTP_ORIGIN')) {
// Code for the order placed on website
} else {
// Code for the order placed via API
}
// Your customize code goes here
return $this;
}
}
I think their is no way to check if order was placed via API or browser by using Magento Events sales_order_place_after because by Default on browser the javascript also place order via API payment-information
- In this case i think you has to implement a javascript code which adding an additional information to payment-info on the browser which this information allow you tracking which order was placed on Browser.
A hit for you: Adding a hook to place-order-hooks.js which allow you update the payload before submit to server.