Attribut d'extension d'interface de paiement non enregistré dans la table de commande

Nov 24 2020

J'essaie d'ajouter un attribut d'extension dans l'API de paiement. mais la valeur n'est pas enregistrée dans la table sales_order.

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 / Paiement / 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;
    }
}

Le code ci-dessus ne fonctionne pas.

Réponses

Devidas Nov 25 2020 at 08:27

Le code ci-dessous fonctionne pour moi.

Créez les fichiers de module personnalisés requis.

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>

Personnalisé / Module / Plugin / Caisse / 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>

Personnalisé / 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

Demande:

{
   "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"
      }
   }
}