多数人卡在鉴权失败:快递鸟需EBusinessID、RequestData、DataSign三者严格匹配,DataSign须对无空格JSON字符串+私钥MD5再base64;菜鸟需2小时有效access_token、精确到秒timestamp及HMAC-SHA256签名,时间偏差超15分钟即拒收。

为什么直接调用快递鸟或菜鸟的API常返回空或签名错误
多数人卡在第一步:不是接口没数据,而是请求没通过鉴权。快递鸟要求 EBusinessID、RequestData、DataSign 三者严格匹配,其中 DataSign 是对 RequestData + 用户私钥用 base64_encode(md5($data.$appkey)) 算出的——注意是原始 JSON 字符串(不含空格),不是 PHP 数组 json_encode($arr) 后直接拼。菜鸟 API 则依赖 access_token 有效期 2 小时,且每次请求需带 timestamp(精确到秒)和 sign(HMAC-SHA256 签名),时间偏差超 15 分钟直接拒收。
- 检查
RequestData是否已用urldecode()或stripslashes()清理过转义,否则 JSON 解析失败导致签名错 - 快递鸟的
DataType必须传2(返回 JSON),传1(XML)但代码按 JSON 解析会静默失败 - 菜鸟接口的
logistics_company_code必须用其官方编码(如中通是ZTO),不能用中文或简称
PHP里用cURL发请求时,header和timeout怎么设才不丢数据
物流接口响应慢是常态,尤其查偏远地区单号。默认 cURL timeout 是 30 秒,但快递鸟平均响应在 1.5–4 秒,菜鸟部分单号可能卡到 8 秒以上。header 错误则会导致 400 或 415:比如漏了 Content-Type: application/x-www-form-urlencoded(快递鸟 POST 方式),或写了 application/json 却发的是 form-data。
- 必须显式设置
curl_setopt($ch, CURLOPT_TIMEOUT, 15),别依赖默认值;超时后要检查curl_error($ch)而非只看 HTTP 状态码 - 快递鸟 POST 请求 header 只需两行:
Content-Type: application/x-www-form-urlencoded和Accept: application/json - 菜鸟 API 的 POST body 必须是 raw JSON,header 得写
Content-Type: application/json,且curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data))
解析返回的JSON时,怎样避免Notice: Trying to access array offset on value of type null
第三方接口返回结构不稳定:正常时有 Traces 数组,异常时只有 Reason 或 Code 字段;更坑的是快递鸟沙箱环境返回固定假数据(Result 恒为 true),但字段名和生产环境不一致(比如沙箱用 Traces,生产用 Traces 但内部字段多一层 Context)。直接 $res['Traces'][0]['AcceptTime'] 会崩。
- 永远先判断
isset($res['Traces']) && is_array($res['Traces']) && !empty($res['Traces']),再取值 - 快递鸟生产环境实际路径是
$res['Traces'][0]['AcceptTime'],但菜鸟返回的是$res['result']['list'][0]['time'],字段名完全不同,不能硬写死 - 用
json_last_error()检查解码是否成功,有些接口错误时返回 HTML 页面(如 502),json_decode返回 null
单号查不到或信息滞后,该优先排查哪几层
不是所有单号都能实时查——这和快递公司上报节奏、第三方聚合层缓存策略强相关。比如圆通部分网点隔天才上报首揽件,而快递鸟对未上网单号统一返回“暂无物流信息”,菜鸟则可能返回“已下单,等待揽收”。这时候查日志比改代码更有效。
- 先用浏览器直接访问快递鸟调试工具(
https://www.kdniao.com/api-order)粘贴单号测试,确认是不是单号本身问题 - 记录每次请求的完整
RequestData和原始响应体(curl_exec返回值),别只记json_decode后的结果 - 留意
State字段:快递鸟中0=已发货 1=运输中 2=签收 3=问题件,值为0但Traces为空,大概率是单号未被扫描上网
真正麻烦的是跨平台字段映射——比如“派件中”在中通叫 派件员已出发,在顺丰叫 快件在途中,没有通用翻译表,得按 LogisticCode 和 CarrierCode 分支处理。这个逻辑藏得越深,后面加新快递公司时越难动。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











