#php #magento2 #checkout #marketplace #magento2.4
Вопрос:
Процесс заказа Magento 2.4 с потоком на рынке:- У меня есть одна проблема с заказом. Мы используем marketplace и можем заказать несколько продуктов у разных поставщиков. Если мы используем способ оплаты администратора и учетные данные, все работает нормально, и оплата фиксируется в учетной записи администратора. и все товары заказываются с одним идентификатором заказа.
У нас есть два способа оплаты: stripe и paynet secure. Stripe также предоставляет функцию marketplace в их конце. Но paynet secure не поддерживает marketplace feature.so оплата поставщикам с помощью полосы автоматически распределяется в соответствии с заказанными поставщиками. Но paynet не имеет этой функции. Когда мы переходим к покупке продуктов нескольких поставщиков, в которых есть как paynet secure, так и stripe, оплата списывается с кредитной карты клиента и зачисляется на соответствующий счет поставщика платежных услуг.
Мое требование объясняется ниже с примером:- Предположим,что у клиента в корзине 3 поставщика(A, B и C). и их соответствующий способ оплаты: A, B: — Paynet, C:-Paynet. Поэтому, когда клиент разместил этот заказ(со всеми продуктами 3 поставщиков), клиент может один раз указать данные своей кредитной карты, и внутренняя сумма будет зачислена на соответствующий платежный счет поставщика в соответствии с расчетами.
Я застрял в точке, чтобы распределить заказ и назначить способ оплаты в нем. есть два сценария, которые я получаю:
- если я назначу способ оплаты checkmo,наложенный платеж, то заказ будет разделен, и с этим все работает нормально.
- Но мне нужно заказать продукты с помощью кредитной карты, и когда я назначаю код способа оплаты(способ оплаты кредитной картой — «nmi_directpost»), а также указываю данные карты в котировке, размещаю и заказываю, затем он показывает мне ошибку по-другому, некоторое время данные кредитной карты недействительны, иногда страница перенаправляется на страницу корзины без какого-либо журнала/исключения. Вот куча кода, который я пытаюсь сделать:-
public function aroundPlaceOrder(QuoteManagement $subject, callable $proceed, $cartId, $payment = null) { $currentQuote = $this-gt;quoteRepository-gt;getActive($cartId); // Separate all items in quote into new quotes. $quotes = $this-gt;quoteHandler-gt;normalizeQuotes($currentQuote); if (empty($quotes)) { return $result = array_values([($proceed($cartId, $payment))]); } // Collect list of data addresses. $addresses = $this-gt;quoteHandler-gt;collectAddressesData($currentQuote); /** @var MagentoSalesApiDataOrderInterface[] $orders */ $orders = []; $orderIds = []; foreach ($quotes as $items) { /** @var MagentoQuoteModelQuote $split */ $split = $this-gt;quoteFactory-gt;create(); // Set all customer definition data. $this-gt;quoteHandler-gt;setCustomerData($currentQuote, $split); $this-gt;toSaveQuote($split); // Map quote items. foreach ($items as $item) { // Add item by item. $item-gt;setId(null); $split-gt;addItem($item); } MagentoFrameworkAppObjectManager::getInstance()-gt;get('PsrLogLoggerInterface')-gt;info('new quote 1st :-'. print_r($split-gt;getData(),true)); $this-gt;quoteHandler-gt;populateQuote($quotes, $split, $items, $addresses, $payment); // $split-gt;getPayment()-gt;setMethod('nmi_directpost'); // if ($payment) { // $split-gt;getPayment()-gt;setQuote($split); // $data = $payment-gt;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 =gt; $value) { // if ($key == 'paymentMethod') { //Get paymentMethod details // $paymentDetails = (array)$value; // foreach ($paymentDetails as $key1 =gt; $paymentValue) { // if ($key1 == 'additional_data') { //get paymentMethod Details like card details // $paymentCardDetails = (array)$paymentValue; // } // } // } // } // $split-gt;setMethod('checkmo'); MagentoFrameworkAppObjectManager::getInstance()-gt;get('PsrLogLoggerInterface')-gt;info('Paynet :-'); // $payment = $quotes-gt;getPayment(); $objectManager = MagentoFrameworkAppObjectManager::getInstance(); $cart = $objectManager-gt;get('MagentoCheckoutModelCart'); $quote = $cart-gt;getQuote(); $paymentMethod = $quote-gt;getPayment()-gt;getMethod(); $payment = $this-gt;checkoutSession-gt;getQuote()-gt;getData(); MagentoFrameworkAppObjectManager::getInstance()-gt;get('PsrLogLoggerInterface')-gt;info('second Paynet :-'); MagentoFrameworkAppObjectManager::getInstance()-gt;get('PsrLogLoggerInterface')-gt;info('new quote :-'. print_r($paymentMethod,true)); // $split-gt;setPayment($payment); // $split-gt;getPayment()-gt;importData(array( // 'method' =gt;'nmi_directpost', // 'cc_type' =gt;'VI', // 'cc_number' =gt;'4111111111111111', // 'cc_exp_year' =gt;'2025', // 'cc_exp_month'=gt;'10', // )); // } // MagentoFrameworkAppObjectManager::getInstance()-gt;get('PsrLogLoggerInterface')-gt;info('original quote :-'. print_r($quotes-gt;getData(),true)); MagentoFrameworkAppObjectManager::getInstance()-gt;get('PsrLogLoggerInterface')-gt;info('new quote :-'. print_r($split-gt;getData(),true)); // MagentoFrameworkAppObjectManager::getInstance()-gt;get('PsrLogLoggerInterface')-gt;info('new quote :-'. print_r($payment-gt;getData(),true)); // Dispatch event as Magento standard once per each quote split. $this-gt;eventManager-gt;dispatch( 'checkout_submit_before', ['quote' =gt; $split] ); $this-gt;toSaveQuote($split); $order = $subject-gt;submit($split); $orders[] = $order; $orderIds[$order-gt;getId()] = $order-gt;getIncrementId(); if (null == $order) { throw new LocalizedException(__('Please try to place the order again.')); } } $currentQuote-gt;setIsActive(false); $this-gt;toSaveQuote($currentQuote); $this-gt;quoteHandler-gt;defineSessions($split, $order, $orderIds); $this-gt;eventManager-gt;dispatch( 'checkout_submit_all_after', ['orders' =gt; $orders, 'quote' =gt; $currentQuote] ); return $this-gt;getOrderKeys($orderIds); }
Если у кого-нибудь есть решение по этому поводу, пожалуйста, поделитесь своим решением/мнением? Я буду очень благодарен за это.
Комментарии:
1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.