Django(Python)调用Printful API创建订单报错与variant_id问题
问题现象
调用Printful API创建订单接口时返回400错误,错误信息如下:
{"code":400,"result":"Invalid request: missing order element","error":{"reason":"BadRequest","message":"Invalid request: missing order element"}}
同时存在两个待确认问题:
- 上述报错对应的代码问题位置
variant_id字段的含义、正确取值获取方式
问题根因
代码存在两处错误直接触发接口报错:
- 请求传参方式错误:
requests.post方法里传params=payload会把所有参数拼接在URL的查询字符串里,不会作为JSON请求体发送给接口,接口无法读取提交的订单数据 - 请求结构不符合接口要求:Printful创建订单接口要求所有订单数据必须包裹在最外层的
order字段下,当前payload直接把收件人、商品信息放在最外层,不符合接口格式规范
另外代码里variant_id填1是无效值,这个ID不支持自定义填写。
修复方法
- 调整payload结构,把原有订单数据包裹在
order键下 - 把POST请求的
params=payload改成json=payload,让requests自动把数据序列化为JSON格式放在请求体中发送
修正后的核心代码片段:
# 修正后的订单payload结构 payload = { "order": { "recipient": { "name": "John Smith", "address1": "Via milano 55", "city": "Arese", "state_name": "Milano", "country_code": "IT", "zip": "20020" }, "items": [ { # 注意替换为真实有效的variant_id,禁止填无意义的测试值1 "variant_id": 替换为真实变体ID, "name": "Digital Tech", "quantity": 1, "retail_price": "40.00", } ] } } # 修正后的POST请求,用json参数传递请求体 crea = requests.post(url + 'orders', json=payload, headers=header)
variant_id说明
- 字段含义:
variant_id是Printful平台上每个具体商品规格的唯一标识,同一款商品下不同颜色、不同尺码、不同款式都会对应独立的variant_id,下单时必须传对应规格的真实ID才能成功创建订单。 - 获取方式:代码中已经调用了
GET /store/products接口拉取店铺商品列表,接口返回的每个商品数据下都会携带variants数组,数组中每个变体对象的id字段就是下单需要的variant_id。
内容的提问来源于stack exchange,提问作者riccardo test
相关产品推荐
相关产品推荐

