PHP 快递查询源码指导 (快递鸟API)

☞ 背景

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

官方文档: 快递鸟 —— 即时查询 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. 在后台操作人员输入快递单号时
   同时要求选择快递公司,获得 "编码"
   从而保证,在数据表中,存储的快递单号唯一匹配到一个编码,继而方便后面进行快递信息查询时,可同时获得所需的两个参数.

>>> 源码上传 >>>


☞ 附录

①. 为什么我选择使用 快递鸟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实现的免费快递查询接口源码+项目使用说明.zip 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果有一点儿基础,亦可在此代码基础上进行修改,以实现其他功能。 自动抓取百度快递接口数据,实时返回物流轨迹状态信息。 ---- 建议在 PHP7.1 上运行以获取最佳性能; Express API SDK for PHP 功能描述 ---- * 1、获取所有快递公司列表 * 2、获取快递/物流状态信息 安装使用 ---- 1.1 通过 Composer 来管理安装 ```shell # 首次安装 composer require wander/express # 更新 Express composer update wander/express ``` 1.2 如果不使用 Composer, 可以下载 Express 并解压到项目中 ```php # 在项目中加载初始化文件 include "您的目录/Express/include.php"; ``` * 获取所有快递公司列表 ```php // 参考https://m.baidu.com/s?word=快递 try { $number = 'YT5744661853493'; //cookie存放路径 $cookiePath = __DIR__ . '/cookie'; //错误重试次数 $tryTimes = 3; //ip地址 $ip = '101.69.230.179'; $express = new \Express\Express($cookiePath, $ip, $tryTimes); //取快递公司列表 $res = $express->getExpressList(); print_r($res); //取快递物流信息 $res = $express->express($number); print_r($res); } catch (\Exception $e) { echo $e->getMessage(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值