使用jlevers/SP-API库调用Merchant Fulfillment报InvalidInput错误
问题原因
核心错误是所有嵌套请求参数你都直接传了原生PHP数组,没有实例化对应模型类。
这个selling-partner-api库的模型构造函数不会自动递归转换嵌套数组为对应模型实例,你只给最外层的GetEligibleShipmentServicesRequest传了数组,内部的shipment_request_details、商品列表、发货地址、重量、物流服务选项全是原生数组,库在序列化生成请求体的时候会把这些非模型类型的嵌套参数全部过滤丢弃,亚马逊服务端收到的请求里这些字段全是空值,自然报400参数校验错误。
另外你写的item_list结构也不对:这个字段是商品集合,必须是索引数组(每个元素对应一个商品),你直接写了单个商品的关联数组,结构本身就不匹配。
你之前调订单、报表接口没出问题,只是因为那些接口嵌套层级浅、参数少,刚好没踩这个坑。
修正后的代码
// North America Live $NA = [ 'url' => 'https://sellingpartnerapi-na.amazon.com', 'region' => 'us-east-1', ]; // North America Sandbox // $NA = [ // 'url' => 'https://sandbox.sellingpartnerapi-na.amazon.com', // 'region' => 'us-east-1', // ]; $config = new SellingPartnerApi\Configuration([ "lwaClientId" => $lwaClientId, "lwaClientSecret" => $lwaClientSecret, "lwaRefreshToken" => $lwaRefreshToken, "awsAccessKeyId" => $awsAccessKeyId, "awsSecretAccessKey" => $awsSecretAccessKey, "endpoint" => $NA ]); $apiInstance = new SellingPartnerApi\Api\MerchantFulfillmentApi($config); // 逐个实例化嵌套模型 $item = new \SellingPartnerApi\Model\MerchantFulfillment\Item([ "order_item_id" => "XXXXXXXXXXXXXXX", "quantity" => 1, ]); $shipFromAddress = new \SellingPartnerApi\Model\MerchantFulfillment\Address([ "name" => "XXXXXXX", "address_line1" => "XXXXXXXXXX", "email" => "XXXXX@XXXXX.COM", "city" => "XXXXXXXXX", "postal_code" => "XXXXXX", "country_code" => "US", "phone" => "XXXXXXXXXXXX", ]); $weight = new \SellingPartnerApi\Model\MerchantFulfillment\Weight([ "value" => 7, "unit" => "oz", ]); $shippingServiceOptions = new \SellingPartnerApi\Model\MerchantFulfillment\ShippingServiceOptions([ "delivery_experience" => "DeliveryConfirmationWithSignature", "carrier_will_pick_up" => true, ]); $shipmentRequestDetails = new \SellingPartnerApi\Model\MerchantFulfillment\ShipmentRequestDetails([ "amazon_order_id" => "XXX-XXXXXXXX-XXXXXXXX", // 替换为真实订单号,需匹配3位大写字母/数字-7位数字-7位数字的格式 "item_list" => [$item], // 列表类型传索引数组,每个元素为对应模型实例 "ship_from_address" => $shipFromAddress, "weight" => $weight, "shipping_service_options" => $shippingServiceOptions ]); $body = new \SellingPartnerApi\Model\MerchantFulfillment\GetEligibleShipmentServicesRequest([ "shipment_request_details" => $shipmentRequestDetails ]); try { $result = $apiInstance->getEligibleShipmentServices($body); d($result); } catch (Exception $e) { echo "<PRE>"; echo 'Exception when calling MerchantFulfillmentV0Api->getEligibleShipmentServices: <BR>', wordwrap($e->getMessage(),80,"<br>\n",TRUE), PHP_EOL; echo "</PRE>"; }
注意事项
- 所有接口的嵌套参数都必须实例化对应命名空间下的模型类,不能直接传数组,否则必然出现参数丢失问题
- 所有列表类字段(比如
item_list)必须传索引数组,即使只有一个元素也要外包一层数组 - 测试时不要直接用占位符参数,亚马逊对字段格式校验严格,比如邮箱、订单号、重量单位都必须符合接口文档给定的规则
内容的提问来源于stack exchange,提问作者Yourguide
相关产品推荐
相关产品推荐

