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; // 返回数据
|
|
}
|
|
|
|
|
|
|
|
}
|