# 预下配送单

[调试诊断](https://developers.weixin.qq.com/console/devtools/debug?utm_source=api_tools)

> 接口应在服务器端调用，不可在前端（小程序、网页、APP等）直接调用，具体可参考[接口调用指南](/doc/oplatform/developers/dev/guide.md)。

接口英文名：preAddOrder

#### 使用场景描述

- 在用户提交外卖订单时，商家可调用本接口查询配送公司是否可接单、预计多久接单、运费预估等。预估运费可作为展示给用户的运费参考值。
- 举个例子：商家通过预下配送单接口返回的预估运费是8元，商家可决定前端顾客下外卖单时展示给顾客看的运费是真实的8元，还是其他商家指定的金额。
- 说明：本接口非必须调用接口，若不需要获取配送公司是否可接单、预计多久接单、运费预估等，也可不调用本接口，直接下配送单。
- 顺丰同城可返回配送费用、配送距离、预计骑手接单时间，不支持返回delivery_token。
- 闪送可返回配送费用、配送距离、预计骑手接单时间，不支持返回delivery_token。
- 美团配送返回0时表示校验通过，不支持返回配送费用、配送距离、预计骑手接单时间和delivery_token。
- 达达支持预下单查询配送费用、配送距离、预计骑手接单时间和delivery_token(有效期3分钟)

## 1. 调用方式

### HTTPS 调用

```bash
POST https://api.weixin.qq.com/cgi-bin/express/local/business/order/pre_add?access_token=ACCESS_TOKEN
```

### 云调用

- 本接口不支持云调用。

### 第三方调用

- 本接口支持第三方平台代商家调用。

- 该接口所属的权限集 id 为：51、71

- 服务商获得其中之一权限集授权后，可通过使用 [authorizer_access_token](/doc/oplatform/developers/dev/AuthorizerAccessToken.md) 代商家进行调用，具体可查看 [第三方调用](/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/call_interface.md) 说明文档。

## 2. 请求参数

### 查询参数 `Query String Parameters`

```json
[
  {
    "参数名": "access_token",
    "类型": "string",
    "必填": "是",
    "说明": "接口调用凭证，可使用 [access_token](/miniprogram/dev/server/API/mp-access-token/api_getaccesstoken)、[authorizer_access_token](/doc/oplatform/openApi/ticket-token/api_getauthorizeraccesstoken.md)"
  }
]
```

### 请求体 `Request Payload`

```json
[
  {
    "参数名": "shopid",
    "类型": "string",
    "必填": "是",
    "说明": "商家id， 由配送公司分配的appkey"
  },
  {
    "参数名": "shop_order_id",
    "类型": "string",
    "必填": "是",
    "说明": "唯一标识订单的 ID，由商户生成, 不超过128字节"
  },
  {
    "参数名": "delivery_id",
    "类型": "string",
    "必填": "是",
    "说明": "配送公司ID"
  },
  {
    "参数名": "openid",
    "类型": "string",
    "必填": "是",
    "说明": "下单用户的openid"
  },
  {
    "参数名": "sender",
    "类型": "object",
    "必填": "是",
    "说明": "发件人信息，闪送、顺丰同城急送必须填写，美团配送、达达，若传了shop_no的值可不填该字段"
  },
  {
    "参数名": "receiver",
    "类型": "object",
    "必填": "是",
    "说明": "收件人信息"
  },
  {
    "参数名": "cargo",
    "类型": "object",
    "必填": "是",
    "说明": "货物信息"
  },
  {
    "参数名": "order_info",
    "类型": "object",
    "必填": "是",
    "说明": "订单信息"
  },
  {
    "参数名": "shop",
    "类型": "object",
    "必填": "是",
    "说明": "商品信息，会展示到物流通知消息中"
  },
  {
    "参数名": "delivery_sign",
    "类型": "string",
    "必填": "是",
    "说明": "用配送公司提供的appSecret加密的校验串说明"
  },
  {
    "参数名": "shop_no",
    "类型": "string",
    "必填": "是",
    "说明": "商家门店编号，在配送公司登记，美团、闪送必填"
  },
  {
    "参数名": "sub_biz_id",
    "类型": "string",
    "必填": "是",
    "说明": "子商户id，区分小程序内部多个子商户"
  }
]
```

### Body.sender `Object Payload`

发件人信息，闪送、顺丰同城急送必须填写，美团配送、达达，若传了shop_no的值可不填该字段

```json
[
  {
    "参数名": "name",
    "类型": "string",
    "必填": "是",
    "说明": "姓名，最长不超过256个字符"
  },
  {
    "参数名": "city",
    "类型": "string",
    "必填": "是",
    "说明": "城市名称，如广州市"
  },
  {
    "参数名": "address",
    "类型": "string",
    "必填": "是",
    "说明": "地址(街道、小区、大厦等，用于定位)"
  },
  {
    "参数名": "address_detail",
    "类型": "string",
    "必填": "是",
    "说明": "地址详情(楼号、单元号、层号)"
  },
  {
    "参数名": "phone",
    "类型": "string",
    "必填": "是",
    "说明": "电话/手机号，最长不超过64个字符"
  },
  {
    "参数名": "lng",
    "类型": "number",
    "必填": "是",
    "说明": "经度（火星坐标或百度坐标，和 coordinate_type 字段配合使用，确到小数点后6位"
  },
  {
    "参数名": "lat",
    "类型": "number",
    "必填": "是",
    "说明": "纬度（火星坐标或百度坐标，和 coordinate_type 字段配合使用，精确到小数点后6位）"
  },
  {
    "参数名": "coordinate_type",
    "类型": "number",
    "必填": "否",
    "说明": "坐标类型，0：火星坐标（高德，腾讯地图均采用火星坐标） 1：百度坐标"
  }
]
```

### Body.receiver `Object Payload`

收件人信息

```json
[
  {
    "参数名": "name",
    "类型": "string",
    "必填": "是",
    "说明": "姓名，最长不超过256个字符"
  },
  {
    "参数名": "city",
    "类型": "string",
    "必填": "是",
    "说明": "城市名称，如广州市"
  },
  {
    "参数名": "address",
    "类型": "string",
    "必填": "是",
    "说明": "地址(街道、小区、大厦等，用于定位)"
  },
  {
    "参数名": "address_detail",
    "类型": "string",
    "必填": "是",
    "说明": "地址详情(楼号、单元号、层号)"
  },
  {
    "参数名": "phone",
    "类型": "string",
    "必填": "是",
    "说明": "电话/手机号，最长不超过64个字符"
  },
  {
    "参数名": "lng",
    "类型": "number",
    "必填": "是",
    "说明": "经度（火星坐标或百度坐标，和 coordinate_type 字段配合使用，确到小数点后6位"
  },
  {
    "参数名": "lat",
    "类型": "number",
    "必填": "是",
    "说明": "纬度（火星坐标或百度坐标，和 coordinate_type 字段配合使用，精确到小数点后6位）"
  },
  {
    "参数名": "coordinate_type",
    "类型": "number",
    "必填": "否",
    "说明": "坐标类型，0：火星坐标（高德，腾讯地图均采用火星坐标） 1：百度坐标"
  }
]
```

### Body.cargo `Object Payload`

货物信息

```json
[
  {
    "参数名": "goods_value",
    "类型": "number",
    "必填": "是",
    "说明": "货物价格，单位为元，精确到小数点后两位（如果小数点后位数多于两位，则四舍五入保留两位小数），范围为(0-5000]",
    "枚举": "-"
  },
  {
    "参数名": "goods_height",
    "类型": "number",
    "必填": "否",
    "说明": "货物高度，单位为cm，精确到小数点后两位（如果小数点后位数多于两位，则四舍五入保留两位小数），范围为(0-45]",
    "枚举": "-"
  },
  {
    "参数名": "goods_width",
    "类型": "number",
    "必填": "否",
    "说明": "货物宽度，单位为cm，精确到小数点后两位（如果小数点后位数多于两位，则四舍五入保留两位小数），范围为(0-50]",
    "枚举": "-"
  },
  {
    "参数名": "goods_length",
    "类型": "number",
    "必填": "否",
    "说明": "货物长度，单位为cm，精确到小数点后两位（如果小数点后位数多于两位，则四舍五入保留两位小数），范围为(0-65]",
    "枚举": "-"
  },
  {
    "参数名": "goods_weight",
    "类型": "number",
    "必填": "是",
    "说明": "货物重量，单位为kg，精确到小数点后两位（如果小数点后位数多于两位，则四舍五入保留两位小数），范围为(0-50]",
    "枚举": "-"
  },
  {
    "参数名": "goods_detail",
    "类型": "object",
    "必填": "否",
    "说明": "货物详情，最长不超过10240个字符",
    "枚举": "-"
  },
  {
    "参数名": "goods_pickup_info",
    "类型": "string",
    "必填": "否",
    "说明": "货物取货信息，用于骑手到店取货，最长不超过100个字符",
    "枚举": "-"
  },
  {
    "参数名": "cargo_first_class",
    "类型": "string",
    "必填": "是",
    "说明": "品类一级类目,",
    "枚举": "枚举值"
  },
  {
    "参数名": "cargo_second_class",
    "类型": "string",
    "必填": "是",
    "说明": "品类二级类目",
    "枚举": "-"
  }
]
```

### Body.order_info `Object Payload`

订单信息

```json
[
  {
    "参数名": "delivery_service_code",
    "类型": "string",
    "必填": "否",
    "说明": "配送服务代码 不同配送公司自定义, 顺丰和达达不填"
  },
  {
    "参数名": "expected_delivery_time",
    "类型": "number",
    "必填": "否",
    "说明": "期望派单时间(达达支持，表示达达系统调度时间, 到那个时间才会有状态更新的回调通知)，unix-timestamp, 比如1586342180"
  },
  {
    "参数名": "order_type",
    "类型": "number",
    "必填": "否",
    "说明": "订单类型, 0: 即时单 1 预约单，如预约单，需要设置expected_delivery_time或expected_finish_time或expected_pick_time"
  },
  {
    "参数名": "poi_seq",
    "类型": "string",
    "必填": "否",
    "说明": "门店订单流水号，建议提供，方便骑手门店取货，最长不超过32个字符"
  },
  {
    "参数名": "note",
    "类型": "string",
    "必填": "否",
    "说明": "备注，最长不超过200个字符"
  },
  {
    "参数名": "order_time",
    "类型": "number",
    "必填": "否",
    "说明": "用户下单付款时间, 顺丰必填, 比如1555220757"
  },
  {
    "参数名": "is_insured",
    "类型": "number",
    "必填": "否",
    "说明": "是否保价，0，非保价，1.保价"
  },
  {
    "参数名": "declared_value",
    "类型": "number",
    "必填": "否",
    "说明": "保价金额，单位为元，精确到分"
  },
  {
    "参数名": "tips",
    "类型": "number",
    "必填": "否",
    "说明": "小费，单位为元, 下单一般不加小费"
  },
  {
    "参数名": "is_direct_delivery",
    "类型": "number",
    "必填": "否",
    "说明": "是否选择直拿直送（0：不需要；1：需要。选择直拿直送后，同一时间骑手只能配送此订单至完成，配送费用也相应高一些，闪送必须选1，达达可选0或1，其余配送公司不支持直拿直送）"
  },
  {
    "参数名": "cash_on_delivery",
    "类型": "number",
    "必填": "否",
    "说明": "骑手应付金额，单位为元，精确到分"
  },
  {
    "参数名": "cash_on_pickup",
    "类型": "number",
    "必填": "否",
    "说明": "骑手应收金额，单位为元，精确到分"
  },
  {
    "参数名": "rider_pick_method",
    "类型": "number",
    "必填": "否",
    "说明": "物流流向，1：从门店取件送至用户；2：从用户取件送至门店"
  },
  {
    "参数名": "is_finish_code_needed",
    "类型": "number",
    "必填": "否",
    "说明": "收货码（0：不需要；1：需要。收货码的作用是：骑手必须输入收货码才能完成订单妥投）"
  },
  {
    "参数名": "is_pickup_code_needed",
    "类型": "number",
    "必填": "否",
    "说明": "取货码（0：不需要；1：需要。取货码的作用是：骑手必须输入取货码才能从商家取货）"
  },
  {
    "参数名": "expected_finish_time",
    "类型": "number",
    "必填": "否",
    "说明": "期望送达时间(美团、顺丰同城急送支持），unix-timestamp, 比如1586342180"
  },
  {
    "参数名": "expected_pick_time",
    "类型": "number",
    "必填": "否",
    "说明": "期望取件时间（闪送、顺丰同城急送支持，闪送需要设置两个小时后的时间，顺丰同城急送只需传expected_finish_time或expected_pick_time其中之一即可，同时都传则以expected_finish_time为准），unix-timestamp, 比如1586342180"
  }
]
```

### Body.shop `Object Payload`

商品信息，会展示到物流通知消息中

```json
[
  {
    "参数名": "wxa_path",
    "类型": "string",
    "必填": "否",
    "说明": "商家小程序的路径，建议为订单页面"
  },
  {
    "参数名": "img_url",
    "类型": "string",
    "必填": "否",
    "说明": "商品缩略图 url；shop.detail_list为空则必传，shop.detail_list非空可不传。"
  },
  {
    "参数名": "goods_name",
    "类型": "string",
    "必填": "否",
    "说明": "商品名称, 不超过128字节；shop.detail_list为空则必传，shop.detail_list非空可不传。"
  },
  {
    "参数名": "goods_count",
    "类型": "number",
    "必填": "否",
    "说明": "商品数量；shop.detail_list为空则必传。shop.detail_list非空可不传，默认取shop.detail_list的size"
  },
  {
    "参数名": "wxa_appid",
    "类型": "string",
    "必填": "否",
    "说明": "该参数在【即时配送】的[addLocalOrder](api_addlocalorder)接口才生效。若结算方式为：第三方向配送公司统一结算，商户后续和第三方结算，则该参数必填；在该结算模式下，第三方用自己的开发小程序替授权商户发起下单，并将授权小程序的appid给平台，后续配送通知中可回流授权商户小程序。"
  }
]
```

### Body.cargo.goods_detail `Object Payload`

货物详情，最长不超过10240个字符

```json
[
  {
    "参数名": "goods",
    "类型": "objarray",
    "必填": "是",
    "说明": "货物列表"
  }
]
```

">

### Body.cargo.goods_detail.goods(Array) `Object Payload`

货物列表

```json
[
  {
    "参数名": "good_count",
    "类型": "number",
    "必填": "是",
    "说明": "货物数量"
  },
  {
    "参数名": "good_name",
    "类型": "string",
    "必填": "是",
    "说明": "货品名称"
  },
  {
    "参数名": "good_price",
    "类型": "number",
    "必填": "否",
    "说明": "货品单价，精确到小数点后两位（如果小数点后位数多于两位，则四舍五入保留两位小数）"
  },
  {
    "参数名": "good_unit",
    "类型": "string",
    "必填": "否",
    "说明": "货品单位，最长不超过20个字符"
  }
]
```

## 3. 返回参数

### 返回体 `Response Payload`

```json
[
  {
    "参数名": "resultcode",
    "类型": "number",
    "说明": "运力返回的错误码"
  },
  {
    "参数名": "resultmsg",
    "类型": "string",
    "说明": "运力返回的错误描述"
  },
  {
    "参数名": "fee",
    "类型": "number",
    "说明": "实际运费(单位：元)，运费减去优惠券费用"
  },
  {
    "参数名": "deliverfee",
    "类型": "number",
    "说明": "运费(单位：元)"
  },
  {
    "参数名": "couponFee",
    "类型": "number",
    "说明": "优惠券费用(单位：元)"
  },
  {
    "参数名": "tips",
    "类型": "number",
    "说明": "小费(单位：元)"
  },
  {
    "参数名": "insurancefee",
    "类型": "number",
    "说明": "保价费(单位：元)"
  },
  {
    "参数名": "distance",
    "类型": "number",
    "说明": "配送距离(单位：米)预计骑手接单时间，单位秒，比如5分钟，就填300, 无法预计填0"
  },
  {
    "参数名": "delivery_token",
    "类型": "string",
    "说明": "配送公司可以返回此字段，当用户下单时候带上这个字段，保证在一段时间内运费不变"
  },
  {
    "参数名": "dispatch_duration",
    "类型": "number",
    "说明": "预计骑手接单时间，单位秒，比如5分钟，就填300, 无法预计填0"
  }
]
```

## 4. 枚举信息

### Body.cargo.cargo_first_class `Enum`

品类一级类目,

```json
[
  {
    "枚举值": "美食夜宵",
    "描述": "零食小吃\n香锅/烤鱼\n西餐\n日韩料理\n海鲜/烧烤\n快餐/地方菜\n小龙虾\n披萨"
  },
  {
    "枚举值": "甜品饮料",
    "描述": "甜品\n奶茶果汁\n咖啡\n面包/糕点\n冰淇淋"
  },
  {
    "枚举值": "蛋糕",
    "描述": "蛋糕"
  },
  {
    "枚举值": "日用百货",
    "描述": "便利店\n水站/奶站\n零食/干果\n五金日用\n粮油调味\n文具店\n酒水行\n地方特产\n进口食品\n宠物用品\n超市\n书店\n宠物食品用品\n办公家居用品"
  },
  {
    "枚举值": "果蔬生鲜",
    "描述": "果蔬\n海鲜水产\n冷冻速食"
  },
  {
    "枚举值": "鲜花",
    "描述": "鲜花"
  },
  {
    "枚举值": "医药健康",
    "描述": "送药\n器材器具"
  },
  {
    "枚举值": "美妆护肤",
    "描述": "日化美妆"
  },
  {
    "枚举值": "母婴",
    "描述": "孕婴用品"
  },
  {
    "枚举值": "文件或票务",
    "描述": "保单\n票务文件\n政府文件\n证件"
  },
  {
    "枚举值": "服饰鞋帽",
    "描述": "服饰鞋帽综合"
  },
  {
    "枚举值": "洗涤",
    "描述": "脏衣服收\n干净衣服派"
  },
  {
    "枚举值": "珠宝奢侈品",
    "描述": "珠宝饰品\n奢侈品"
  },
  {
    "枚举值": "家居家装",
    "描述": "家具\n装修建材\n厨房卫浴"
  },
  {
    "枚举值": "数码产品",
    "描述": "数码产品"
  },
  {
    "枚举值": "配件器材",
    "描述": "配件器材"
  },
  {
    "枚举值": "电商",
    "描述": "电视购物\n线上商城"
  },
  {
    "枚举值": "现场勘查",
    "描述": "现场勘查"
  },
  {
    "枚举值": "快递业务",
    "描述": "快递配送"
  },
  {
    "枚举值": "其他",
    "描述": "其他"
  }
]
```

## 5. 注意事项

本接口无特殊注意事项

## 6. 代码示例

### 6.1 HTTPS调用成功返回

请求示例

```json
{
   "cargo": {
       "cargo_first_class": "美食夜宵",
       "cargo_second_class": "零食小吃",
       "goods_detail": {
           "goods": [
               {
                   "good_count": 1,
                   "good_name": "水果",
                   "good_price": 10,
                   "good_unit": "元"
               },
               {
                   "good_count": 2,
                   "good_name": "蔬菜",
                   "good_price": 20,
                   "good_unit": "元"
               }
           ]
       },
       "goods_height": 1,
       "goods_length": 3,
       "goods_value": 5,
       "goods_weight": 1,
       "goods_width": 2
   },
   "delivery_id": "SFTC",
   "delivery_sign": "01234567890123456789",
   "openid": "oABC123456",
   "order_info": {
       "delivery_service_code": "",
       "expected_delivery_time": 0,
       "is_direct_delivery": 0,
       "is_finish_code_needed": 1,
       "is_insured": 0,
       "is_pickup_code_needed": 1,
       "note": "test_note",
       "order_time": 1555220757,
       "order_type": 0,
       "poi_seq": "1111",
       "tips": 0
   },
   "receiver": {
       "address": "xxx地铁站",
       "address_detail": "2号楼202",
       "city": "北京市",
       "coordinate_type": 0,
       "lat": 40.1529600000,
       "lng": 116.5060300000,
       "name": "老王",
       "phone": "18512345678"
   },
   "sender": {
       "address": "xx大厦",
       "address_detail": "1号楼101",
       "city": "北京市",
       "coordinate_type": 0,
       "lat": 40.4486120000,
       "lng": 116.3830750000,
       "name": "刘一",
       "phone": "13712345678"
   },
   "shop": {
       "goods_count": 2,
       "goods_name": "宝贝",
       "img_url": "https://mmbiz.qpic.cn/mmbiz_png/xxxxxxxxx/0?wx_fmt=png",
       "wxa_path": "/page/index/index"
   },
   "shop_no": "12345678",
   "sub_biz_id": "sub_biz_id_1",
   "shop_order_id": "SFTC_001",
   "shopid": "122222222",
}
```

返回示例

```json
{
  "resultcode": 0,
  "resultmsg": "ok",
  "fee": 10,
  "deliverfee": 10,
  "couponfee": 0,
  "tips": 0,
  "insurancfee": 0,
  "distance": 1000,
  "dispatch_duration": 300,
  "delivery_token": "1111111"
}
```

### 6.2 HTTPS调用失败返回

请求示例

```json
{
   "cargo": {
       "cargo_first_class": "美食夜宵",
       "cargo_second_class": "零食小吃",
       "goods_detail": {
           "goods": [
               {
                   "good_count": 1,
                   "good_name": "水果",
                   "good_price": 10,
                   "good_unit": "元"
               },
               {
                   "good_count": 2,
                   "good_name": "蔬菜",
                   "good_price": 20,
                   "good_unit": "元"
               }
           ]
       },
       "goods_height": 1,
       "goods_length": 3,
       "goods_value": 5,
       "goods_weight": 1,
       "goods_width": 2
   },
   "delivery_id": "SFTC",
   "delivery_sign": "01234567890123456789",
   "openid": "oABC123456",
   "order_info": {
       "delivery_service_code": "",
       "expected_delivery_time": 0,
       "is_direct_delivery": 0,
       "is_finish_code_needed": 1,
       "is_insured": 0,
       "is_pickup_code_needed": 1,
       "note": "test_note",
       "order_time": 1555220757,
       "order_type": 0,
       "poi_seq": "1111",
       "tips": 0
   },
   "receiver": {
       "address": "xxx地铁站",
       "address_detail": "2号楼202",
       "city": "北京市",
       "coordinate_type": 0,
       "lat": 40.1529600000,
       "lng": 116.5060300000,
       "name": "老王",
       "phone": "18512345678"
   },
   "sender": {
       "address": "xx大厦",
       "address_detail": "1号楼101",
       "city": "北京市",
       "coordinate_type": 0,
       "lat": 40.4486120000,
       "lng": 116.3830750000,
       "name": "刘一",
       "phone": "13712345678"
   },
   "shop": {
       "goods_count": 2,
       "goods_name": "宝贝",
       "img_url": "https://mmbiz.qpic.cn/mmbiz_png/xxxxxxxxx/0?wx_fmt=png",
       "wxa_path": "/page/index/index"
   },
   "shop_no": "12345678",
   "sub_biz_id": "sub_biz_id_1",
   "shop_order_id": "SFTC_001",
   "shopid": "122222222",
}
```

返回示例

```json
{
  "resultcode": 1010,
  "resultmsg": "收件人信息不正确"
}
```

## 7. 错误码

以下是本接口的错误码列表，其他错误码可参考 [通用错误码](/doc/oplatform/developers/errCode/README.md)；调用接口遇到报错，可使用官方提供的 [API 诊断工具](https://developers.weixin.qq.com/console/devtools/debug?utm_source=api_errcode) 辅助定位和分析问题。

```json
[
  {
    "错误码": "40001",
    "错误描述": "invalid credential  access_token isinvalid or not latest",
    "解决方案": "获取 access_token 时 AppSecret 错误，或者 access_token 无效。请开发者认真比对 AppSecret 的正确性，或查看是否正在为恰当的公众号调用接口"
  }
]
```

## 8. 适用范围

本接口暂未明确可调用账号类型，或在业务中根据调用传参自行确定是否可调用，请以实际调用情况为准。
