TP5.0框架php,快递鸟平台,查询快递信息,已脱坑

zhaojw4年前PHP技术83982

快递鸟平台,查询快递信息。已脱坑

写在前面

技术更新迭代,但总能有迹可循。
无休止的造轮子,早已让人精疲力竭。
自己跳过的坑,分享最终的成果,只为让痛苦不再重复。

dd66becfe189cf42475407c8d62d9d2f_1920_wallpaper_des.jpg

一 背景

商城项目中,需要根据订单号查询物流信息。经过自己的快递单号评测,最终选中快递鸟平台。

二 步骤

1 需要到快递鸟平台申请账号。获取后台的ID和加密私钥。
2 根据官方提供的demo,集成自己的类库。
3 后台调用,前台渲染结果。

三 参考资料

快递鸟开发文档 快递鸟开发文档

四 开发环境

8cc05fb7131a7ce74049e91e4e2df77f_1920_wallpaper_des.jpg

apache和mysql和php5.6
框架:thinkphp5.0

五 代码及注释

1 封装的类库

电商ID和加密私钥可以做成配置文件

<?php

//快递鸟平台,根据快递号和快递公司码,查询快递信息
class BirdExpress
{
    private $EBusinessID;       //电商ID
    private $AppKey;            //电商加密私钥,快递鸟提供,注意保管,不要泄漏
    private $ReqURL;            //请求ur1填写你的账号数据

    public function __construct()
    {

        //进行配置信息的替换
        $this->EBusinessID = "";
        $this->AppKey = "";
        $this->ReqURL = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
    }

    /**
     * 核心方法
     * Json方式 查询订单物流轨迹
     * @param string $ShipperCode 快递公司编码
     * @param string $LogisticCode 物流单号
     * @param int $arrayFlag 是否进行数组转化标志 默认0:否  1:转化
     * 参考规则举例:
     * $requestData = "{'OrderCode':'','ShipperCode':'ZTO','LogisticCode':'640041334612'}";
     * @return result 包含即时物流信息的 Json数据
     * * status
     * 0:物流单号暂无结果;
     * 3:在途,快递处于运输过程中;
     * 4:揽件,快递已被快递公司揽收并产生了第一条信息;
     * 5:疑难,快递邮寄过程中出现问题;
     * 6:签收,收件人已签收;
     * 7:退签,快递因用户拒签、超区等原因退回,而且发件人已经签收;
     * 8:派件,快递员正在同城派件;
     * 9:退回,货物处于退回发件人途中;
     */
    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;
    }

    /**
     * 电商Sign签名生成
     * @param data 内容
     * @param appkey Appkey
     * @return DataSign签名
     */
    private function encrypt($data, $appkey) {
        return urlencode(base64_encode(md5($data.$appkey)));
    }

    /**
     *  post提交数据
     * @param  string $url 请求Url
     * @param  array $datas 提交的数据
     * @return url响应返回的html
     */
    private function sendPost($url, $datas) {
        $temps = array();
        foreach ($datas as $key => $value) {
            $temps[] = sprintf('%s=%s', $key, $value);
        }
        $post_data = implode('&', $temps);
        $url_info = parse_url($url);
        if(empty($url_info['port']))
        {
            $url_info['port']=80;
        }
        $httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n";
        $httpheader.= "Host:" . $url_info['host'] . "\r\n";
        $httpheader.= "Content-Type:application/x-www-form-urlencoded\r\n";
        $httpheader.= "Content-Length:" . strlen($post_data) . "\r\n";
        $httpheader.= "Connection:close\r\n\r\n";
        $httpheader.= $post_data;
        $fd = fsockopen($url_info['host'], $url_info['port']);
        fwrite($fd, $httpheader);
        $gets = "";
        $headerFlag = true;
        while (!feof($fd)) {
            if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) {
                break;
            }
        }
        while (!feof($fd)) {
            $gets.= fread($fd, 128);
        }
        fclose($fd);

        return $gets;
    }




}

2 控制器调用

快递鸟有快递公司对应码的excel表,通过php工具类导入到mysql表中

public function getBirdExpress()
    {
        //根据快递公司查找表得到,快递码
        $kuaidiName = '圆通速递';
        $ShipperCode = Db::name('xbird_express')->where('name',$kuaidiName)->value('code');
        //单号
        $LogisticCode = "************";
        $express = new BirdExpress();
        $expressData = $express->getOrderTracesByJson($ShipperCode,$LogisticCode,1);
        return $expressData;

    }

3 返回数据

可以自己根据返回数据,渲染前台模板

array(6) {
  ["LogisticCode"] => string(15) "*********"
  ["ShipperCode"] => string(3) "YTO"
  ["Traces"] => array(11) {
    [0] => array(2) {
      ["AcceptStation"] => string(156) "客户签收人: *** 已签收  感谢使用圆通速递,期待再次为您服务 如有疑问请联系:1523***835,投诉电话:*******"
      ["AcceptTime"] => string(19) "2020-01-16 17:09:02"
    }
    [1] => array(2) {
      ["AcceptStation"] => string(98) "****小区圆通代办点***驿站已发出自提短信请上门自提联系电话185****490"
      ["AcceptTime"] => string(19) "2020-01-16 09:00:51"
    }
    [2] => array(2) {
      ["AcceptStation"] => string(77) "快件已到达****小区圆通代办点***驿站联系电话185****0490"
      ["AcceptTime"] => string(19) "2020-01-16 07:52:57"
    }
    [3] => array(2) {
      ["AcceptStation"] => string(49) "【河南省郑州市******公司】 已收入"
      ["AcceptTime"] => string(19) "2020-01-16 07:45:53"
    }
    [4] => array(2) {
      ["AcceptStation"] => string(84) "【郑州转运中心】 已发出 下一站 【河南省郑州市*****公司】"
      ["AcceptTime"] => string(19) "2020-01-15 22:18:26"
    }
    [5] => array(2) {
      ["AcceptStation"] => string(40) "【郑州转运中心公司】 已收入"
      ["AcceptTime"] => string(19) "2020-01-15 21:57:06"
    }
    [6] => array(2) {
      ["AcceptStation"] => string(75) "【义乌转运中心】 已发出 下一站 【郑州转运中心公司】"
      ["AcceptTime"] => string(19) "2020-01-15 00:51:08"
    }
    [7] => array(2) {
      ["AcceptStation"] => string(40) "【义乌转运中心公司】 已收入"
      ["AcceptTime"] => string(19) "2020-01-15 00:25:12"
    }
    [8] => array(2) {
      ["AcceptStation"] => string(90) "【浙江省金华市义乌市洪华】 已发出 下一站 【义乌转运中心公司】"
      ["AcceptTime"] => string(19) "2020-01-15 00:15:18"
    }
    [9] => array(2) {
      ["AcceptStation"] => string(55) "【浙江省金华市义乌市****公司】 已打包"
      ["AcceptTime"] => string(19) "2020-01-15 00:12:46"
    }
    [10] => array(2) {
      ["AcceptStation"] => string(90) "【浙江省金华市义乌市***公司】 已收件 取件人: **** (185*****134)"
      ["AcceptTime"] => string(19) "2020-01-15 00:07:28"
    }
  }
  ["State"] => string(1) "3"
  ["EBusinessID"] => string(7) "*******"
  ["Success"] => bool(true)
}

六 写在最后

dc1f1ddc620be276874ea8cd085bb52e_1920_wallpaper_des.jpg

我申请的是快递鸟的体验账号。
限500次/天(即时查询 仅支持3家申通、圆通、中通)
不限调用量(电子面单)
如果大家的业务需要,也可以升级。


返回列表

没有更早的文章了...

下一篇:php职业规划,感悟与反思

相关文章

合格打工族的迷幻时间

合格打工族的迷幻时间

1 春节的时候,按照农历(几月初几)过日子。初一,初二,初六就该上班了。2 五一,十一假期的时候,按照阳历(几月几号)过。五月一号开心,五月六号不开心3 上班的时候,按周几过,周一不开心,周五开心4...

php,作为一个程序猿的些许心得

php,作为一个程序猿的些许心得

php,作为一个程序猿的些许心得一 前言1 我们的痛点与不解技术更新迭代,但总能有迹可循。无休止的造轮子,早已让人精疲力竭。自己跳过的坑,分享最终的成果,只为让痛苦不再重复。二 自己的故事曾经年少轻狂...

上楼梯的心得

上楼梯的心得

上楼梯的心得1 健康的体魄是一切的基础2 路要一步步走,楼梯一阶一阶的上,不能跨好几个,要脚踏实地3 十几层的楼。要把目标分割成若干的小目标。 一层一层的爬。  既要仰望星空,也要脚踏实地。...

php职业规划,感悟与反思

php职业规划,感悟与反思

php职业规划,感悟与反思一 人生的思考记录1 人生本来就没有意义。只是需要自己去定义。3 人生的过程就是,探索自我,挑战自我,超越自我首先,是一个独立的个体,才有可能和能力去影响和改变关联的个体。4...

评论列表

快捷
2021-01-06 08:17:43

不错哦

﹏櫻之舞﹏
2020-11-18 09:41:12

今天面试就是问了这个问题,如果早看你帖子就好了,解决方案很赞

←极§速
2020-11-18 09:41:12

为什么不用MySQL呢,如果用MySQL的弊端在哪里,新手学习

々爱被冰凝固ゝ
2020-11-18 09:41:12

啥都不说了,请收下我的膝盖!

你身上有刺,别扎我
2020-11-18 09:41:12

感谢博主分享,学到不少东西!方便的话可以加个关注

请在乎我1秒
2020-11-18 09:41:12

你好,咨询个问题,显示信息的*.aspx页面,可以不用id为“content”的div控件吗?自己新建好的的模板,如何把str里面的信息放到模板中对应的位置

青瓷清茶倾城歌
2020-11-18 09:41:12

支持顺丰的,其他快递吗》

来自火星球的我
2020-11-18 09:41:12

咋用的

ˉ夨落旳尐孩
2020-11-18 09:41:12

真棒!茅塞顿开的感觉

残留の笑颜
2020-11-18 09:41:12

内容写的很好,期待多更!

飞
2020-11-18 09:41:12

网上找了很久,这篇文章很详细,解决我的问题!点赞

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。