"96ab2e464e8e", "appSecret"=> "9ecc186728b64103ac1a5967c90c70e3", "sourceKey"=> "wzmu5q6x" ]; //测试环境 // public $yt_config = [ // "appId"=> "d34f30df34ae", // "appSecret"=> "9ace1fa73c4b4567a6ae5ac7e254b48f", // "sourceKey"=> "wzmu5q6x" // ]; function __construct(){ parent::__construct(); } public function get_data($data){ $token = $this->getAccessToken(); if(empty($token)){ return [ 'x'=>'0', 'Description'=>"请求时token为空,请联系技术!!!", ]; } $url = "/v1/order/package/create"; //拼接参数 $receive_address = []; $receive_address[] = $data['address']; if(!empty($data['address2'])){ $receive_address[] = $data['address2']; } if(!empty($data['printnumber'])){ $data['printnumber'] = $data['printnumber']*1 + 1; } $params = [ "product_code"=> "YTKD", //"product_code"=> "S1002", "customer_order_number"=> empty($data['printnumber'])?$data['number']: $data['number']."_".$data['printnumber'], "packages"=> [ [ "weight"=> $data['zzl'] ], ], "receiver"=> [ "first_name"=> $data['name'], "country_code"=> $data['lb'], "province"=> $data['province'], "city"=> $data['city'], "address_lines"=> $receive_address, "postal_code"=> $data['zipcode'], "phone_number"=> $data['phone'], "email"=> isset($data['email'])?$data['email']:'', "company"=>$data['client'], ], "declaration_info"=> [ [ "quantity"=>$data['ts'], "unit_price"=>$data['dtsbjz'], "unit_weight"=>sprintf("%.3f",$data['zzl']/$data['ts']), "name_en"=> $data['sbpm'], "name_local"=>$data['zwpm'], ], ], "customs_number"=>[ "ioss_code"=>$data['ioss'] ] // "sender"=> [ // "first_name"=> "first_name", // "last_name"=> "last_name", // "company"=> "company", // "country_code"=> "11", // "province"=> "province", // "city"=> "city", // "address_lines"=> [ // "address_lines1" // ], // "postal_code"=> "postal_code", // "phone_number"=> "phone_number", // "email"=> "email", // ], ]; if($data['printcode'] == 'YunExpress_BaoXian'){ $params["extra_services"] =[ [ "extra_code"=>"VAS_IP", "extra_value"=>"BJFDR", ] ]; } $res = $this->sendNewPost($url,$params,$token); // echo "
";
        // var_dump($params);
        // var_dump($res);
      
        if(isset($res['code'])&&($res['code'] != 1)){
            return [
                'x'=>'0',
                'Description'=>$res['msg'],
            ];
        }else{
            usleep(30);
            $r = $this->get_label($res['result']['waybill_number']);
            //var_dump($res);
            if($r['x'] != 1){
                return [
                    'x'=>'2',
                    'waybill'=>$res['result']['waybill_number'],
                    "url"=>"",
                    'Description'=>$r['Description'],
                ];
            }else{
                return [
                    'x'=>'1',
                    'waybill'=>$res['result']['waybill_number'],
                    "url"=>$r['url']
                ];
            }
            
        }
    }

    /**
     * 获取电子面单
     */
    public function get_label($order_number){
        $token =  $this->getAccessToken();
       
        if(empty($token)){
            throw new Exception("获取token失败");
        }
       
        $query = [
            'order_number'=> $order_number,
        ];
        $url ="/v1/order/label/get";
        $res = $this->sendNewGet($url,$query,$token);
        if(isset($res['code'])&&($res['code'] != 1)){
            return [
                'x'=>'0',
                'Description'=>$res['msg'],
            ];
        }else{
    
            return [
                'x'=>'1',
                'url'=>$res['result']['url'],

            ];
        }
    }
    






    /**
     * 基于guzzlehttp的get请求
     */
    protected function sendNewGet($url,$query,$token = ""){
        $timestamp = time() . "000";
 
        $bodyString=null;
 
         // 设置请求的URL
        $all_url = $this->base_url.$url."?".http_build_query($query);

        $tmp_sign = $this->generateSignatureContent($timestamp, "GET", $url, $bodyString);
        $sign= $this->generateSha256Signature($tmp_sign, $this->yt_config['appSecret']);
        
         // 初始化cURL会话
          $ch = curl_init($all_url);
         // 设置cURL选项
            $options = array(
                CURLOPT_SSL_VERIFYPEER=>false,
                CURLOPT_SSL_VERIFYHOST=>false,
                CURLOPT_RETURNTRANSFER => true,   
                CURLOPT_HTTPHEADER => array(
                    'Content-Type: application/json',
                    'token: ' . $token ,
                    'date: '  . $timestamp,
                    'sign: ' . $sign
                ),
            );
            // 应用这些选项到cURL会话
            curl_setopt_array($ch, $options);
    
            // 执行cURL会话并获取响应
            $response = curl_exec($ch);
    
            // 检查是否有错误发生
            if ($response === false) {
                $error = curl_error($ch);
                curl_close($ch);
                return [
                    "code"=> -1,
                    "msg"=> $error
                ];
            }
           
            // 关闭cURL会话
            curl_close($ch);
            // 输出响应内容
            return json_decode($response,true);
    }
    /**
     * 基于guzzlehttp的post请求
     */

     protected function sendNewPost($url,$params,$token = ""){
       
        $timestamp = time() . "000";
 
        $bodyString=json_encode($params);
       
 
         // 设置请求的URL
         $all_url = $this->base_url.$url;

        $tmp_sign = $this->generateSignatureContent($timestamp, "POST", $url, $bodyString);
        $sign= $this->generateSha256Signature($tmp_sign, $this->yt_config['appSecret']);
        
         // 初始化cURL会话
          $ch = curl_init($all_url);
         // 设置cURL选项
            $options = array(
                CURLOPT_SSL_VERIFYPEER=>false,
                CURLOPT_SSL_VERIFYHOST=>false,
                CURLOPT_RETURNTRANSFER => true,   
                CURLOPT_POST => true,             
                CURLOPT_POSTFIELDS => $bodyString,  
                CURLOPT_HTTPHEADER => array(
                    'Content-Type: application/json',
                    'token: ' . $token ,
                    'date: '  . $timestamp,
                    'sign: ' . $sign
                ),
            );
            // 应用这些选项到cURL会话
            curl_setopt_array($ch, $options);
    
            // 执行cURL会话并获取响应
            $response = curl_exec($ch);
           
            // 检查是否有错误发生

            // 检查是否有错误发生
            if ($response === false) {
                $error = curl_error($ch);
                curl_close($ch);
                return [
                    "code"=> -1,
                    "msg"=> $error
                ];
            }
    
            // 关闭cURL会话
            curl_close($ch);
    
            // 输出响应内容
            return json_decode($response,true);
       
    }
    /**
     * 基于guzzlehttp的post请求
     */

    protected function sendPost($url,$params,$token = ""){
       $all_url = $this->base_url.$url;
       $jsonData = json_encode($params);
       // 初始化cURL会话
       $ch = curl_init($all_url);

       // 设置cURL选项
       $options = [
           CURLOPT_SSL_VERIFYPEER=>false,
           CURLOPT_SSL_VERIFYHOST=>false,
           CURLOPT_RETURNTRANSFER => true,   
           CURLOPT_POST => true,             
           CURLOPT_POSTFIELDS => $jsonData,  
           CURLOPT_HTTPHEADER => [
               'Content-Type: application/json'
            ],
        ];
        curl_setopt_array($ch, $options);

        // 执行cURL会话并获取响应
        
         $response = curl_exec($ch);
       
         // 检查是否有错误发生
         if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            return [
                "code"=> -1,
                "msg"=> $error
            ];
        }

        // 关闭cURL会话
        curl_close($ch);
        $data = json_decode($response, true);
        return $data;
       
    }
    /**
     * 签名算法
     */
    /*
    * 加签内容构造
    */
    private function generateSignatureContent($timestamp, $method, $uri, $body = null) {
        $params = [
            'date' => $timestamp,
            'method' => $method,
            'uri' => $uri,
        ];
        if (!empty($body)) {
            $params['body'] = $body;
        }
        ksort($params);
        $signatureContent = http_build_query($params, '', '&');
        return urldecode($signatureContent);
    }

    /*
    * 加签
    */
    private function generateSha256Signature($data, $key){
        //return utf8_encode(base64_encode(hash_hmac('sha256', $data,$key,true)));
        return mb_convert_encoding(base64_encode(hash_hmac('sha256', $data,$key,true)), 'ISO-8859-1', 'UTF-8');
    }
    private function getAccessToken(){
        $info= $this->setting->find("skey = 'yuntu_express_token'");
        if(empty($info)){
            $token =  $this->makeToken();
            $this->setting->insert([
                "skey"=> "yuntu_express_token",
                "svalue"=> $token,
                "expiretime"=> (time() + 7100),
                 "sessionkey"=> "yuntu_express_token"
            ]);
            return $token;
        }
        if($info['expiretime'] < time()){
            $token =  $this->makeToken();
            $this->setting->save([
                "svalue"=> $token,
                "expiretime"=> (time() + 7100)
            ],"yuntu_express_token"); 
            return $token;
        }

        return $info['svalue'];

       
    }
    private function makeToken(){
        $res = $this->sendPost($this->token_url,[
            "grantType"=>"client_credentials",
            "appId"=> $this->yt_config['appId'],
            "appSecret"=>$this->yt_config['appSecret'],
            "sourceKey"=> $this->yt_config['sourceKey']
        ]);
        if(isset($res['accessToken'])){
            $token = $res['accessToken'];
            return $token;
        }else{
            return "";
        }
       
    }
}