在 magento 2.4 企业中结账时使用在线交易进行订单拆分
Posted
技术标签:
【中文标题】在 magento 2.4 企业中结账时使用在线交易进行订单拆分【英文标题】:Order split with online transaction on checkout in magento 2.4 enterprise 【发布时间】:2022-01-13 12:09:52 【问题描述】:我在结账时拆分订单时遇到了一个问题。我遵循了链接中提到的这些代码:- https://magento.stackexchange.com/questions/196669/magento-2-split-order-for-every-item 和 https://github.com/magestat/magento2-split-order
这两种解决方案都适用于离线支付,如支票/月票、货到付款、邮政编码等。但它不适用于信用卡详细信息。总是收到有关信用卡详细信息的错误。
我正在通过代码提供更多信息:-
我被困在分配订单并为其分配付款方式的问题上。 我得到了两种情况:
-
如果我指定付款方式 checkmo,货到付款然后订单被拆分,一切正常。
但我需要使用信用卡订购产品,当我指定付款方式代码(信用卡付款方式为“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 \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);
请建议我们如何通过信用卡支付实现订单拆分。
【问题讨论】:
【参考方案1】:像这样跨多张信用卡分期付款被称为“部分授权”。 (注意:这与“部分开票”或“部分捕获”非常不同,您也会看到这些术语。)
Magento 的默认 Authorize.Net 网关包括部分授权功能,您只需在网关设置中启用它。这适用于社区版和企业版。请参阅有关设置和工作流程的官方文档here。
据我所知,这是唯一支持它的付款方式。
请注意,客户无法选择对每张卡收取多少费用。相反,如果他们输入的卡没有足够的资金,则会提示他们输入另一张。
【讨论】:
以上是关于在 magento 2.4 企业中结账时使用在线交易进行订单拆分的主要内容,如果未能解决你的问题,请参考以下文章