编程 微信小店发货接口报 109000:product_infos 覆盖不全、虚拟商品拆包,和 30 多个拦单码怎么分层

2026-11-16 00:05:08

微信小店 channels/ec/order/delivery/send 排障笔记:订单被拦截发货的条件、错误码分层与幂等语义

接口文档:订单发货 api_senddelivery

结论先行

  • 发货被拒基本集中在四类前置校验:订单状态 / 发货方式(deliver_method 与 deliver_type 是否匹配)/ product_infos 覆盖量 / 单号与快递公司格式。网络和 token 问题通常落在 40001、42001、45009、45011、45035、61004、40164 这组公共错误码上。
  • deliver_type=3(虚拟商品无需物流发货)只能用于 deliver_method=1 的订单;虚拟商品必须整单发货,拆包会命中 606051。
  • 多包裹要多次调用发货接口,每个包裹在 delivery_list 里独立配置 product_infos,各包裹 product_cnt 之和必须等于订单总购买数量;覆盖不全时系统按「部分发货」处理,finish_delivery=0。
  • 三个典型处理方向不同的错误码:606049 平台风控,不要重试,等待平台通知;100003 订单更新过于频繁,可重试;109001 已发货完成,重试无意义。
  • 606064 是店铺自寄额度上限,继续换单号重试无效,应切换电子面单 / 在线寄件。
  • 该接口不是严格幂等:同一订单已成功发货后,再次提交相同 delivery_list 可能返回成功但不重复触发通知。

接口与调用约束

  • 接口英文名:senddelivery
  • 请求:POST https://api.weixin.qq.com/channels/ec/order/delivery/send?access_token=ACCESS_TOKEN
  • 支持第三方平台代调用,权限集 id 为 131。
  • 仅支持「微信小店」账号类型调用;接口应在服务器端调用。
  • access_token 必填,可用 access_token 或 authorizer_access_token。
  • 商家自研使用小店 access_token;第三方服务商需授权权限集 131。

请求参数结构

Query:

参数类型必填说明
access_tokenstring是可用 access_token 或 authorizer_access_token

Body:

参数类型必填说明
order_idnumber是订单 id
delivery_listobjarray是物流信息
delivery_list[].waybill_idstring否快递单号,deliver_type=1 时必填
delivery_list[].delivery_idstring否快递公司 id,通过获取快递公司列表接口获得,非主流快递公司可以填 OTHER,deliver_type=1 时必填
delivery_list[].product_infosobjarray是包裹中的商品信息
delivery_list[].product_infos[].product_idstring是商品 id
delivery_list[].product_infos[].sku_idstring是sku id
delivery_list[].product_infos[].product_cntnumber是商品数量
delivery_list[].deliver_typenumber是发货方式:1 自寄快递发货;3 虚拟商品无需物流发货(只有 deliver_method=1 的订单可以使用虚拟发货)
delivery_list[].course_infoobject否课程相关信息:start_time / end_time 时间戳;course_path{type 0=小程序地址, wxa_appid, wxa_path}
delivery_list[].sn_infoobject否商品 SN 码信息,部分订单(如无人机订单 / 国补订单)需传入:sn_code 必填,imei1 / imei2 选填

原文注意事项只有两条:已经完成售后的商品不能进行发货;虚拟商品必须整单发货。

拦单条件与错误码分层

请求层:与订单无关的参数 / 权限问题(3 个)

错误码含义
40097请求体参数不正确
47001请求体格式不正确
48001无权调用本 api

单号层:订单定位与订单侧并发变更(4 个)

错误码含义处置方向
100002订单不存在核对 order_id 与店铺主体
100003订单更新过于频繁,更新订单失败,请重试可重试
10020115用户申请修改收货地址,请商家处理完毕之后再发货先处理地址修改
10020276存在发货前更换 sku 请求,请商家处理后再发货先处理换 sku

状态层:订单状态、售后与重复发货(5 个)

错误码含义
101100当前订单状态不允许发货
108009当前订单有未完成售后单,不允许发货
109001当前订单已经发货完成,不能重复发货
109002当前发货请求里没有带上发货商品,请检查 product_infos 和 is_all_product
606003商家没有默认退货地址,不可发货

状态枚举对照(获取订单列表 / 订单搜索):10 待付款、12 礼物待收下、13 凑单买凑团中/一起买待成团、20 待发货(包括部分发货)、21 部分发货、30 待收货(包括部分发货)、100 完成、250 订单取消。

物流层:快递公司、单号、发货方式与寄件额度(8 个)

错误码含义
606004delivery_id 不合法
606005waybill_id 不合法
606008deliver_type 不符合要求(普通订单用快递发货,虚拟商品订单无需物流发货,检查 deliver_method)
606046请使用电子面单发货
606061国补订单只能用特定的快递公司
606064当前店铺的自行寄件额度已达上限(请使用电子面单、在线寄件等平台官方工具)
6060479快递单号与物流公司提供的正则表达式不匹配
109205当前订单已经下单在线物流单,不允许自寄发货

商品层:商品匹配、数量与 SN(7 个)

错误码含义
109000发货失败,请检查 errmsg 中返回的商品是否正确填写(订单是否包含该商品、是否已发货、是否已完成售后无法发货、数量是否正确)
606031发货请求里 product_id 或 sku_id 填写不正确
606051虚拟商品必须整单发货
606060国补订单需要 sn 码
606067该订单为无人机类目,发货前必须填写 SN 码
606068SN 码有误(仅支持英文字母与数字组合,长度不超过 30 个字符)
606061(见物流层)国补订单只能用特定的快递公司

合规管控层:风控、质检、课程核销与国补(14+ 个)

错误码含义
606049当前订单存在风险,请先不要发货等待平台进一步的通知
606045应平台管控要求,请使用【上传生鲜质检信息】接口上传商品打包信息
606034请前往平台服务-商品质检菜单,开通质检服务后走质检发货流程
606036带有课程链接的包裹里只能包含一个 sku
606037该 sku 不是课程商品,不能填写课程信息
606038课程链接 appid 或小程序地址为空
606048核销信息有误,小程序 appid 或 path 为空
268545000快递公司不支持国补
268545001订单 ID 和面单取号的商品 id 不匹配
268545002电子面单中的商品订单信息无效
268545003商品 SKU 不匹配
268545004商品国补信息不存在
268545005国补商品不支持组合打单
268545006国补不支持多 sku
268545007订单商品不唯一
268545008国补订单参数错误
268545009国补锁 sn 码失败,可以重试
268545010国补 sn 码被其他平台锁定
268545011国补 sn 码被其他订单锁定
268545012国补 sn 码锁定参数错误
268545013国补 sn 码锁定失败
268545014商品分类不支持国补
268545015国补 sn 码不存在

质检类型从订单详情取 delivery_info.quality_inspect_type:0 无需质检 / 1 珠宝玉石类 / 2 生鲜类。生鲜类走 606045 的打包信息上传,珠宝玉石类对应 606034 的质检发货流程。

部分发货、通知触发与幂等语义

开发指南要点:

  • 发货后触发事件 channels_ec_order_deliver,其中 finish_delivery=0 表示部分发货,=1 表示全部发货完成。
  • 多包裹场景需多次调用发货接口,每次都会触发发货事件。
  • 推荐事件驱动 + 定时全量对账。
  • 事件通知还包括:channels_ec_order_new / cancel / pay / wait_shipping / deliver / confirm / settle / ext_info_update。

开放社区官方答复(发货相关):

  1. 一个订单多商品多包裹发货,delivery_list 中每个包裹需独立配置 product_infos,且所有包裹 product_cnt 之和必须等于订单总购买数量;若后续调用未覆盖全部商品或数量不一致,系统视为「部分发货」,不触发通知;微信小店仅在订单状态变为「全部发货」时推送通知;同一订单已成功发货后再次调用相同 delivery_list 可能返回成功但不触发通知。
  2. 电子面单代发场景(店铺 A 打印店铺 B 订单):Body ec_order_list 中填写 ewaybill_order_code 和 ewaybill_order_appid,不得填写 ec_order_id;这两个字段用店铺 B 的信息,其他参数(网点、模板)用店铺 A 的信息。
  3. 换货单发货打电子面单:用原销售单的单号和电子面单 id 打单,换货在发货前发生,不会有问题。
  4. 售后单退款状态看 refund_resp.result_code 与 return_code 均为 SUCCESS。
  5. 超期未发货订单不能删除,只能走退款 / 取消闭环。

幂等相关的实际行为:

  • 已全部发货后重复提交 → 109001,不应作为可重试错误。
  • 已成功发货的同一 delivery_list 再次提交 → 可能返回成功,但不重复触发通知。
  • 部分覆盖的提交 → 可能返回成功,订单停留在部分发货,finish_delivery=0。
  • 100003、268545009 属于明确可重试;606049 属于明确不可重试。

可复现的排查顺序

  1. 查订单详情,先看状态与 deliver_method。 用 order_id 拉详情,确认 status 落在可发货区间;deliver_method:0 快递发货、1 无需快递/手机号发货、3 无需快递/可选发货账号类型。deliver_type=3 只在 deliver_method=1 下成立,否则会直接得到 606008。
  2. 验 product_infos 覆盖量。 对照订单商品逐项核 product_id / sku_id / product_cnt:商品是否属于该订单、是否已发货、是否已完成售后、数量是否与剩余可发数量一致。覆盖不全报 109002 或 109000,id 写错报 606031,虚拟商品拆包报 606051。
  3. 验物流三件套。 delivery_id 取自快递公司列表接口,非主流填 OTHER;waybill_id 必须匹配快递公司提供的正则(6060479),字段格式问题报 606004 / 606005;已有在线物流单的订单不能自寄(109205);店铺自寄额度到顶(606064)直接换电子面单,不要在单号上继续试。
  4. 验订单侧是否被并发改动。 10020115(用户改地址)、10020276(换 sku)需先处理;100003 直接重试。
  5. 验管控与资质。 606049 停手等平台通知,不重试;606045 / 606034 走质检流程;课程商品检查 606036 / 606037 / 606038 / 606048;国补与无人机核对 SN(606060 / 606067 / 606068)与 268545xxx 系列。
  6. 看事件落库是否正确。 调用成功后以 channels_ec_order_deliver 的 finish_delivery 判断是部分发货还是全部完成,并与本地发货单对账。

公共错误码

错误码含义
40001access_token 无效或不是最新(可能被其他业务同时刷新过)
42001access_token expired
45009日调用配额上限
45011每分钟频率限制
45035 / 61004 / 40164IP 不在白名单(微信小店白名单在「微信小店 - 服务市场 - 经营工具 - 自研」配置)
48001api unauthorized(token 类型用错 / 功能未开通)

文档链接

推荐文章

程序员茄子在线接单