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

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

写在前面

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

一 背景

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

二 步骤

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

三 参考资料

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

四 开发环境

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)
}

六 写在最后

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值