首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Magento2.4企业结帐时的在线分拆订单

Magento2.4企业结帐时的在线分拆订单
EN

Stack Overflow用户
提问于 2021-12-08 14:34:42
回答 1查看 500关注 0票数 1

我在结账的时候面临一个问题。我遵循了链接中提到的以下代码:- https://magento.stackexchange.com/questions/196669/magento-2-split-order-for-every-itemhttps://github.com/magestat/magento2-split-order

这两种解决方案都用于离线支付,如支票/mo、现金交付、po号码等,但它不适用于信用卡的详细信息。关于信用卡的详细信息总是会出错。

我要把更多的信息通过代码:-

我被困在一个点分配订单和分配付款方式到它。我得到了两种情况:

  1. 如果我指定付款方式支票,现金交货,然后订单是分裂的,一切都与此工作良好。
  2. 但是,我需要使用信用卡订购产品,当我指定支付方法代码(信用卡支付方式是'nmi_directpost')时,还需要将信用卡详细信息分配到报价和下订单中,然后它以不同的方式显示错误,有时它显示信用卡的详细信息无效,有时页面被重定向到购物车页面,没有任何日志/异常。下面是我要做的一堆代码:-
代码语言:javascript
复制
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 \Magento\Sales\Api\Data\OrderInterface[] $orders */
        $orders = [];
        $orderIds = [];
        foreach ($quotes as $items) {
            /** @var \Magento\Quote\Model\Quote $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);
            }
            \Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->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');

                \Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->info('Paynet :-');
                // $payment = $quotes->getPayment();
                $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$cart = $objectManager->get('\Magento\Checkout\Model\Cart');

$quote = $cart->getQuote();
$paymentMethod = $quote->getPayment()->getMethod();
                $payment = $this->checkoutSession->getQuote()->getData();
                \Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->info('second Paynet :-');
                \Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->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',
                //   ));
            // }
            // \Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->info('original quote :-'. print_r($quotes->getData(),true));
            \Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->info('new quote :-'. print_r($split->getData(),true));
            // \Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->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);
    }

请建议我们如何通过信用卡付款实现订单分割。

EN

回答 1

Stack Overflow用户

发布于 2021-12-10 02:07:51

像这样的多张信用卡的分期付款被称为“部分授权”。(注:这与“部分发票”或“部分捕获”是完全不同的,你也会看到。)

Magento的默认Authorize.Net网关包含部分授权功能,您只需在网关设置中启用它即可。这适用于Community和Enterprise。请参阅关于设置和工作流这里的正式文档。

据我所知,这是唯一支持它的支付方法。

请注意,客户不能选择向每张卡收取多少费用。相反,如果他们输入的卡没有足够的资金,他们将被提示进入另一张。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70276742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档