You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_OrderApiFix
  • bin/magento setup:upgrade
  • bin/magento cache:clean
验证

重新调用订单详情接口,可配置产品的订单项SKU将不再重复,子项会返回真实的简单产品SKU,开启过滤配置后仅会保留一条有效子项记录,满足SAP集成的字段要求。

内容的提问来源于stack exchange,提问作者Sanjeev Kumar Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:36:03