# 扫一扫查快递

微信物流服务「扫一扫查快递」功能开放快递公司接入，用户在微信内用"扫一扫"扫快递运单条码、用"搜一搜"、"指尖搜索"搜索运单号等场景，可以实时查询/分享/收藏该物流轨迹、联系快递公司客服、微信支付该运单的费用以及跳转到该快递公司小程序等功能。

> "扫一扫查快递" 功能页面
>
> ![](https://res.wx.qq.com/op_res/uXR2KQFtnPOWJUvnsOFL8s2_AKGoSbiOy5eTyKS2IqY_s55oAMsw9bTefb1u_BC6K3Jhn_XVDTK_h5uCWXeFyg)

## 一、接入流程

### 1. 邮件申请

**发送申请邮件至wxwuliu@tencent.com**

> **【邮件标题】** 快递公司名称 - 扫一扫快递接入申请
>
> **【邮件内容】** 计划实现的功能、运力小程序的appid（小程序需要完成微信认证）、运力的正式服务器地址（微信侧请求该地址获取轨迹、运力的测试服务器地址（用于接入测试）、运力的运单正则表达式（后续如果有更新，需要发邮件通知微信侧）、运力名称、运力客服电话、运力跳转小程序appid和path、自定义cell跳转
>
> **【邮件附件】**《营业执照》、《快递业务经营许可证》扫描件

我们会在收到邮件后的1个工作日内进行反馈。

### 2. 协议签署

符合接入要求的快递公司，会收到邮件回复，包含接入指引和《合作协议》。

### 3. 开发调试

- 提供白名单测试运单码
- 提供运单判断规则，以正则表达式形式（用于判断数据拉取）
- 按照本接口文档设计和开发，其中部分信息需要由微信协助配置
- 以邮件和微信群形式沟通

### 4. 审核发布

接口开发完成，微信侧确认，通过性能和安全审核后发布，发布后的页面所有用户可以扫码查看。

## 二、接入前准备

### 1. 快递信息查询接口

用以微信前端通过JsonP 方式获取运单的信息

### 2. 落地页Cell信息

快递公司需要提供一组 Cell 的信息，每个 Cell 包括:

- `Key`：Cell 的标识码，快递公司自定义, 不超过 20 字符
- `Name`：Cell 展示的名称，如"支付运单"
- `Link`：Cell 点击外跳的 url 地址

## 三、接口开发文档

### 1. 查询快递信息的接口

接口说明 ：微信使用 `JsonP` 的方式到快递公司拉取快递运单信息 。

请求url示例：

> 假定快递公司配置的回调URL是 A，则请求URL 格式如下：
>
> A?orderid==xxx&openid=xxx&signature=xxx&timestamp=xxx&nonce=xxx&callback=xxx
>
> 通过 http Get 访问 url

**请求参数说明**

| 参数       | 说明                                                                                                                                                                                                    |
| :--------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| orderid    | 运单号                                                                                                                                                                                                  |
| openid     | 当访问者openid，可唯一标识用户                                                                                                                                                                          |
| signature  | 微信加密签名，签名算法为sha1(token、timestamp、nonce三个参数字符串升序排序后拼接的字符串)，输出的签名结果为小写16进制串，长度40，token来自快递方提交的公众号所配置的token，timestamp及nonce来自链接参数 |
| timestamp  | 时间戳                                                                                                                                                                                                  |
| nonce      | 随机数                                                                                                                                                                                                  |
| callback   | WxOrderCb                                                                                                                                                                                               |
| company_id | 快递公司编码，快递鸟使用                                                                                                                                                                                |

**返回参数说明**

```js
WxOrderCb(OrderInfo的json数据)
```

**OrderInfo说明**

| 参数                    | 说明                                                       |
| :---------------------- | :--------------------------------------------------------- |
| err_code                | 0表示成功，否则返回相关错误码                              |
| err_msg                 | ok表示成功，否则返回相关错误信息                           |
| traces                  | 物流轨迹详情列表，数组，下面具体解释包含字段               |
| cells                   | Cell列表，数组，下面有具体解释包含字段                     |
| estimated_delivery_time | 预计送达时间，格式：yyyy-mm-dd, 当订单状态为非已签收时返回 |
| order_status            | 订单状态，定义见OrderStatus                                |

**traces数组内每个元素字段说明**
| 参数 | 说明 |
| :---------------------- | :--------------------------------------------------------- |
| accept_time | 物流轨迹产生时间，格式：yyy-mm-dd hh:mm:ss |
| accept_address | 物流轨迹状态和描述，格式：X \n Y (X状态，Y描述)  例如：运输中 \n 快件已从杭州枢纽中心发出，正在发往深圳转运场。|
| remark | 物流轨迹产生地点

**cells数组内每个元素字段说明**
| 参数 | 说明 |
| :---------------------- | :--------------------------------------------------------- |
| key | Cell的标识码，快递公司提前配置，不超过20个字符 |
| value | Cell右侧的引导语，不超过10个字符 |
| status | url参数，快递公司自定义，用于点击Cell时拼接在Url后外跳 |

**OrderStatus定义**

| 值  | 说明     |
| :-- | :------- |
| 0   | 待揽件   |
| 1   | 已揽件   |
| 2   | 运输中   |
| 3   | 派送中   |
| 4   | 已签收   |
| 5   | 签收异常 |
| 6   | 代签收   |

**OrderInfo示例**

```json
{
    "err_code":0,
    "err_msg":"ok",
    "traces":[
        {
            "accept_time":"2014-12-08 22:55:49",
            "accept_address":"虎门中转部",
            "remark": "派件中"
        },
        ...
    ],
    "cells": [
        {
        	"key": "wxpay",
        	"value": "已支付",
        	"status": "pages/index/index",
        },
        ...
    ],
    "estimated_delivery_time": "2019-09-30",
    "order_status": 3
}
```

**签名示例**

token=1a2b3c456,timestamp=123456,nonce=13578

value按字典序升序排列后为123456，13578，1a2b3c456

签名为sha1(123456135781a2b3c456)=5eff852d33f84c33ef1c3a792d3ffb941d6b0261

**最终完整的返回数据为**

```js
WxOrderCb({"order_status":2,"cells":[{"value":"寄快递","key":"order"}],"err_msg":"ok","estimated_delivery_time":"2020-07-08","traces":[{"accept_address":"【河北永清县】（0316-6840631） 的 操作一组（15731691877） 已揽收","remark":"河北永清县","accept_time":"2020-07-04 20:47:03"},{"accept_address":"快件离开 【河北永清县】 已发往 【贵阳】","remark":"河北永清县","accept_time":"2020-07-04 21:44:38"},{"accept_address":"快件已经到达 【华北操作部】","remark":"华北操作部","accept_time":"2020-07-05 01:33:05"},{"accept_address":"快件离开 【华北操作部】 已发往 【贵阳】","remark":"华北操作部","accept_time":"2020-07-05 18:15:24"},{"accept_address":"快件已经到达 【贵阳】","remark":"贵阳","accept_time":"2020-07-07 05:55:46"},{"accept_address":"快件离开 【贵阳】 已发往 【遵义】","remark":"贵阳","accept_time":"2020-07-07 07:28:23"},{"accept_address":"快件已经到达 【遵义】","remark":"遵义","accept_time":"2020-07-07 13:42:07"},{"accept_address":"快件离开 【遵义】 已发往 【遵义桂花社区】","remark":"遵义","accept_time":"2020-07-07 13:44:42"}],"err_code":0})
```

**扫码示例图**

![](https://res.wx.qq.com/op_res/uXR2KQFtnPOWJUvnsOFL8s2_AKGoSbiOy5eTyKS2IqY_s55oAMsw9bTefb1u_BC6K3Jhn_XVDTK_h5uCWXeFyg)

### 2. 自定义cell跳转

扫一扫落地页提供了cell位可供实现运力的支付相关功能需要提供跳转的小程序appid与跳转path以及cell位的代号key
运力方在查询快递信息接口返回需要显示的cell位（通过代号key），微信将需要展示的cell位链接拼上额外参数后给到前端，用户点击后跳转到该链接。
具体的额外参数定义如下：

| 参数      | 说明                                                                                                                                                              |
| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| orderid   | 运单号                                                                                                                                                            |
| openid    | 当访问者openid，可唯一标识用户                                                                                                                                    |
| signature | 微信加密签名，签名算法为sha1(token+timestamp+nonce)，输出的签名结果为小写16进制串，长度40，token来自快递方提交的公众号所配置的token，timestamp及nonce来自链接参数 |
| timestamp | 时间戳                                                                                                                                                            |
| nonce     | 随机数                                                                                                                                                            |

如cell配置了一个支付快递的链接`pages/test/pay`
用户点击时访问的链接为
`pages/test/pay?timestamp=1592811835&nonce=1756708668&signature=05d22a5ef341200dec391208bc7bb6bf8e30780d&orderid=6000069559003&openid=omJOjjvB9iYTYiEKp7GFfweffQPmdU`

**自定义cell示例图**

![](https://res.wx.qq.com/op_res/5JEIA5mX7b-KlsWPkPULG-tXltacZr6f-rGt1w6-I-FMvFyOu7N2gzR7Mvnsbf7wexiRgvdkIbwPVs30RcdOjQ)
