微信小店 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_token | string | 是 | 可用 access_token 或 authorizer_access_token |
Body:
| 参数 | 类型 | 必填 | 说明 |
|---|
| order_id | number | 是 | 订单 id |
| delivery_list | objarray | 是 | 物流信息 |
| delivery_list[].waybill_id | string | 否 | 快递单号,deliver_type=1 时必填 |
| delivery_list[].delivery_id | string | 否 | 快递公司 id,通过获取快递公司列表接口获得,非主流快递公司可以填 OTHER,deliver_type=1 时必填 |
| delivery_list[].product_infos | objarray | 是 | 包裹中的商品信息 |
| delivery_list[].product_infos[].product_id | string | 是 | 商品 id |
| delivery_list[].product_infos[].sku_id | string | 是 | sku id |
| delivery_list[].product_infos[].product_cnt | number | 是 | 商品数量 |
| delivery_list[].deliver_type | number | 是 | 发货方式:1 自寄快递发货;3 虚拟商品无需物流发货(只有 deliver_method=1 的订单可以使用虚拟发货) |
| delivery_list[].course_info | object | 否 | 课程相关信息:start_time / end_time 时间戳;course_path{type 0=小程序地址, wxa_appid, wxa_path} |
| delivery_list[].sn_info | object | 否 | 商品 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 个)
| 错误码 | 含义 |
|---|
| 606004 | delivery_id 不合法 |
| 606005 | waybill_id 不合法 |
| 606008 | deliver_type 不符合要求(普通订单用快递发货,虚拟商品订单无需物流发货,检查 deliver_method) |
| 606046 | 请使用电子面单发货 |
| 606061 | 国补订单只能用特定的快递公司 |
| 606064 | 当前店铺的自行寄件额度已达上限(请使用电子面单、在线寄件等平台官方工具) |
| 6060479 | 快递单号与物流公司提供的正则表达式不匹配 |
| 109205 | 当前订单已经下单在线物流单,不允许自寄发货 |
商品层:商品匹配、数量与 SN(7 个)
| 错误码 | 含义 |
|---|
| 109000 | 发货失败,请检查 errmsg 中返回的商品是否正确填写(订单是否包含该商品、是否已发货、是否已完成售后无法发货、数量是否正确) |
| 606031 | 发货请求里 product_id 或 sku_id 填写不正确 |
| 606051 | 虚拟商品必须整单发货 |
| 606060 | 国补订单需要 sn 码 |
| 606067 | 该订单为无人机类目,发货前必须填写 SN 码 |
| 606068 | SN 码有误(仅支持英文字母与数字组合,长度不超过 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。
开放社区官方答复(发货相关):
- 一个订单多商品多包裹发货,
delivery_list 中每个包裹需独立配置 product_infos,且所有包裹 product_cnt 之和必须等于订单总购买数量;若后续调用未覆盖全部商品或数量不一致,系统视为「部分发货」,不触发通知;微信小店仅在订单状态变为「全部发货」时推送通知;同一订单已成功发货后再次调用相同 delivery_list 可能返回成功但不触发通知。 - 电子面单代发场景(店铺 A 打印店铺 B 订单):Body
ec_order_list 中填写 ewaybill_order_code 和 ewaybill_order_appid,不得填写 ec_order_id;这两个字段用店铺 B 的信息,其他参数(网点、模板)用店铺 A 的信息。 - 换货单发货打电子面单:用原销售单的单号和电子面单 id 打单,换货在发货前发生,不会有问题。
- 售后单退款状态看
refund_resp.result_code 与 return_code 均为 SUCCESS。 - 超期未发货订单不能删除,只能走退款 / 取消闭环。
幂等相关的实际行为:
- 已全部发货后重复提交 → 109001,不应作为可重试错误。
- 已成功发货的同一
delivery_list 再次提交 → 可能返回成功,但不重复触发通知。 - 部分覆盖的提交 → 可能返回成功,订单停留在部分发货,
finish_delivery=0。 - 100003、268545009 属于明确可重试;606049 属于明确不可重试。
可复现的排查顺序
- 查订单详情,先看状态与
deliver_method。 用 order_id 拉详情,确认 status 落在可发货区间;deliver_method:0 快递发货、1 无需快递/手机号发货、3 无需快递/可选发货账号类型。deliver_type=3 只在 deliver_method=1 下成立,否则会直接得到 606008。 - 验
product_infos 覆盖量。 对照订单商品逐项核 product_id / sku_id / product_cnt:商品是否属于该订单、是否已发货、是否已完成售后、数量是否与剩余可发数量一致。覆盖不全报 109002 或 109000,id 写错报 606031,虚拟商品拆包报 606051。 - 验物流三件套。
delivery_id 取自快递公司列表接口,非主流填 OTHER;waybill_id 必须匹配快递公司提供的正则(6060479),字段格式问题报 606004 / 606005;已有在线物流单的订单不能自寄(109205);店铺自寄额度到顶(606064)直接换电子面单,不要在单号上继续试。 - 验订单侧是否被并发改动。 10020115(用户改地址)、10020276(换 sku)需先处理;100003 直接重试。
- 验管控与资质。 606049 停手等平台通知,不重试;606045 / 606034 走质检流程;课程商品检查 606036 / 606037 / 606038 / 606048;国补与无人机核对 SN(606060 / 606067 / 606068)与 268545xxx 系列。
- 看事件落库是否正确。 调用成功后以
channels_ec_order_deliver 的 finish_delivery 判断是部分发货还是全部完成,并与本地发货单对账。
公共错误码
| 错误码 | 含义 |
|---|
| 40001 | access_token 无效或不是最新(可能被其他业务同时刷新过) |
| 42001 | access_token expired |
| 45009 | 日调用配额上限 |
| 45011 | 每分钟频率限制 |
| 45035 / 61004 / 40164 | IP 不在白名单(微信小店白名单在「微信小店 - 服务市场 - 经营工具 - 自研」配置) |
| 48001 | api unauthorized(token 类型用错 / 功能未开通) |
文档链接