114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace App\Protocol;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use App\Config\YlyConfig;
							 | 
						||
| 
								 | 
							
								use Exception;
							 | 
						||
| 
								 | 
							
								class YlyRpcClient{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private $clientId;
							 | 
						||
| 
								 | 
							
								    private $clientSecret;
							 | 
						||
| 
								 | 
							
								    private $requestUrl;
							 | 
						||
| 
								 | 
							
								    private $token;
							 | 
						||
| 
								 | 
							
								    private $log;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function __construct($token, YlyConfig $config)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->clientId = $config->getClientId();
							 | 
						||
| 
								 | 
							
								        $this->clientSecret = $config->getClientSecret();
							 | 
						||
| 
								 | 
							
								        $this->requestUrl = $config->getRequestUrl();
							 | 
						||
| 
								 | 
							
								        $this->log = $config->getLog();
							 | 
						||
| 
								 | 
							
								        $this->token = $token;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function call($action, array $params)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $time = time();
							 | 
						||
| 
								 | 
							
								        $params = array_merge(array(
							 | 
						||
| 
								 | 
							
								            'client_id' => $this->clientId,
							 | 
						||
| 
								 | 
							
								            'timestamp' => $time,
							 | 
						||
| 
								 | 
							
								            'sign' => $this->getSign($time),
							 | 
						||
| 
								 | 
							
								            'id' => $this->uuid4(),
							 | 
						||
| 
								 | 
							
								            'access_token' => $this->token,
							 | 
						||
| 
								 | 
							
								        ), $params);
							 | 
						||
| 
								 | 
							
								        $result = $this->send($params, $this->requestUrl . '/' .$action);
							 | 
						||
| 
								 | 
							
								        $response = json_decode($result, false, 512, JSON_BIGINT_AS_STRING);
							 | 
						||
| 
								 | 
							
								        if (is_null($response)) {
							 | 
						||
| 
								 | 
							
								            throw new Exception("invalid response.");
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (
							 | 
						||
| 
								 | 
							
								            isset($response->error) &&
							 | 
						||
| 
								 | 
							
								            $response->error != 0
							 | 
						||
| 
								 | 
							
								        ){
							 | 
						||
| 
								 | 
							
								            $errorDescription = isset($response->body) ? $response->error_description . $response->body : $response->error_description;
							 | 
						||
| 
								 | 
							
								            throw new Exception('Call method ' . $action . ' error code is ' . $response->error . ' error message is ' . $errorDescription);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $response;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getSign($timestamp)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return md5(
							 | 
						||
| 
								 | 
							
								            $this->clientId.
							 | 
						||
| 
								 | 
							
								            $timestamp.
							 | 
						||
| 
								 | 
							
								            $this->clientSecret
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function uuid4(){
							 | 
						||
| 
								 | 
							
								        mt_srand((double)microtime() * 10000);
							 | 
						||
| 
								 | 
							
								        $charid = strtolower(md5(uniqid(rand(), true)));
							 | 
						||
| 
								 | 
							
								        $hyphen = '-';
							 | 
						||
| 
								 | 
							
								        $uuidV4 =
							 | 
						||
| 
								 | 
							
								            substr($charid, 0, 8) . $hyphen .
							 | 
						||
| 
								 | 
							
								            substr($charid, 8, 4) . $hyphen .
							 | 
						||
| 
								 | 
							
								            substr($charid, 12, 4) . $hyphen .
							 | 
						||
| 
								 | 
							
								            substr($charid, 16, 4) . $hyphen .
							 | 
						||
| 
								 | 
							
								            substr($charid, 20, 12);
							 | 
						||
| 
								 | 
							
								        return $uuidV4;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function send($data,$url)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $requestInfo = http_build_query($data);
							 | 
						||
| 
								 | 
							
								        $log = $this->log;
							 | 
						||
| 
								 | 
							
								        if ($log != null) {
							 | 
						||
| 
								 | 
							
								            $log->info("request data: " . $requestInfo);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $curl = curl_init(); // 启动一个CURL会话
							 | 
						||
| 
								 | 
							
								        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
							 | 
						||
| 
								 | 
							
								        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
							 | 
						||
| 
								 | 
							
								        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
							 | 
						||
| 
								 | 
							
								            'Expect:'
							 | 
						||
| 
								 | 
							
								        )); // 解决数据包大不能提交
							 | 
						||
| 
								 | 
							
								        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, $requestInfo); // Post提交的数据包
							 | 
						||
| 
								 | 
							
								        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循
							 | 
						||
| 
								 | 
							
								        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
							 | 
						||
| 
								 | 
							
								        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
							 | 
						||
| 
								 | 
							
								        $response = curl_exec($curl); // 执行操作
							 | 
						||
| 
								 | 
							
								        if (curl_errno($curl)) {
							 | 
						||
| 
								 | 
							
								            if ($log != null) {
							 | 
						||
| 
								 | 
							
								                $log->error("error: " . curl_error($curl));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            throw new Exception(curl_error($curl));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if ($log != null) {
							 | 
						||
| 
								 | 
							
								            $log->info("response: " . $response);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        curl_close($curl); // 关键CURL会话
							 | 
						||
| 
								 | 
							
								        return $response; // 返回数据
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |