zoukankan      html  css  js  c++  java
  • 快递鸟的即时查询API接口在TP5中正确使用

    快递鸟的接口对接其实很简单,先去官网注册账号,登陆把基本信息填好,然后在产品管理中订购一下“物流查询”,免费,免费的有对接口调用频率限制,结合自己的应用流量够用就可以。
    对接流程:
    快递鸟网站申请接口KEY并认证-对接接口-调试-上线使用
    1、登录快递鸟官网注册页面注册快递鸟账号
    2、登录快递鸟用户管理后台
    注:登录快递鸟用户管理后台后获得用户ID和APIKey,此用于保证应用来源的可靠性,避免应用伪造,被不法使用。
    进入“我的会员中心”进行实名认证 注:
    1、认证类型、应用类型根据用户实际情况选择即可,接口返回数据与选择结果无关;
    2、标记为*的为必填,要求上传清晰、jpg格式且小于2M的证件图片;
    3、技术对接人信息为用户方对接工程师的信息;
    4、如有其他疑问可进入官网加入商务合作群进行咨询。 认证成功后,进入“产品服务管理”,开通相关会员服务

    使用前复制一下账号下的用户ID和API key,并且快递鸟对各个API提供了各种语言的demo,其实下载下来,找一下平时寄快递的运单号,本地运行一下就能用了。(名称: KdApiSearchDemo)

     

    其实拿到demo代码,可以放到项目中,因为demo是以面向过程写的,所以为了方便自然就想封装一下。

    <?php
    
    namespace dataextend;
    
    use dataserviceConfig;
    
    /**
    
     * 快递鸟即时查询接口
    
     * @author Administrator
    
     *
    
     */
    
    class Kdniao{
    
        private $ebusinessid;//商户ID
    
        private $appkey;     //商户秘钥
    
        private $request_type;//请求类型
    
        private $request_url; //请求URL
    
        /**
    
         * 构造函数
    
        */
    
        public function __construct($shop_id){
    
            $config=new Config();
    
            $express_config=$config->getOrderExpressMessageConfig($shop_id);
    
            $is_use=$express_config['is_use'];
    
            if($is_use==0){
    
                $this->ebusinessid = 'niushop';
    
                $this->appkey = 'niushop';
    
            }else{
    
                $this->ebusinessid = $express_config["value"]["appid"];
    
                $this->appkey = $express_config["value"]["appkey"];
    
            }
    
            $this->request_type = 1002;
    
            $this->request_url = 'http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx';
    
        }
    
        
    
        
    
        //---------------------------------------------
    
        /**
    
         * Json方式 查询订单物流轨迹
    
         */
    
        public function getOrderTracesByJson($requestData){
    
            //$requestData= "{'OrderCode':'','ShipperCode':'YTO','LogisticCode':'12345678'}";
    
            $datas = array(
    
                'EBusinessID' => $this->ebusinessid,
    
                'RequestType' => $this->request_type,
    
                'RequestData' => urlencode($requestData) ,
    
                'DataType' => '2',
    
            );
    
            $datas['DataSign'] = $this->encrypt($requestData, $this->appkey);
    
            $result=$this->sendPost($this->request_url, $datas);
    
            //根据公司业务处理返回的信息......
    
            return $result;
    
        }
    
        
    
        /**
    
         *  post提交数据
    
         * @param  string $url 请求Url
    
         * @param  array $datas 提交的数据
    
         * @return url响应返回的html
    
         */
    
        public 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签名
    
         */
    
        public function encrypt($data, $appkey) {
    
            return urlencode(base64_encode(md5($data.$appkey)));
    
        }
    
    }

    如果运行中报错怎么办呢?
    demo中提供的请求快递鸟API是使用的fsockopen函数,该函数是PHP较高版本(5.0以上)中功能比较强大的,通过一个URL和PORT请求返回一个文件指针,后面的就可以通过文件操作函数获取返回结果。

    看到这个报错,确认了我当前使用的PHP版本,然后去php.ini配置文件查看allow_url_fopen 是开的(ON),扩展包也是去掉注释的,禁用函数中也没有fsockopen。

    最好我选择把接口请求写成函数,竟然就有效了,最后的总结出来的是,fscockopen函数放在php类里面不起效果,要放在函数中使用,实例如下:

     

     

  • 相关阅读:
    UML建模之时序图(Sequence Diagram)
    UML统一建模语UML2和EnterpriseArchitect
    FTP服务器的搭建
    Ubuntu下Apache重启错误:Could not reliably determine解决
    JSP的优势 和劣势 与php的比较
    [置顶] Ajax 初步学习总结
    pv ticketlock解决虚拟环境下的spinlock问题
    Tomcat从零开始(十)Loader
    HDU 4740 The Donkey of Gui Zhou (模拟)
    关于cvScalar的那些事
  • 原文地址:https://www.cnblogs.com/kdn2019/p/11572365.html
Copyright © 2011-2022 走看看