我正在尝试使用 jlevers/ sell-partner-api 中的confirmShipment() 来确认亚马逊的订单,如下面的 GitHub 中所述,但我收到 致命错误: 未捕获的错误:未找到类“null”/vendor/jlevers/销售合作伙伴-api/lib/ObjectSerializer.php:366
https://github.com/jlevers/ sell-partner-api/
我成功创建了 $apiInstance 和 $payload,但是当我执行它时,我从 ObjectSerializer 收到此错误:
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'; // string | An Amazon-defined order identifier, in 3-7-7 format (correct order number being passed).
$payload = new \SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest(); // \SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest | Request body of confirmShipment.
try {
$apiInstance->confirmShipment($order_id, $payload);
} catch (Exception $e) {
echo 'Exception when calling OrdersV0Api->confirmShipment: ', $e->getMessage(), PHP_EOL;
}
这是ConfirmShipmentRequest 生成的$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
)
)
我是否错误地传递了有效负载中的信息?错误显示未找到“null”类,但我正在传递 $apiInstance->confirmShipment 内的所有参数,感谢任何帮助
我尝试省略 order_items,也将它们作为嵌套数组传递
此问题已在5.10.2版本中修复
按照 Filip 的建议更新到版本 5.10.2 后,我收到了 PackageReferenceId 错误,后来通过首先创建新的受保护容器然后添加数据而不是仅向它们传递数组来解决该错误。下面的代码比 github 中提供的代码更详细一些:
require_once(__DIR__ . '/vendor/autoload.php');
use SellingPartnerApi\Api\OrdersV0Api;
use SellingPartnerApi\Model\OrdersV0\ConfirmShipmentRequest;
use SellingPartnerApi\Model\OrdersV0\PackageDetail;
use SellingPartnerApi\Model\OrdersV0\ConfirmShipmentOrderItem;
$order_id = 'your_order_id_here';
$order_items_list = $this->fn_GetOrderItems($order_id);
$order_item = $order_items_list->getPayload()->getOrderItems();
$shipment_items = new ConfirmShipmentOrderItem();
foreach ($order_item as $item) {
if( $item['quantity_shipped']> 0) {
echo "Items in order " . $order_id . " already marked shipped";
return;
} else {
$shipment_items->setOrderItemId($item->getOrderItemId());
$shipment_items->setQuantity($item->getQuantityOrdered());
}
}
$package_details = new PackageDetail();
$package_details->setCarrierCode('your_carrier_code');
$package_details->setCarrierName('your_shipping_carrier');
$package_details->setTrackingNumber('your_tracking_number');
$package_details->setShippingMethod('your_shipping_method');
$package_details->setPackageReferenceId('1');
$package_details->setShipDate(gmdate('Y-m-d\TH:i:s\Z'),strtotime('your_ship_date'));
$package_details->setOrderItems([$shipment_items]); //must be in brackets to make it an array
$payload = new ConfirmShipmentRequest();
$payload ->setPackageDetail($package_details);
$payload ->setMarketplaceId('your_market_placeid');
$apiInstance = new OrdersV0Api($this->config); //your config settings
try {
$apiInstance->confirmShipment($order_id, $payload);
echo "Order " . $order_id . " Fulfilled";
return;
} catch (Exception $e) {
echo $order_id . ' Exception when calling OrdersV0Api->confirmShipment: ', $e->getMessage(), PHP_EOL;
return;
}