排查Mailchimp addStoreProduct API调用的400 Bad Request错误
Mailchimp addStoreProduct API 400 Bad Request 排查方案
因为你能正常调用getAllStoreProducts、getProductVariants等接口,说明API密钥、store_id、基础请求链路均正常,问题集中在addStoreProduct的请求参数上,以下是具体排查方向:
1. 核对必填参数是否完整
Mailchimp的addStoreProduct接口有强制必填字段,遗漏任何一项都会返回400:
title:产品名称(不能为空)handle:产品唯一标识(URL友好的slug,商店内不可重复)variants:至少包含1个变体对象,每个变体必须携带sku、price、inventory_quantity
例:错误的参数结构(漏必填项)
$productData = [ 'title' => $product->name, // 缺失handle字段 'variants' => [ [ 'sku' => $product->sku, 'price' => $product->price // 缺失inventory_quantity字段 ] ] ];
2. 校验参数数据类型
接口对数据类型有严格要求,类型不匹配会触发400:
price必须是数字类型(不能传字符串格式的"9.99",要传9.99)inventory_quantity必须是整数类型published_at必须是ISO 8601格式字符串(如2024-05-20T12:00:00Z)visibility若传值,只能是published或hidden
结合你的数据库表结构:如果price是DECIMAL类型,Laravel取出后可能是字符串,需转成数字再传递:
'price' => (float)$product->price,
3. 排查重复标识
Mailchimp要求商店内的产品handle、变体sku必须唯一,若新增的标识已存在,会返回400。可以通过getAllStoreProducts接口遍历现有数据,确认要新增的handle/sku无重复。
4. 捕获并解析具体错误信息
400错误会返回详细的字段错误描述,在Laravel代码中捕获异常并打印响应内容,直接定位问题:
try { $response = $mailchimp->post("/stores/{$storeId}/products", $productData); } catch (\GuzzleHttp\Exception\ClientException $e) { // 打印详细错误JSON dd(json_decode($e->getResponse()->getBody(), true)); }
返回的错误信息会明确指出问题,比如"title is required"或"variants.0.inventory_quantity must be an integer"。
5. 确认请求头格式
确保请求头Content-Type设置为application/json,Laravel HTTP客户端默认会处理,但自定义封装的客户端需手动确认:
$response = $client->post("https://usX.api.mailchimp.com/3.0/stores/{$storeId}/products", [ 'headers' => [ 'Authorization' => "Bearer {$apiKey}", 'Content-Type' => 'application/json', ], 'json' => $productData, ]);
内容的提问来源于stack exchange,提问作者Mária Ambrus
相关产品推荐
相关产品推荐

