0

I am trying to add an extension attribute in the Payment API. but value not saved in sales_order table.

etc/extension_attributes.xml

<extension_attributes for="Magento\Quote\Api\Data\PaymentInterface"> <attribute code="comment" type="string"/> </extension_attributes> 

etc/di.xml

<type name="Magento\Checkout\Api\PaymentInformationManagementInterface"> <plugin name="order_comments_save-in-order" type="Custom\Module\Plugin\Checkout\PaymentInformationManagementPlugin" sortOrder="10"/> </type> 

Plugin/Checkout/PaymentInformationManagementPlugin.php

class PaymentInformationManagementPlugin { protected $orderRepository; public function __construct( \Magento\Sales\Api\OrderRepositoryInterface $orderRepository ) { $this->orderRepository = $orderRepository; } public function aroundSavePaymentInformationAndPlaceOrder( \Magento\Checkout\Api\PaymentInformationManagementInterface $subject, \Closure $proceed, $cartId, \Magento\Quote\Api\Data\PaymentInterface $paymentMethod, \Magento\Quote\Api\Data\AddressInterface $billingAddress = null ) { $result = $proceed($cartId, $paymentMethod, $billingAddress); if($result){ $orderComment =$paymentMethod->getExtensionAttributes(); if ($orderComment->getComment()) $comment = trim($orderComment->getComment()); else $comment = ''; $orderComment->setComment($comment); } return $result; } } 

The above code is not working.

1 Answer 1

0

Below Code is working for me.

Create required custom module files.

Setup/UpgradeSchema.php

<?php namespace Custom\Module\Setup; use Magento\Framework\Setup\UpgradeSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; class UpgradeSchema implements UpgradeSchemaInterface { public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); if (version_compare($context->getVersion(), '3.0.0', '<')) { $setup->getConnection()->addColumn( $setup->getTable('quote'), 'po_number', [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 'nullable' => false, 'comment' => 'PO Number' ] ); $setup->getConnection()->addColumn( $setup->getTable('sales_order'), 'po_number', [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 'nullable' => false, 'comment' => 'PO Number' ] ); $setup->getConnection()->addColumn( $setup->getTable('sales_order_grid'), 'po_number', [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 'nullable' => false, 'comment' => 'PO Number' ] ); } $setup->endSetup(); } } 

etc/extension_attributes.xml

<extension_attributes for="Magento\Quote\Api\Data\PaymentInterface"> <attribute code="po_number" type="string"/> </extension_attributes> 

etc/di.xml

 <virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid"> <arguments> <argument name="columns" xsi:type="array"> <item name="po_number" xsi:type="string">sales_order.po_number</item> </argument> </arguments> </virtualType> <type name="Magento\Checkout\Api\PaymentInformationManagementInterface"> <plugin name="order_ponumber_save-in-order" type="Custom\Module\Plugin\Checkout\PaymentInformationManagementPlugin" sortOrder="10"/> </type> 

Custom/Module/Plugin/Checkout/PaymentInformationManagementPlugin.php

<?php namespace Custom\Module\Plugin\Checkout; use Magento\Quote\Api\Data\AddressInterface; class PaymentInformationManagementPlugin { protected $orderRepository; protected $paymentFactory; protected $logger; protected $quoteRepository; public function __construct( \Magento\Sales\Api\OrderRepositoryInterface $orderRepository, \Magento\Quote\Api\Data\PaymentExtensionFactory $paymentFactory, \Psr\Log\LoggerInterface $logger, \Magento\Quote\Api\CartRepositoryInterface $quoteRepository ) { $this->orderRepository = $orderRepository; $this->paymentFactory = $paymentFactory; $this->logger = $logger; $this->quoteRepository = $quoteRepository; } public function beforeSavePaymentInformationAndPlaceOrder( \Magento\Checkout\Api\PaymentInformationManagementInterface $subject, $cartId, \Magento\Quote\Api\Data\PaymentInterface $paymentMethod ) { if ($paymentMethod->getExtensionAttributes()->getPoNumber()) { $quote = $this->quoteRepository->getActive($cartId); $quote->setPoNumber($paymentMethod->getExtensionAttributes()->getPoNumber()); $this->quoteRepository->save($quote); } } } 

etc/events.xml

<event name="sales_model_service_quote_submit_before"> <observer name="sales_model_service_quote_submit_before" instance="Custom\Module\Observer\SalesModelServiceQuoteSubmitBefore"/> </event> 

Custom/Module/Observer/SalesModelServiceQuoteSubmitBefore.php

<?php namespace Custom\Module\Observer; class SalesModelServiceQuoteSubmitBefore implements \Magento\Framework\Event\ObserverInterface { protected $logger; protected $objectCopyService; private $quoteRepository; public function __construct( \Psr\Log\LoggerInterface $logger, \Magento\Framework\DataObject\Copy $objectCopyService, \Magento\Quote\Model\QuoteRepository $quoteRepository ) { $this->logger = $logger; $this->objectCopyService = $objectCopyService; $this->quoteRepository = $quoteRepository; } public function execute(\Magento\Framework\Event\Observer $observer) { $order = $observer->getEvent()->getOrder(); $quote = $observer->getEvent()->getQuote(); $quotes = $this->quoteRepository->get($order->getQuoteId()); if ($quotes->getPoNumber()) { $order->setPoNumber($quotes->getPoNumber()); } return $this; } } 

API - /V1/carts/mine/payment-information

Request:

{ "billingAddress":{ "countryId":"IN", "regionId":"564", "regionCode":"TG", "region":"Telangana", "street":[ "high tech city" ], "company":"pt", "telephone":"09878787878", "postcode":"500005", "city":"sadsad", "firstname":"sdasd", "lastname":"sadsd", "saveInAddressBook":null, "extension_attributes": { "landmark": "test" } }, "paymentMethod":{ "method":"ccavenue", "extension_attributes":{ "po_number":"1996" } } } 

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.