Das Erweiterungsattribut der Zahlungsschnittstelle wurde nicht in der Auftragstabelle gespeichert

Nov 24 2020

Ich versuche, der Zahlungs-API ein Erweiterungsattribut hinzuzufügen. Wert jedoch nicht in der Tabelle sales_order gespeichert.

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

Der obige Code funktioniert nicht.

Antworten

Devidas Nov 25 2020 at 08:27

Der folgende Code funktioniert für mich.

Erstellen Sie die erforderlichen benutzerdefinierten Moduldateien.

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>

Benutzerdefiniert / Modul / Plugin / Kasse / 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

Anfrage:

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