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