Many thanks to Mohit Patel for his advice and setting me off in the right direction. I ended up getting it to work like this:
registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Vendor_Module',
__DIR__
);
etc/extension_attributes.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
<attribute code="finance_application_no" type="string" />
<attribute code="finance_deposit" type="int" />
<attribute code="finance_amount" type="int" />
</extension_attributes>
</config>
etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Vendor_Module" setup_version="1.0.0"></module>
</config>
webapi_rest/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Sales\Api\OrderRepositoryInterface">
<plugin name="orderInformationUpdate" type="Vendor\Module\Plugin\Api\OrderRepository" />
</type>
</config>
Plugin/Api/OrderRepository.php
<?php
namespace Vendor\Module\Plugin\api;
use Magento\Sales\Api\Data\OrderExtensionFactory;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Api\Data\OrderSearchResultInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
class OrderRepository
{
const FINANCE_DEPOSIT = 'finance_deposit';
const FINANCE_AMOUNT = 'finance_amount';
const FINANCE_APPLICATION_NO = 'finance_application_no';
/**
* Order Extension Attributes Factory
*
* @var OrderExtensionFactory
*/
protected $extensionFactory;
/**
* OrderRepositoryPlugin constructor
*
* @param OrderExtensionFactory $extensionFactory
*/
public function __construct(OrderExtensionFactory $extensionFactory)
{
$this->extensionFactory = $extensionFactory;
}
/**
* Add "finance_deposit", "finance_amount" and "finance_application_no" extension attributes to order data object to make them accessible in API data
*
* @param OrderRepositoryInterface $subject
* @param OrderInterface $order
*
* @return OrderInterface
*/
public function afterGet(OrderRepositoryInterface $subject, OrderInterface $order)
{
$financeDeposit = $order->getData(self::FINANCE_DEPOSIT);
$financeAmount = $order->getData(self::FINANCE_AMOUNT);
$financeApplicationNo = $order->getData(self::FINANCE_APPLICATION_NO);
$extensionAttributes = $order->getExtensionAttributes();
$extensionAttributes = $extensionAttributes ? $extensionAttributes : $this->extensionFactory->create();
$extensionAttributes->setFinanceDeposit($financeDeposit);
$extensionAttributes->setFinanceAmount($financeAmount);
$extensionAttributes->setFinanceApplicationNo($financeApplicationNo);
$order->setExtensionAttributes($extensionAttributes);
return $order;
}
/**
* Add "finance_deposit", "finance_amount" and "finance_application_no" extension attributes to order data object to make them accessible in API data
*
* @param OrderRepositoryInterface $subject
* @param OrderSearchResultInterface $searchResult
*
* @return OrderSearchResultInterface
*/
public function afterGetList(OrderRepositoryInterface $subject, OrderSearchResultInterface $searchResult)
{
$orders = $searchResult->getItems();
foreach ($orders as &$order) {
$financeDeposit = $order->getData(self::FINANCE_DEPOSIT);
$financeAmount = $order->getData(self::FINANCE_AMOUNT);
$financeApplicationNo = $order->getData(self::FINANCE_APPLICATION_NO);
$extensionAttributes = $order->getExtensionAttributes();
$extensionAttributes = $extensionAttributes ? $extensionAttributes : $this->extensionFactory->create();
$extensionAttributes->setFinanceDeposit($financeDeposit);
$extensionAttributes->setFinanceAmount($financeAmount);
$extensionAttributes->setFinanceApplicationNo($financeApplicationNo);
$order->setExtensionAttributes($extensionAttributes);
}
return $searchResult;
}
}