Magento 2.2.2 REST API运单跟踪信息未更新问题求助
让我们一步步拆解你的问题:
首先,重复调用报错是正常系统行为
你第二次调用时收到的错误提示The order does not allow a shipment to be created. You can't create a shipment without products.是完全合理的——因为首次调用已经成功创建了运单,并且订单状态变为complete,说明该订单下的所有商品已经完成发货流程,Magento不允许为同一个订单创建多个运单(除非订单存在部分发货的场景,但你的订单已标记为complete,意味着全部发货完成)。这个报错不是bug,是系统的正常校验逻辑。
核心问题:首次创建运单时跟踪信息未保存
接下来重点分析为什么首次调用返回了运单ID,但跟踪号、承运商信息没更新。结合你提供的请求体和Magento 2.2.2的API特性,可能的原因及解决方案如下:
1. 请求体中数据类型错误(最可能的原因)
你在order_item_id和qty字段上添加了引号,把它们转成了字符串类型,但Magento的REST API期望这两个字段是整数类型。虽然系统可能容忍字符串类型创建运单,但会导致后续关联跟踪信息的逻辑出现异常。
修正后的请求体应该去掉这两个字段的引号:
$tracking_str = '{ "items": [ { "extension_attributes": {}, "order_item_id": '.$orderItemId.', "qty": '.$qty_invoiced.' } ], "notify": false, "appendComment": true, "comment": { "extension_attributes": {}, "comment": "Item(s) has been shipped", "is_visible_on_front": 0 }, "tracks": [ { "extension_attributes": {}, "track_number": "'.$TrackingNumber.'", "title": "'.$ShipTitle.'", "carrier_code": "'.$carrierCode.'" } ], "packages": [ { "extension_attributes": {} } ], "arguments": { "extension_attributes": {} } }';
2. 承运商代码(carrier_code)无效
Magento要求carrier_code必须是系统中已启用的承运商代码,比如内置的ups、fedex、dhl,或者你自定义的承运商代码。如果传入的carrier_code不存在,系统会忽略跟踪信息的保存。
你可以通过以下方式验证:
- 登录Magento后台,进入
Stores > Settings > Configuration > Sales > Shipping Methods,查看已启用的承运商对应的代码; - 调用REST API
GET /V1/carrier/list获取系统可用的承运商列表,确认你传入的carrier_code在返回结果中。
3. 检查Magento日志排查异常
如果以上两点都没问题,建议查看Magento的日志文件:
var/log/exception.log:查看是否有跟踪信息保存时抛出的异常;var/log/system.log:查看API请求处理过程中的警告或错误信息。
这些日志会帮你定位到具体的失败原因,比如数据库写入错误、权限问题等。
4. Magento 2.2.2版本的已知bug
Magento 2.2.2是比较老旧的版本,可能存在一些已知的API bug,比如创建运单时无法正确关联跟踪信息。你可以尝试升级到该分支的最新补丁版本(比如2.2.10),或者查看Magento官方的issue库,确认是否有对应的修复补丁。
验证解决方案的步骤
- 用修正后的请求体重新测试首次创建运单的接口;
- 调用
GET /V1/shipment/{shipmentId}/tracks接口,查看返回的跟踪信息是否存在; - 检查订单详情页的运单跟踪信息是否正常显示。
内容的提问来源于stack exchange,提问作者amar deep

