☞ 背景

  • 最近进行网站后台开发,需要实现物流的即时查询,
    为了方便以后的业务需求,经过比较,最后选择使用 第三方物流 ——【快递鸟
  • 同时,在此进行整理,希望能帮到有需求的道友们,谢谢 …

官方文档: 快递鸟 —— 即时查询 API

开发框架:ThinkPHP5.1.2

【提示】(2020-02-09)

当前,免费版只可以支持三通物流信息的查询,如果想查询其他物流信息,需购买其他产品服务;同时升级购买后根据技术对接,尚需要进行必要参数的修整,针对京东、顺丰物流注意CustomerName参数的补充


☞ 开发步骤

①. 前期准备

  • 首先要进行快递鸟账号的注册
    并根据对方的要求,完善用户申请。
    然后,根据自己的需求,开通所需服务(如果只是进行物流信息的查询,以当前业务查询次数较少为例):

②. 集成类的使用

  • 首先需要登录 快递鸟
    获取账号的 用户IDAPI key
    对所提供源码中的 集成类 BirdExpress.php ,进行配置项的替换操作
  • 然后
    将集成类整合到你的项目框架,根据框架规则进行必要修改(框架不同规则自然多数不同,本人为 ThinkPHP5.1.2
    下图为简单的调用测试:
  • 注意【2019.06.10 补充】

测试发现,线上的 Linux 系统下无法识别命名空间大小写情况,在此建议 namespace app\api\Controller,都改成小写字母

③. 核心处理方法源码

  • 首先,官方的代码 demo获得的物流信息是 正序展示 的
    为了方便物流信息的倒序展示,我进行了对数组Traces 的 反转操作
 /*** 核心方法* Json方式 查询订单物流轨迹* @param string $ShipperCode 快递公司编码* @param string $LogisticCode 物流单号* @param int $arrayFlag 是否进行数组转化标志 默认0:否  1:转化* 参考规则举例:* $requestData = "{'OrderCode':'','ShipperCode':'ZTO','LogisticCode':'640041334612'}";* @return result 包含即时物流信息的 Json数据*/public function getOrderTracesByJson($ShipperCode = "",$LogisticCode = "",$arrayFlag = 0){$requestData = "{   'OrderCode':'','ShipperCode':'$ShipperCode','LogisticCode':'$LogisticCode'}";$postData = array('EBusinessID' => $this->EBusinessID,'RequestType' => '1002',//接口指令1002'RequestData' => urlencode($requestData),'DataType' => '2',);$postData['DataSign'] = $this->encrypt($requestData, $this->AppKey);$result = $this->sendPost($this->ReqURL, $postData);//根据公司业务处理返回的信息......if ($arrayFlag){$result = json_decode($result,true);//TODO 方便物流信息的倒序展示,进行数组反转$result['Traces'] = array_reverse($result['Traces']);}return $result;}

④. 效果展示截图

[重要提示]: 代码逻辑梳理,以及整体业务设计构化

  • 通过上面核心源码的展示,你应该会注意到

调用其方法,必须要传入 快递公司编码 和 物流单号 这两个参数

  • 好在,官方提供了 快递公司编码, 所以,鄙人的设计思路如下:
1. 根据官方提供的快递公司编码 Excel 表取出其中的 "快递公司"和"编码"两列数据存储到本地数据表如果使用的快递数量较集中,可以自己建表输入如果是通用性的快递使用,建议直接对 excel 表转化为 mysql (或其他数据表)存储

如果需要进行 excel 表的导入操作,可直接参考对应文章: ThinkPHP5.1 excel 表的导入导出操作 (PHPExcel)

2. 在后台操作人员输入快递单号时同时要求选择快递公司,获得 "编码"从而保证,在数据表中,存储的快递单号唯一匹配到一个编码,继而方便后面进行快递信息查询时,可同时获得所需的两个参数.
  • 参考文章 —— PHP实现物流查询(通过快递网API实现)

>>> 源码上传 >>>


☞ 附录

①. 为什么我选择使用 快递鸟API

首先,我拥有一个,测试物流单号:640041334612 (中通快递),然后使用多个快递查询服务,效果如下:

  • 注意,毕竟是几年前的对比,此时或许有了优化!!
通過比較发现:
1. "快递100" 没有查到结果;"爱查快递" 得出的结果并不是真实的物流信息2. "快递网" 能查到快递信息,但是询问服务人员时知晓:要么网站上添加对方链接(我的管理后台以及小程序、app是不能这样玩的);要么需要进行套餐定制,最低的大概一年1000 —— (前期网站是不需要那么大的 查询业务的,感觉浪费),而且,我不喜欢官网的设计风格(任性了)3. "快递鸟",最让我动心的是那个 "限500次/天(即时查询)" 是免费的对于业务量前期不大的网站足够使用,即便后期有需要,也可以直接进行套餐升级【但是,如今免费版本,仅支持三个物流的查询!!!】

②.快递 100 参考方式 (2021-02-23)

  • 最近对之前项目的物流查询进行续费操作时
    发现用不了太多的查询次数
    但是,快递鸟没有按次数计费的业务
    于是,发现 快递100 对于业务量不大的网站,提供多项选择业务

  • 在此,提供一下,简单的实现方式

    快递100实时快递查询接口

  • 参考代码如下:

    /*** 快递100 物流信息获取 API* 测试代码已完成,后期可使用* @param string $strCom 物流代码* @param string $strNum    物流单号* @param string $strPhone  收、寄件人的电话号码(手机和固定电话均可,只能填写一个,顺丰单号必填,其他快递公司选填。如座机号码有分机号,分机号无需上传。)* @return array*/public function getOrderTracesByKd100Json($strCom = 'shunfeng', $strNum = 'SF1306899205932', $strPhone = 'phone'){//参数设置$key = 'CTjhulIU7xxxx';    //客户授权key$customer = 'B714D3D08F29CFxxxxxxxxxxxxxxxxxxxx';    //查询公司编号$param = array('com' => $strCom,             //快递公司编码'num' => $strNum,     //快递单号'phone' => $strPhone,                //手机号'from' => '',                 //出发地城市'to' => '',                   //目的地城市'resultv2' => '1'             //开启行政区域解析);//请求参数$post_data = array();$post_data["customer"] = $customer;$post_data["param"] = json_encode($param);$sign = md5($post_data["param"] . $key . $post_data["customer"]);$post_data["sign"] = strtoupper($sign);$url = 'http://poll.kuaidi100.com/poll/query.do';    //实时查询请求地址$params = "";foreach ($post_data as $k => $v) {$params .= "$k=" . urlencode($v) . "&";  //默认UTF-8编码格式}$post_data = substr($params, 0, -1);//发送post请求$ch = curl_init();curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$result = curl_exec($ch);$data = str_replace("\"", '"', $result);//TODO 物流信息都在 $data 中,根据自己的需求进行提取$data = json_decode($data, true);if ($data['status'] == '200') {$xxxData = $data['data'];foreach ($xxxData as $key => $val) {$xxxData[$key]['AcceptTime'] = $val['time'];$xxxData[$key]['AcceptStation'] = $val['context'];}$opResult['Traces'] = $xxxData;} else {$opResult['Traces'] = null;}//var_dump($opResult);return $opResult;}

优化建议

  • 首先,通过多第三方物流服务的比较会发现
    基本都满足同一个订单号,一天内查询多次都记为一次
    但是,第二天再次查询就会计数加一

  • 为了减少对第三方接口的频繁调用
    可以将当天第一次查询的物流单号及其物流信息缓存
    如果一来,当天就不会再访问物流接口

假设场景

  当下有恶意攻击用户,想浪费我们网站对物流接口的次数调用不断对各种物流单号做查询请求此时,我们要考虑的就是对恶意请求的拦截处理比如只有在商品订单中记录的物流单号,才可进行接口调用如果条件允许,也可设置为每天最多对同一个订单号查三次,多余的查询直接访问缓存其次,注意对已经收货的订单号限制其对物流接口的调用,以避免资源浪费可以设计为数据库标记位变动 “已收货”,不再执行查询接口操作 ...

具体业务需求,可根据自己的实际情况做优化

PHP 快递查询源码指导 (快递鸟API)相关推荐

  1. java计算机毕业设计校园快递管理系统源码+数据库+系统+lw文档+mybatis+运行部署

    java计算机毕业设计校园快递管理系统源码+数据库+系统+lw文档+mybatis+运行部署 java计算机毕业设计校园快递管理系统源码+数据库+系统+lw文档+mybatis+运行部署 本源码技术栈 ...

  2. 集运转运系统源码,快递物流一件代付系统源码

    集运转运系统源码,快递物流一件代付系统源码 包裹管理 会员可以预报包裹,入库后可以对包裹申请各种增值服务如分箱,合箱,拍照,清点.选择发货渠道,创建运单等等. 管理员可以用扫描枪扫描入库,同步打印出包 ...

  3. java计算机毕业设计快递物流管理源码+数据库+lw文档+系统

    java计算机毕业设计快递物流管理源码+数据库+lw文档+系统 java计算机毕业设计快递物流管理源码+数据库+lw文档+系统 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件: ...

  4. 计算机毕业设计Java“小蜜蜂”校园代取快递系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java"小蜜蜂"校园代取快递系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java"小蜜蜂"校园代取快递系统(源码+系统+mys ...

  5. 10.智能快递柜(源码下载)

    1.智能快递柜(开篇) 2.智能快递柜(终端篇) 3.智能快递柜(通信篇-HTTP) 4.智能快递柜(通信篇-SOCKET) 5.智能快递柜(通信篇-Server程序) 6.智能快递柜(平台篇) 7. ...

  6. layui表格显示后台的多表的级联查询(多对多,多对一)带mybatis级联查询源码,已解决

    在ssm和springboot项目中我们存在表与表之间一对多和多对多的情况,那么他们就要进行级联查询查询出相关联的数据,级联查询涉及到的问题就是在一个实体类中存在另一个实体类的对象(一对一)或者对象集 ...

  7. 《快递查询-您身边的快递助手-隐私协议》

    <快递查询-您身边的快递助手-隐私协议> 快递查询:您的隐私的保护对我们来说至关重要.我们承诺不会盗取用户隐私. 适用范围: 1.信息相关 a. 本产品使用不关联个人相关用户信息,简单的一 ...

  8. 《快递查询-您身边的快递助手-技术支持》

    <快递查询-您身边的快递助手-技术支持> 快递查询-您身边的快递助手的技术支持,如果您使用中出现什么问题或者对我们产品有什么改进建议,请随时与我联系. 电话:13157820771 邮箱: ...

  9. Python实现天气查询源码

    Python天气查询源码 本文爬去的是通过 Python3 中国天气网数据,包含查询城市十五天的天气情况及今明两天的生活指数 本文实现查询有两个.py文件(city.py  weather.py) 注 ...

最新文章

  1. TensorFlow 2.2.0-rc0,这次更新让人惊奇!
  2. Eclipse启动时DDMS files not found: D:\Eclipse\adt-bundle-windows-x86_64-20131030\sdk\tool
  3. python爬虫怎么爬同一个网站的多页数据-如何用Python爬数据?(一)网页抓取
  4. NCBI SRA数据库使用详解
  5. CheckedListBox扩展方法代码
  6. MDT2012+ADK8.0+WDS部署Windows客户端(一)部署概念和方法论
  7. 如何重启apache2服务
  8. PC 平台上的一种快速 Red Hat Linux 安装方法
  9. Unity中Json文件编写注意
  10. PLSQL 使用教程
  11. 【数据库学习】数据库平台:Postgres(PG)与PostgreSQL
  12. 3.取色精灵V2.0-非模态对话框自建消息队列、VS2008风格对话框、使用Common Controls、悬浮透明窗口、使用SLIDER控件
  13. 用友U8V10.1软件安装教程
  14. 使用钉钉机器人实现运维告警信息自动发送(Python、Nagios、Shell)
  15. java utility 是什么_Java Utility类代码示例
  16. caffe从秃头到入门 /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master
  17. [转]应对新劳动法:华为万名员工“自愿”辞职[http://news.qq.com/a/20071030/001675.htm]
  18. web前端开发浏览器兼容性 - 持续更新
  19. 运用java打印出菱形
  20. Druid之——连接池自定义数据库密码加解密的实现

热门文章

  1. C++包扩展_键盘中国免费提供下载:雅马哈PSRSX900、SX700第三版1.3G海量整合扩展音色、节奏包(含音频节奏)...
  2. 开发游戏使用的素材图片合辑--人物立绘打包下载
  3. 周鸿祎,千万别去造车!
  4. 论大学校园的“性开放”
  5. 影响域名解析生效的原因有哪些?
  6. 成都优优聚电商:商品有哪些特点
  7. ESXI6.7升级到ESXI7.0
  8. Lync 2010客户端无法登录Lync server 2013服务器的解决办法
  9. 最好用的mac卸载软件App Cleaner Pro Mac中文版
  10. Revit2016 笔记10 - Revit标注