reqURL = 'https://dev1.yunzmall.com/addons/yun_shop/api.php?i=2&uuid=0&type=5&route=plugin.yunqian-api.api.Express.getInfo'; } $this->app_id = trim($data['YQ']['appId']); $this->app_secret = trim($data['YQ']['appSecret']); } public function getTraces($comCode, $expressSn, $orderSn,$phoneLastFour){ $pa = json_encode([ 'number'=> $expressSn, 'company_code'=> $comCode, ]); if ($comCode == 'SF'){ $pa = json_encode([ 'number'=> trim($expressSn).':'.trim($phoneLastFour), 'company_code'=> $comCode, ]); } $array = $this->http_post_data($pa, $this->generateHeader(),$this->reqURL); $json_string = $array[1]; $res = json_decode($json_string,true); $result = $this->format($res['data']); $result['data'] = array_reverse($result['data']); return $result; } private function generateHeader(){ $millisecond = $this->getMillisecond();//为服务端时间前后5分钟内可以访问 $nonceStr = $this->getNonceStr(16);//10到50位字符串 $header=[ 'appId:'.$this->app_id, 'signature:'.$this->getSignature($this->app_id,$this->app_secret,$nonceStr,$millisecond), 'nonceStr:'.$nonceStr, 'timestamp:'.$millisecond, 'Content-Type:application/json', ]; return $header; } //计算请求签名值 private function getSignature($appId, $appSecret,$nonceStr,$millisecond) { $s = $appId.'_'.$appSecret.'_'.$nonceStr.'_'.$millisecond; $signature = strtoupper(md5($s)); return $signature; } //模拟发送POST请求 /** * 模拟发送POST 方式请求 * @param $url * @param $data * @param $projectId * @param $signature * @return array */ private function http_post_data( $data, $header,$url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER,$header); ob_start(); curl_exec($ch); $return_content = ob_get_contents(); ob_end_clean(); $return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //echo curl_errno($ch); return array($return_code, $return_content); } public function curl_post($postdata = '', $header = '', $url,$options = array()) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HTTPHEADER,$header); if (!empty($options)) { curl_setopt_array($ch, $options); } $data = curl_exec($ch); curl_close($ch); return $data; } /** * * 产生随机字符串,不长于50位 * @param int $length * @return 产生的随机字符串 */ private function getNonceStr($length = 50) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i < $length; $i++ ) { $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; } //获取当前时间戳(毫秒级) private function getMillisecond() { list($s1, $s2) = explode(' ', microtime()); return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000); } private function format($response) { $result = []; foreach ($response['list'] as $trace) { $result['data'][] = [ 'time' => $trace['time'], 'ftime' => $trace['time'], 'context' => $trace['status'], 'location' => null, ]; } $result['state'] = $response['deliverystatus']; return $result; } public function getMobile($order_id) { if (empty($order_id)){ throw new ShopException("订单id为空"); } $address = Order::uniacid()->with(['address'])->where('id',$order_id)->first(); if (empty($address['address']['mobile'])){ throw new ShopException("订单收货人号码为空"); } $mobile = substr($address['address']['mobile'],-4); return $mobile; } }