Разделение заказа с онлайн-транзакцией при оформлении заказа в magento 2.4 enterprise

#magento #checkout #orders #payment-method #magento2.4

#magento #Оформить покупку #заказы #способ оплаты #magento2.4

Вопрос:

Я столкнулся с одной проблемой при разделении заказа при оформлении заказа. Я следовал этому коду, указанному в ссылке:- https://magento.stackexchange.com/questions/196669/magento-2-split-order-for-every-item и https://github.com/magestat/magento2-split-order

Оба решения работают с автономными платежами, такими как чек / месяц, наложенный платеж, номер заказа и т. Д. Но он не работает с данными кредитной карты. Всегда появляется ошибка, касающаяся данных кредитной карты.

Я добавляю дополнительную информацию через код:-

Я застрял в точке, чтобы распределить заказ и назначить ему способ оплаты. я получаю два сценария:

  1. если я назначу способ оплаты checkmo, наложенный платеж, тогда заказ будет разделен, и с этим все работает нормально.
  2. Но мне нужно заказывать товары с помощью кредитной карты, и когда я назначаю код способа оплаты (способ оплаты кредитной картой — ‘nmi_directpost’), а также присваиваю данные карты в предложение и размещаю и заказываю, тогда он показывает мне ошибку по-другому, некоторое время его данные кредитной карты недействительны, иногда страница перенаправляется настраница корзины без какого-либо журнала / исключения. Вот куча кода, который я пытаюсь сделать:-
 public function aroundPlaceOrder(QuoteManagement $subject, callable $proceed, $cartId, $payment = null)
    {
        $currentQuote = $this->quoteRepository->getActive($cartId);

        // Separate all items in quote into new quotes.
        $quotes = $this->quoteHandler->normalizeQuotes($currentQuote);
        if (empty($quotes)) {
            return $result = array_values([($proceed($cartId, $payment))]);
        }
        // Collect list of data addresses.
        $addresses = $this->quoteHandler->collectAddressesData($currentQuote);

        /** @var MagentoSalesApiDataOrderInterface[] $orders */
        $orders = [];
        $orderIds = [];
        foreach ($quotes as $items) {
            /** @var MagentoQuoteModelQuote $split */
            $split = $this->quoteFactory->create();

            // Set all customer definition data.
            $this->quoteHandler->setCustomerData($currentQuote, $split);
            $this->toSaveQuote($split);

            // Map quote items.
            foreach ($items as $item) {
                // Add item by item.
                $item->setId(null);
                $split->addItem($item);
            }
            MagentoFrameworkAppObjectManager::getInstance()->get('PsrLogLoggerInterface')->info('new quote 1st :-'. print_r($split->getData(),true));
            $this->quoteHandler->populateQuote($quotes, $split, $items, $addresses, $payment);
            // $split->getPayment()->setMethod('nmi_directpost');
            // if ($payment) {
            //     $split->getPayment()->setQuote($split);
                // $data = $payment->getData();

                // $paymentDetails = $paymentCardDetails = '';
                // $postData = file_get_contents("php://input");//Get all param
                // $postData = (array)json_decode($postData);//Decode all json param
                // foreach ($postData as $key => $value) {
                //     if ($key == 'paymentMethod') { //Get paymentMethod details
                //         $paymentDetails = (array)$value;
                //         foreach ($paymentDetails as $key1 => $paymentValue) {
                //             if ($key1 == 'additional_data') { //get  paymentMethod Details like card details
                //                 $paymentCardDetails = (array)$paymentValue;
                //             }
                //         }
                //     }
                // }
                // $split->setMethod('checkmo');

                MagentoFrameworkAppObjectManager::getInstance()->get('PsrLogLoggerInterface')->info('Paynet :-');
                // $payment = $quotes->getPayment();
                $objectManager = MagentoFrameworkAppObjectManager::getInstance();
$cart = $objectManager->get('MagentoCheckoutModelCart');

$quote = $cart->getQuote();
$paymentMethod = $quote->getPayment()->getMethod();
                $payment = $this->checkoutSession->getQuote()->getData();
                MagentoFrameworkAppObjectManager::getInstance()->get('PsrLogLoggerInterface')->info('second Paynet :-');
                MagentoFrameworkAppObjectManager::getInstance()->get('PsrLogLoggerInterface')->info('new quote :-'. print_r($paymentMethod,true));
                // $split->setPayment($payment);
                // $split->getPayment()->importData(array(
                //     'method'      =>'nmi_directpost',
                //     'cc_type'     =>'VI',
                //     'cc_number'   =>'4111111111111111',
                //     'cc_exp_year' =>'2025',
                //     'cc_exp_month'=>'10',
                //   ));
            // }
            // MagentoFrameworkAppObjectManager::getInstance()->get('PsrLogLoggerInterface')->info('original quote :-'. print_r($quotes->getData(),true));
            MagentoFrameworkAppObjectManager::getInstance()->get('PsrLogLoggerInterface')->info('new quote :-'. print_r($split->getData(),true));
            // MagentoFrameworkAppObjectManager::getInstance()->get('PsrLogLoggerInterface')->info('new quote :-'. print_r($payment->getData(),true));
            // Dispatch event as Magento standard once per each quote split.
            $this->eventManager->dispatch(
                'checkout_submit_before',
                ['quote' => $split]
            );

            $this->toSaveQuote($split);
            $order = $subject->submit($split);

            $orders[] = $order;
            $orderIds[$order->getId()] = $order->getIncrementId();

            if (null == $order) {
                throw new LocalizedException(__('Please try to place the order again.'));
            }
        }
        $currentQuote->setIsActive(false);
        $this->toSaveQuote($currentQuote);

        $this->quoteHandler->defineSessions($split, $order, $orderIds);

        $this->eventManager->dispatch(
            'checkout_submit_all_after',
            ['orders' => $orders, 'quote' => $currentQuote]
        );
        return $this->getOrderKeys($orderIds);
    }
 

Пожалуйста, предложите, как мы можем добиться разделения заказа с помощью оплаты кредитной картой.

Ответ №1:

Разделение платежа по нескольким кредитным картам, подобное этому, называется «частичной авторизацией». (Примечание: это сильно отличается от «частичного выставления счетов» или «частичного захвата», термины, которые вы также увидите.)

Авторизация Magento по умолчанию.Net gateway включает в себя функцию частичной авторизации, вам просто нужно включить ее в настройках шлюза. Это работает как с Community, так и с Enterprise Edition. Смотрите Официальную документацию по настройке и рабочему процессу здесь.

Насколько мне известно, это единственный способ оплаты, который его поддерживает.

Обратите внимание, что клиент не может выбирать, сколько снимать с каждой карты. Скорее, если на карте, которую они вводят, недостаточно средств, им будет предложено ввести другую.