主流快递信息 API 服务商
选择合适的 API 服务商是第一步,目前市场上主要有以下几类服务商:
综合性物流数据平台 (推荐)
这类平台通过技术手段与各大快递公司官方系统对接,提供统一的查询接口,是大多数开发者的首选。

-
快递鸟
- 特点:国内非常知名的物流数据服务商,对接了顺丰、三通一达、京东、EMS 等几乎所有主流快递公司,提供免费试用套餐,文档清晰,接入相对简单。
- 网址:
https://www.kdniao.com/
-
聚合数据
- 特点:综合性数据服务商,除了快递查询,还提供天气、手机号归属地等多种 API,同样支持多家快递公司查询。
- 网址:
https://www.juhe.cn/
-
数据宝
- 特点:同样提供物流数据查询服务,对接官方数据源,数据准确度高。
- 网址:
https://www.shujubao.com/
优点:

- 一站式服务:一个接口即可查询多家快递,无需对接每个快递公司。
- 稳定可靠:由专业团队维护,服务稳定性高。
- 数据准确:直接对接官方或权威数据源。
缺点:
- 通常收费:免费额度有限,商业项目需要付费购买套餐。
- 依赖第三方:服务质量和稳定性依赖于第三方平台。
快递公司官方 API
部分大型快递公司开放了官方 API,适合对特定快递有深度需求或追求最高数据准确性的场景。
-
顺丰速运
- 特点:开放了企业级 API,数据最权威,但申请流程相对复杂,需要企业资质,对接成本较高。
- 网址:
https://www.sf-express.com/sf-service-web/
-
京东物流
(图片来源网络,侵删)- 特点:同样提供开放平台,主要服务于其生态内的合作伙伴,数据质量高。
- 网址:
https://open.jdcloud.com/
-
EMS
- 特点:提供官方查询接口,但文档和稳定性可能不如商业平台。
优点:
- 数据权威:第一手数据,最准确。
- 服务稳定:直接来自源头。
缺点:
- 对接复杂:通常需要企业认证,流程繁琐。
- 接口不一:每个快递公司都需要单独对接,开发工作量大。
- 部分不开放:很多快递公司不向个人或中小开发者开放 API。
开源项目/爬虫方案
- 特点:利用 Python 等语言编写爬虫,模拟浏览器行为去抓取快递公司官网或官方 App 的数据。
- 代表项目:GitHub 上有一些开源的快递查询项目,如
kuaidi100的 Python 封装等。
优点:
- 免费:理论上没有 API 调用费用。
缺点:
- 不稳定:网站反爬机制升级后,爬虫极易失效,需要持续维护。
- 法律风险:未经授权抓取数据可能违反网站的服务条款,存在法律风险。
- 效率低:速度慢,且容易被封禁 IP。
- 维护成本高:需要投入精力持续更新和维护爬虫代码。
对于绝大多数开发者,强烈推荐使用第一类“综合性物流数据平台”。
技术实现步骤 (以快递鸟为例)
下面以 快递鸟 为例,详细说明接入流程,其他服务商的流程大同小异。
步骤 1:注册并获取 API Key
- 访问快递鸟官网 (
kdniao.com),完成注册。 - 登录后台,找到“我的应用”或类似菜单。
- 创建一个新的应用,系统会为你分配两个关键参数:
- EBusinessID:你的电商ID。
- APIKey:用于请求签名的密钥。
- 根据你的业务量,购买或选择合适的套餐(通常有免费试用额度)。
步骤 2:理解 API 请求与响应格式
快递鸟的 API 通常采用 HTTP POST 请求,数据格式为 JSON,为了确保请求的安全性,所有请求都需要进行签名。
请求参数
你需要构造一个 JSON 对象作为请求体,包含以下关键信息:
RequestType: 请求指令,1002表示即时查询。EBusinessID: 你的电商ID。RequestData: 查询数据本身,是一个 JSON 字符串,里面包含:OrderCode: 你的订单号(可选)。ShipperCode: 快递公司代码(顺丰是SF,中通是ZTO)。LogisticCode: 快递单号。
DataSign: 请求签名,用于验证请求的合法性。
签名算法
签名是保证 API 安全的关键,快递鸟的签名算法通常是:
DataSign = base64(HMAC-SHA256(EBusinessID + RequestData, APIKey))
你需要将 EBusinessID 和 RequestData(注意是原始的JSON字符串,不是转义后的)拼接起来,然后用你的 APIKey 作为密钥,进行 HMAC-SHA256 加密,最后将结果进行 Base64 编码。
步骤 3:编写代码调用 API
下面是一个使用 Python 调用快递鸟 API 的完整示例。
准备工作:
你需要安装 requests 和 hashlib 库。
pip install requests
Python 代码示例:
import requests
import json
import hashlib
import hmac
import base64
# 1. 配置信息 (请替换成你自己的)
EBusinessID = '你的电商ID'
APIKey = '你的API密钥'
ReqURL = 'https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx'
def get_tracking_info(shipper_code, logistic_code):
"""
获取快递物流信息
:param shipper_code: 快递公司编码 (e.g., 'SF' for 顺丰)
:param logistic_code: 快递单号
:return: 物流轨迹信息列表
"""
# 2. 构造请求数据
request_data = {
'OrderCode': '', # 可选,你的订单号
'ShipperCode': shipper_code,
'LogisticCode': logistic_code
}
# 将请求数据转换为JSON字符串
request_data_json = json.dumps(request_data, separators=(',', ':'), ensure_ascii=False)
# 3. 生成DataSign签名
# 注意:签名字符串是 EBusinessID + RequestData
sign_str = EBusinessID + request_data_json
# HMAC-SHA256 加密
hmac_code = hmac.new(APIKey.encode('utf-8'), sign_str.encode('utf-8'), hashlib.sha256).digest()
# Base64 编码
data_sign = base64.b64encode(hmac_code).decode('utf-8')
# 4. 构造最终请求体
body = {
'RequestType': '1002',
'EBusinessID': EBusinessID,
'RequestData': request_data_json,
'DataSign': data_sign
}
# 5. 发送HTTP POST请求
headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
response = requests.post(ReqURL, data=body, headers=headers)
# 6. 解析响应
try:
result_json = response.json()
if result_json.get('Success') == True:
# 成功,返回物流轨迹
return result_json.get('Traces', [])
else:
# 失败,返回错误信息
return [{'AcceptTime': 'N/A', 'AcceptStation': f'查询失败: {result_json.get("Reason", "未知错误")}'}]
except Exception as e:
return [{'AcceptTime': 'N/A', 'AcceptStation': f'API调用异常: {str(e)}'}]
# --- 使用示例 ---
if __name__ == '__main__':
# 查询一个顺丰快递
sf_code = 'SF'
sf_number = 'SF1234567890' # <--- 替换成真实的快递单号
# 查询一个中通快递
zto_code = 'ZTO'
zto_number = 'ZT9876543210' # <--- 替换成真实的快递单号
print(f"--- 正在查询顺丰快递 {sf_number} ---")
traces_sf = get_tracking_info(sf_code, sf_number)
for trace in traces_sf:
print(f"{trace['AcceptTime']} | {trace['AcceptStation']}")
print(f"\n--- 正在查询中通快递 {zto_number} ---")
traces_zto = get_tracking_info(zto_code, zto_number)
for trace in traces_zto:
print(f"{trace['AcceptTime']} | {trace['AcceptStation']}")
重要注意事项
-
数据安全与隐私:
- 切勿泄露 APIKey:
APIKey相当于你的密码,一定要妥善保管,不要硬编码在客户端代码(如网页 JS、App 前端)中。 - 服务器端调用:API 调用应在自己的后端服务器上进行,然后将结果返回给前端,这是最佳安全实践。
- 切勿泄露 APIKey:
-
快递公司代码:
- 每个服务商都有自己的一套快递公司编码列表(如
SF,ZTO,YTO),在调用前,务必查阅服务商提供的文档,确保编码正确。
- 每个服务商都有自己的一套快递公司编码列表(如
-
错误处理:
- API 可能会因为各种原因失败(如单号错误、快递公司接口维护、网络问题等)。
- 你的代码必须做好错误处理,解析 API 返回的错误信息(如
Success: false和Reason字段),并向用户展示友好的提示,而不是直接抛出异常。
-
调用频率限制:
所有付费 API 都有调用频率限制(如 QPS,每秒查询次数)和总调用次数限制,务必在设计中考虑这一点,避免因高频调用导致服务被暂停或产生额外费用,可以引入本地缓存机制,对短时间内重复查询的同一单号,直接返回缓存结果。
-
数据准确性:
虽然主流平台的数据源可靠,但仍可能存在极少数延迟或错误的情况,对于高时效性要求极高的业务,需要有相应的兜底方案。
希望这份详细的指南能帮助你顺利地集成快递查询功能!
