使用jlevers/selling-partner-api的confirmShipment()时出现ObjectSerializer.php错误
问题
使用jlevers/selling-partner-api中的confirmShipment()确认亚马逊订单时触发致命错误:Uncaught Error: Class 'null' not found,报错位置在/vendor/jlevers/selling-partner-api/lib/ObjectSerializer.php第366行。已成功创建$apiInstance和$payload,但执行时仍报错。尝试过省略order_items或改为嵌套数组,问题依旧,怀疑是payload参数传递有误。
错误堆栈信息
Fatal error: Uncaught Error: Class 'null' not found in /vendor/jlevers/selling-partner-api/lib/ObjectSerializer.php:366 Stack trace: #0 /vendor/jlevers/selling-partner-api/lib/Api/OrdersV0Api.php(92): SellingPartnerApi\ObjectSerializer::deserialize(Object(stdClass), 'null', Array) #1 /vendor/jlevers/selling-partner-api/lib/Api/OrdersV0Api.php(55): SellingPartnerApi\Api\OrdersV0Api->confirmShipmentWithHttpInfo('114-0297756-279...', Object(SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest)) #2 /amazon_settings.php(457): SellingPartnerApi\Api\OrdersV0Api->confirmShipment('114-0297756-279...', Object(SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest)) #3 /scripts/test.php(65): Amazon->fn_confirmShipment('/home/scripts...') #4 {main} thrown in /vendor/jlevers/selling-partner-api/lib/ObjectSerializer.php on line 366
调用代码
$apiInstance = new SellingPartnerApi\Api\OrdersV0Api($config); $order_id = 'order_id_example'; // 亚马逊定义的订单ID,格式为3-7-7(实际传入的是正确订单号) $payload = new \SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest(); // confirmShipment的请求体 try { $apiInstance->confirmShipment($order_id, $payload); } catch (Exception $e) { echo '调用OrdersV0Api->confirmShipment时异常: ', $e->getMessage(), PHP_EOL; }
当前$payload结构
SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest Object ( [container:protected] => Array ( [package_detail] => Array ( [package_reference_id] => 2790602 [carrier_code] => FedEx [shipping_method] => Ground [tracking_number] => 63828440XXX [ship_date] => 2023-11-07T07:17:07-00:00 [order_items] => Array ( [order_item_id] => 87699213804801 [quantity] => 4 ) ) [cod_collection_method] => [marketplace_id] => ATVPDKIKX0DER ) )
解决方案
修正
order_items结构package_detail中的order_items要求是对象数组,而非单个键值对数组。你当前的order_items是单个条目,需要用数组包裹,且建议使用SDK提供的模型类构建,确保类型匹配。使用SDK模型类规范构建payload
不要直接给ConfirmShipmentRequest的容器赋值,改用模型类的setter方法或构造函数构建,避免类型不兼容问题。
修正后的代码示例:
// 构建单个订单项 $orderItem = new \SellingPartnerApi\Model\OrdersV0\OrderItem(); $orderItem->setOrderItemId('87699213804801'); $orderItem->setQuantity(4); // 构建包裹详情 $packageDetail = new \SellingPartnerApi\Model\OrdersV0\PackageDetail(); $packageDetail->setPackageReferenceId('2790602'); $packageDetail->setCarrierCode('FedEx'); $packageDetail->setShippingMethod('Ground'); $packageDetail->setTrackingNumber('63828440XXX'); $packageDetail->setShipDate('2023-11-07T07:17:07-00:00'); $packageDetail->setOrderItems([$orderItem]); // 用数组包裹订单项 // 构建完整请求体 $payload = new \SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest(); $payload->setPackageDetail($packageDetail); $payload->setMarketplaceId('ATVPDKIKX0DER'); // 无需设置的字段(如cod_collection_method)可直接省略 // 调用API try { $apiInstance->confirmShipment($order_id, $payload); } catch (Exception $e) { echo '调用OrdersV0Api->confirmShipment时异常: ', $e->getMessage(), PHP_EOL; }
- 排查SDK版本
若上述修正后仍报错,尝试将jlevers/selling-partner-api升级到最新版本,可能是SDK内部类型定义bug导致的反序列化错误。
内容的提问来源于stack exchange,提问作者R Gomez
相关产品推荐
相关产品推荐

