Magento 2 REST订单API可配置产品订单项显示重复SKU如何重写接口代码
问题根因
Magento 2 原生订单REST API(GET /V1/orders/{orderId})返回可配置产品的订单项时,会同时返回可配置父产品和关联的简单子产品两条记录,原生逻辑下子产品的SKU会被错误覆盖为父产品的SKU,最终出现两条重复SKU的订单项,影响下游SAP集成的字段校验。
修复方案
通过重写订单项数据处理器的方式修正SKU赋值逻辑,无需修改核心代码,步骤如下:
1. 新建自定义模块
首先创建符合Magento 2规范的自定义模块,比如命名为Vendor_OrderApiFix,提前注册好registration.php和module.xml文件。
2. 配置DI依赖注入重写规则
在模块的etc/di.xml中配置插件,替换原生的订单项处理逻辑:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Sales\Api\OrderItemRepositoryInterface"> <plugin name="fix_configurable_item_sku" type="Vendor\OrderApiFix\Plugin\OrderItemPlugin" sortOrder="10" /> </type> </config>
3. 编写插件修正SKU赋值逻辑
新建Vendor/OrderApiFix/Plugin/OrderItemPlugin.php文件,代码如下:
<?php namespace Vendor\OrderApiFix\Plugin; use Magento\Sales\Api\Data\OrderItemInterface; use Magento\Sales\Api\OrderItemRepositoryInterface; class OrderItemPlugin { public function afterGet( OrderItemRepositoryInterface $subject, OrderItemInterface $result ) { // 仅处理可配置产品的子订单项 if ($result->getProductType() === 'configurable' && $result->getParentItemId()) { // 读取关联简单产品的真实SKU覆盖错误值 $realSimpleSku = $result->getProduct()->getSku(); if ($realSimpleSku) { $result->setSku($realSimpleSku); } } return $result; } public function afterGetList( OrderItemRepositoryInterface $subject, \Magento\Sales\Api\Data\OrderItemSearchResultInterface $result ) { foreach ($result->getItems() as $item) { $this->afterGet($subject, $item); } return $result; } }
4. 可选:过滤冗余的可配置父订单项
如果SAP集成只需要保留真实售卖的简单子项记录,可以额外配置插件过滤可配置父项,在模块的etc/webapi_rest/di.xml中添加如下配置:
<type name="Magento\Sales\Api\OrderRepositoryInterface"> <plugin name="filter_configurable_parent_item" type="Vendor\OrderApiFix\Plugin\OrderRepositoryPlugin" sortOrder="10" /> </type>
对应插件文件Vendor/OrderApiFix/Plugin/OrderRepositoryPlugin.php代码:
<?php namespace Vendor\OrderApiFix\Plugin; use Magento\Sales\Api\Data\OrderInterface; use Magento\Sales\Api\OrderRepositoryInterface; class OrderRepositoryPlugin { public function afterGet( OrderRepositoryInterface $subject, OrderInterface $result ) { $originalItems = $result->getItems(); $filteredItems = []; foreach ($originalItems as $item) { // 跳过无父项的可配置产品父记录 if ($item->getProductType() === 'configurable' && !$item->getParentItemId()) { continue; } $filteredItems[] = $item; } $result->setItems($filteredItems); return $result; } }
5. 生效修改
依次执行以下命令启用模块并清理缓存:
bin/magento module:enable Vendor_OrderApiFixbin/magento setup:upgradebin/magento cache:clean
验证
重新调用订单详情接口,可配置产品的订单项SKU将不再重复,子项会返回真实的简单产品SKU,开启过滤配置后仅会保留一条有效子项记录,满足SAP集成的字段要求。
内容的提问来源于stack exchange,提问作者Sanjeev Kumar Sharma
相关产品推荐
相关产品推荐

