zoukankan      html  css  js  c++  java
  • 物流即使查询API

    上一篇文章我们介绍了一个物流服务提供商,推荐大家使用快递鸟接口,主要介绍了如何注册账号,获得密钥,找不到注册地址的,我在发一下:

    http://kdniao.com/reg

    之前也聊过如何利用快递鸟提供的接口来实现即时查询。也提供了C#版本,Java版本,这次我们用PHP来实现接口对接,

    在开发之前,我们先来了解一下什么是即时查询,按我的理解就是,我们提供运单号和快递公司编码,然后调用快递鸟提供的查询接口,即可查询运单号的发货情况,我们可以通过这个接口获悉到包裹的收件时间,派送时间,签收时间,签收人,如果体验做的更好一点,通过大数据可以分析这个包裹的预计派送时间。

    以下是我通过调用快递鸟接口提供的即时查询接口获得的内容:

     

    外观显示效果可以忽略,这是我项目应用的截图,我们得到轨迹信息以后,可以按自己的页面风格最终呈现给客户。

    好了,现在我们来聊一聊具体实现吧!

    首先我们准备好需要用到的资源,

    测试商户ID:

    test1617571

     

    测试API key:

    554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使用)

     

    API测试地址:

    http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json

    我们先来解读一下快递鸟官网提供的接口文档说明

     

     

    这个使用流程图我是在快递鸟官网截图的,我们先来梳理一下几个角色

    1,          用户,这个很好理解,就是我们这群开发人员,苦逼的程序员

    2,          快递鸟,这个写的也很清楚了,就是物流服务提供商

    3,          客户,这是我们自己的客户,我们得到快递鸟的数据以后是需要内部封装,通过各种界面展示给我们真正的上帝看的,客户看到的是我们再次封装的信息,当然如果你想把快递鸟返回的信息直接暴露给你的客户看,我也不反对。只能说,你是最棒的。

    接下来,我们讲解一下请求参数

    请求系统级参数说明:

     

    备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)

    这里提到了系统级参数,也相当于是公用参数,这些参数是调用每个接口都是必须要传参的。

    接口参数:

     

    接口参数,也叫业务参数,请求的业务接口不同,参数的字段,内容也不同,是跟着业务变化的,这里我们实现的是即时查询接口,快递鸟官网要求必须传递快递公司编码和物流单号

    物流单号很好理解,就是快递面单上的运单号,快递公司编码是必须传递快递鸟支持的编码,你可能会问,我如何能知道快递鸟支持哪些快递公司,不急,马上告诉你。

    下载快递公司编码:

    http://www.kdniao.com/documents

    上一篇文章有提到,下载下来你就秒懂了,哈哈!

    正如我前面的轨迹截图,是一个中通的轨迹数据,中通快递的编码是ZTO,物流单号是78120038107849

    业务参数报文组合如下:

    {'OrderCode':'','ShipperCode':'ZTO','LogisticCode':'78120038107849'}

    请求的完整报文:

    RequestData=%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27ZTO%27%2c%27LogisticCode%27%3a%2778120038107849%27%7d&EBusinessID=1617571&RequestType=1002&DataSign=YzBmYTViYmExZmFhOGY1ZTY3MWY5OGFjYWRhNWVjNjU%3d&DataType=2

    返回的报文信息:

    { "LogisticCode" : "78120038107849", "ShipperCode" : "ZTO", "Traces" : [ { "AcceptStation" : "【济源市】 【济源】(0391-6965909) 的 张霞(18839032214) 已揽收", "AcceptTime" : "2020-01-16 18:30:33" }, { "AcceptStation" : "【济源市】 快件离开 【济源】 已发往 【深圳中心】", "AcceptTime" : "2020-01-16 18:36:41" }, { "AcceptStation" : "【新乡市】 快件已经到达 【新乡中转】", "AcceptTime" : "2020-01-16 22:45:49" }, { "AcceptStation" : "【新乡市】 快件离开 【新乡中转】 已发往 【深圳中心】", "AcceptTime" : "2020-01-16 22:47:48" }, { "AcceptStation" : "【深圳市】 快件已经到达 【深圳中心】", "AcceptTime" : "2020-01-18 04:05:46" }, { "AcceptStation" : "【深圳市】 快件离开 【深圳中心】 已发往 【深圳龙华】", "AcceptTime" : "2020-01-18 08:34:46" }, { "AcceptStation" : "【深圳市】 快件已经到达 【深圳龙华】", "AcceptTime" : "2020-01-18 13:14:10" }, { "AcceptStation" : "【深圳市】 【深圳龙华】 的陈智龙-王颖(13923773902) 正在第1次派件, 请保持电话畅通,并耐心等待(95720为中通快递员外呼专属号码,请放心接听)", "AcceptTime" : "2020-01-18 16:38:35" }, { "AcceptStation" : "【深圳市】 快件已由【丰巢的鑫茂花园A区(丰巢智能快递柜)】代签收, 如有问题请电联(13923773902 / 4000633333,18025858922), 感谢您使用中通快递, 期待再次为您服务!", "AcceptTime" : "2020-01-18 17:32:15" } ], "State" : "3", "EBusinessID" : "1617571", "Success" : true }

    PHP关键代码:

    <?php

    //电商ID

    defined('EBusinessID') or define('EBusinessID', '请到快递鸟官网申请http://kdniao.com/reg');

    //电商加密私钥,快递鸟提供,注意保管,不要泄漏

    defined('AppKey') or define('AppKey', '请到快递鸟官网申请http://kdniao.com/reg');

    //请求url

    defined('ReqURL') or define('ReqURL', 'http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx');

     

    //调用查询物流轨迹

    //---------------------------------------------

     

    $logisticResult=getOrderTracesByJson();

    echo logisticResult;

     

    //---------------------------------------------

     

    /**

     * Json方式 查询订单物流轨迹

     */

    function getOrderTracesByJson(){

           $requestData= "{'OrderCode':'','ShipperCode':'YTO','LogisticCode':'12345678'}";

          

           $datas = array(

            'EBusinessID' => EBusinessID,

            'RequestType' => '1002',

            'RequestData' => urlencode($requestData) ,

            'DataType' => '2',

        );

        $datas['DataSign'] = encrypt($requestData, AppKey);

           $result=sendPost(ReqURL, $datas);  

          

           //根据公司业务处理返回的信息......

          

           return $result;

    }

     

    /**

     *  post提交数据

     * @param  string $url 请求Url

     * @param  array $datas 提交的数据

     * @return url响应返回的html

     */

    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 ";

        $httpheader.= "Host:" . $url_info['host'] . " ";

        $httpheader.= "Content-Type:application/x-www-form-urlencoded ";

        $httpheader.= "Content-Length:" . strlen($post_data) . " ";

        $httpheader.= "Connection:close ";

        $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 == " " || $header == " ")) {

                         break;

                  }

           }

        while (!feof($fd)) {

                  $gets.= fread($fd, 128);

        }

        fclose($fd); 

       

        return $gets;

    }

     

    /**

     * 电商Sign签名生成

     * @param data 内容  

     * @param appkey Appkey

     * @return DataSign签名

     */

    function encrypt($data, $appkey) {

        return urlencode(base64_encode(md5($data.$appkey)));

    }

     

    ?>

    附上详细的接口文档给大家:

    http://www.kdniao.com/documents

  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/51api/p/12297427.html
Copyright © 2011-2022 走看看