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

 背景
最近进行网站后台开发,需要实现物流的即时查询,发现之前集成的 快递100物流查询 API ——【PHP 快递查询源码资源】 已经不能正常使用了; 为了方便以后的业务需求,经过比较,最后选择使用 第三方物流 ——【快递鸟】
同时,在此进行整理,希望能帮到有需求的道友们,谢谢 …
官方文档: 快递鸟 —— 即时查询API
开发框架:ThinkPHP5.1.2

【提示】(2020-02-09)
当前,免费版只可以支持三通物流信息的查询,如果想查询其他物流信息,需购买其他产品服务;同时升级购买后根据技术对接,尚需要进行必要参数的修整,针对京东、顺丰物流注意CustomerName参数的补充
☞ 开发步骤
①. 前期准备
首先要进行快递鸟账号的注册
并根据对方的要求,完善用户申请。
然后,根据自己的需求,开通所需服务(如果只是进行物流信息的查询,以当前业务查询次数较少为例):

②. 集成类的使用
首先需要登录 快递鸟
获取账号的 用户ID 和 API 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;
    }

<?php
class Ship
{
    private $EBusinessID;   //商户id

    private $AppKey;   //商户key

    private $ReqURL;   //请求地址

    public function __construct()
    {
        $this->EBusinessID = '自己申请的用户id';
        $this->AppKey = '自己申请的key';
        $this->ReqURL = 'http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';
//        $this->ReqURL = 'http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json';
    }

    public function lookLogistics(){
        $ShipperCode = 'YTO';
        $LogisticCode = "YT4727018370468";
        return $e=$this->getOrderTracesByJson($ShipperCode,$LogisticCode,1);
    }

    public function getOrderTracesByJson($ShipperCode = "",$LogisticCode = "",$arrayFlag = 0){
        $requestData = "{   
                            'OrderCode':'',
                            'ShipperCode':'$ShipperCode',
                            'LogisticCode':'$LogisticCode'
                        }";

        $datas = array(
            'EBusinessID' => $this->EBusinessID,//商户ID
            'RequestType' => '1002',
            'RequestData' => urlencode($requestData),
            'DataType' => '2',
        );
        $datas['DataSign'] = $this->encrypt($requestData, $this->AppKey);//这里填写商户的key
        $result=$this->sendPost($this->ReqURL, $datas);
        //根据公司业务处理返回的信息......
//        if ($arrayFlag){
//            $result = json_decode($result,true);
//            //TODO 方便物流信息的倒序展示,进行数组反转
//            $result['Traces'] = array_reverse($result['Traces']);
//        }

//        p($json);die;
        return $result;
    }

    /**
     *  post提交数据
     * @param  string $url 请求Url
     * @param  array $datas 提交的数据
     * @return url响应返回的html
     */
    protected 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;
    }


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

查询Api接口定义

系统级输入参数

参数名称类型必须要求说明
RequestDataStringR请求内容,JSON或XML格式,须和DataType一致
EBusinessIDStringR用户ID
RequestTypeStringR请求指令类型:1002
DataSignStringR数据内容签名
DataTypeStringO请求、返回数据类型:1-xml,2-json;默认为xml格式

应用级输入参数

参数名称类型必须要求说明
OrderCodevarchar(50)O订单编号
ShipperCodevarchar(10)R快递公司编码
LogisticCodevarchar(50)R物流单号

返回结果参数

参数名称类型必须要求说明
EBusinessIDIntR电商用户ID
OrderCodeVarchar(50)O订单编号
ShipperCodevarchar(10)R快递公司编码
LogisticCodeVarchar(50)R物流运单号
SuccessBoolR成功与否
ReasonVarchar(50)O失败原因
StateIntR物流状态1:已取件2:在途中3:签收
TracesVarchar(Max)R物流轨迹详情

物流轨迹详情

参数名称类型必须要求说明
AcceptTimeDateTimeR时间
AcceptStationVarchar(50)R描述
RemarkVarchar(150)O备注
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值