使用shopify-api-node创建/更新履约单报400错误如何解决
400报错核心原因
Shopify 2022-01及之后的API版本已经废弃了直接传订单ID创建履约的旧逻辑,你的代码存在四个必触发校验失败的问题:
- 入参关联ID错误:直接传入
orderId调用创建接口,新版API要求必须绑定对应订单下状态为open的履约订单(Fulfillment Order)ID,订单ID本身不能作为创建履约的关联主键。 - 必填参数缺失:没有传发货地点
location_id,也没有指定要履约的订单行项目,参数校验直接不通过。 - 格式错误:
tracking_url没有带https://协议头,且tracking相关字段没有按新版要求嵌套在tracking_info结构下,旧版SDK也要求履约相关字段必须嵌套在fulfillment根对象下。 - SDK调用方式错误:新版Node SDK的
fulfillment.create方法只接收一个配置对象作为入参,不支持(orderId, data)这种两参数的旧写法。
可直接运行的调整方案
- 先查询目标订单对应的可履约Fulfillment Order,拿到必填的关联ID
// 查询订单关联的所有履约单 const { fulfillment_orders } = await shopify.fulfillmentOrder.list({ order_id: orderId }); // 筛选出待履约的有效履约单,拆单场景会返回多个open状态的履约单 const validFulfillmentOrder = fulfillment_orders.find(item => item.status === 'open'); const fulfillmentOrderId = validFulfillmentOrder.id; // 直接从履约单里取绑定的发货地点ID,不需要单独查店铺地点列表 const locationId = validFulfillmentOrder.assigned_location.id;
- 构造符合API校验规则的请求参数
const createPayload = { fulfillment: { // 绑定履约单,整单履约不需要单独传行项目,拆单场景在数组内补充行项ID和发货数量即可 line_items_by_fulfillment_order: [ { fulfillment_order_id: fulfillmentOrderId } ], // 物流信息按要求嵌套,url必须带http/https协议头 tracking_info: { company: "DHL", number: "123123", url: "https://trackingdhl.com/tracking/123123" }, location_id: locationId, notify_customer: true // 可选配置,是否给客户发发货通知 } };
- 调用正确的SDK方法创建履约
const fulfill = await shopify.fulfillment.create(createPayload); console.log('fulfill ======>', fulfill);
补充说明
如果是更新已创建履约单的物流信息,直接调用shopify.fulfillment.update方法,传入履约单ID和要更新的tracking字段即可,不需要重复传行项目和地点信息。不建议继续使用2022-01之前的旧版API,旧版本接口已经逐步停止支持。
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

