server(); $this->key = $config["kdzhushou_Key"]; $this->Secret = $config["kdzhushou_Secret"]; $this->config = [ 'appKey' => $this->key, 'secret' => $this->Secret, 'timestamp' => date('Y-m-d H:i:s'), 'format' => 'json', 'version' => '1.0', 'sign_method' => 'md5', ]; } /*** * 货 * @param $shopName * @param $token * @return mixed */ public function GetLoginUrl($shopName = '小店', $token = '') { $this->config['method'] = 'kdzs.print.loginurl.get'; $data = [ 'userName' => $this->config['appKey'] . "'_{$shopName}_{$token}'", ]; $datas = array_merge($this->config, $data); $sign = $this->sign($datas); $datas['sign'] = $sign; $res = $this->send_post_request($this->api_url, $datas); return json_decode($res, true); } public function search($express_no, $code, $mobile = '') { $this->config['method'] = 'kdzs.logistics.trace.search'; $data['cpCode'] = $code; $data['mailNo'] = $express_no; if ($code == 'SF') { $data['tel'] = substr($mobile, -4); }; $datas = array_merge($this->config, $data); $sign = $this->sign($datas); $datas['sign'] = $sign; $res = $this->send_post_request($this->api_url, $datas); $res= json_decode($res, true); return $res; } public function getTemplate(){ $this->config['method'] = 'kdzs.print.template.get'; } /** * 快递助手接口 * @param 1.'' 2.'' 3.'' 4.创建订单加密接口 * @param arr|$arr * @return bool|string */ public function callbackData($type, $arr) { //cpCode 快递公司编码 例:ZTO (中通) //mailNo 快递单号 $host = "https://gw.kuaidizs.cn/open/api"; $appkey = 'EB5DFFB78B86400E9790A1EC8BDD8603'; $secret = '70561989888E4765A1E80D614A0F20CF'; $array = []; switch ($type) { case 1: $method = ''; break; case 2: $method = ''; break; case 3: $method = ''; break; case 4: $method = 'kdzs.print.trade.create'; break; default: $method = ''; $arra = []; break; } //1. 设置参数值 $zarr = [ //调用接口的method 在开放平台上可以找到 'method' => $method, 'appKey' => $appkey, 'timestamp' => date('Y-m-d H:i:s', time()), // 'timestamp' => "2021-07-28 18:15:31", 'format' => "json", 'version' => "1.0",//版本 'sign_method' => "md5",//加密方式 ]; $earr = in_array($type, [1, 2, 3]) ? $arr : ['data' => json_encode($arr, TRUE)]; $array = array_merge($zarr, $earr); // var_dump( // $array // ); // die; //2. 按ASCII顺序排序,拼接参数名与参数值 $string = $this->asc_sort($array); var_dump($string); //3. 生成签名,生成算法:md5(secret+bar2foo1foo_bar3foobar4+secret) $sign = md5($secret . $string . $secret); $array['sign'] = strtoupper($sign); var_dump($array); //4. 发送请求,根据API的要求,定义相对应的Content-Type $result = $this->send_post_request($host, $array); $rarray = json_decode($result, true); echo "
";
        print_r($rarray);
        die;
    }

    /**
     * 查询物流轨迹企业版
     * @param unknown $express_no 物流公司编码
     * @param unknown $send_no 快递单号
     */
    public function getExpressTracesEnterpriseEdition($express_no, $send_no, $mobile = '')
    {
        $data = array();

        // 测试地址仅可测试100单实际使用时使用“实际地址”
//         $url = $this->http_type."poll.kuaidi100.com/test/poll/query.do"; // 测试地址
        $url = $this->http_type . "eolink.o.apispace.com/wlgj1/paidtobuy_api/trace_search"; // 实际地址
        $data['cpCode'] = $express_no;
        $data['mailNo'] = $send_no;
        if ($express_no == 'SF') {
            $data['tel'] = $mobile;
        }
        $headers = [
            "Content-Type:application/json",
            "Authorization-Type:apikey",
            "X-APISpace-Token:{$this->key}",
        ];
        $result = $this->sendRequest($url, $data, $headers);
        return $result;
    }


    /**
     * POST提交数据
     * @param array $data ,string $url
     * @return string
     */
    public function send_post_request($url, $data)
    { // 模拟提交数据函数
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_USERAGENT, request()->header('HTTP_USER_AGENT')); // 模拟用户使用的浏览器HTTP_USER_AGENT
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
        curl_setopt($curl, CURLOPT_COOKIEFILE, null); // 读取上面所储存的Cookie信息
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        $tmpInfo = curl_exec($curl); // 执行操作
        if (curl_errno($curl)) {
            echo 'Errno' . curl_error($curl);
        }
        curl_close($curl); // 关键CURL会话
        return $tmpInfo; // 返回数据
    }


    /**
     * 处理返回数据
     * @param unknown $data
     */
    public function handleReturnResult($data)
    {
        $result = array();
        $list = [
            'success' => true,
            'reason' => '',
            'status' => '',
            'status_name' => '',
            'shipper_code' => '',
            'logistic_code' => '',
            'list' => [],
        ];
        if (isset($data['logisticsTrace'])) {
            $result["success"] = true;
            $Trace = $data['logisticsTrace'];
            $result["reason"] = $Trace["theLastMessage"];
            $result["status"] = '';
            $result["status_name"] = $Trace['logisticsStatusDesc'];
            $result["shipper_code"] = $Trace["theLastMessage"];
            $result["logistic_code"] = $Trace["logisticsStatus"];
            if (isset($Trace["logisticsTraceDetailList"])) {
                $lists = [];
                foreach ($Trace["logisticsTraceDetailList"] as $k => $v) {
                    $lists[] = array(
                        "datetime" => date('Y-m-d H:i:s', $v["time"] / 1000),
                        "remark" => $v["desc"],
                    );
                }
                $result["list"] = $lists;
                return $result;
            }
        }
        return $list;
    }

    /**
     * 物流跟踪状态
     * @param $state
     */
    public function getStatusName($status)
    {
        $data = array(
            0 => "在途",
            1 => "揽收",
            2 => "疑难",
            3 => "签收",
            4 => "退签",
            5 => "派件",
            6 => "退回",
        );
        $status_name = isset($data[$status]) ? $data[$status] : '';
        return $status_name;
    }


    /***
     * 获取签名
     * @param $data
     * @return string
     */
    public function sign($data)
    {
        ksort($data);
        $text = '';
        foreach ($data as $key => $item) {
            $text .= $key . $item;
        }
        return strtoupper(md5($this->Secret . $text . $this->Secret));
    }
}