glhcp/server/vendor/yly-openapi/yly-openapi-sdk/Lib/Protocol/YlyRpcClient.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; // 返回数据
}
}