Files
im/support/OpenImSdk/Core/Utils.php
T

211 lines
6.2 KiB
PHP
Raw Normal View History

2025-11-22 15:31:01 +08:00
<?php
namespace support\OpenImSdk\Core;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\RequestOptions;
use support\OpenImSdk\Exception\ValidatorException;
class Utils
{
/**
* TokenManager实例
* @var TokenManager|null
*/
private static $tokenManager = null;
/**
* 设置TokenManager
* @param TokenManager $tokenManager
*/
public static function setTokenManager(TokenManager $tokenManager)
{
self::$tokenManager = $tokenManager;
}
/**
* 获取TokenManager
* @return TokenManager
*/
public static function getTokenManager(): TokenManager
{
if (self::$tokenManager === null) {
// 默认使用文件缓存
self::$tokenManager = new TokenManager();
}
return self::$tokenManager;
}
/**
* 生成操作ID
* 用于请求追踪
* @return string
*/
public static function generateOperationID(): string
{
// 生成一个更具唯一性的操作ID
return uniqid('openim_', true) . '_' . str_replace('.', '', microtime(true));
}
/**
* 发起HTTP请求
* @param string $uri 请求URI
* @param array $data 请求数据
* @param string $token 认证令牌
* @return string 响应内容
* @throws GuzzleException
* @throws ValidatorException
*/
private static function request(string $uri, array $data, string $token): string
{
$client = new Client();
$options[RequestOptions::JSON] = Validator::validateArray($data);
// 添加必要的请求头
$options[RequestOptions::HEADERS]['operationID'] = self::generateOperationID();
if ($token) {
$options[RequestOptions::HEADERS]['token'] = $token;
}
return $client->post($uri, $options)->getBody()->getContents();
}
/**
* 发送API请求
* @param string $path API路径
* @param array $data 请求数据
* @param string $errMsg 错误信息
* @param string $token 认证令牌
* @return array 响应数据
*/
2026-02-15 19:41:56 +08:00
public static function send(string $path, array $data, string $errMsg='', string $token = ''): array|bool
2026-01-08 05:42:44 +08:00
{
2026-02-15 19:41:56 +08:00
if($path != Url::$getAdminToken){
$token = $token ? $token : Utils::getAdminToken();
}
2025-11-22 15:31:01 +08:00
$url = Url::buildUrl($path);
2026-02-15 19:41:56 +08:00
log_alert($url);
//log_alert($data);
2025-12-24 16:59:05 +08:00
$res = self::request($url, $data, $token);
2026-02-15 19:41:56 +08:00
//log_alert($res);
2025-12-24 16:59:05 +08:00
$res = json_decode($res, true);
2025-11-22 15:31:01 +08:00
if($res['errCode'] !==0 ){
throw new \Exception($res['errMsg'],$res['errCode']);
//throw new \Exception($res['errDlt'],$res['errCode']);
}
if(isset($res['data'])){
return $res['data'];
}
return true;
try {
$url = Url::buildUrl($path);
2026-01-08 05:42:44 +08:00
//cp($url);
2025-11-22 15:31:01 +08:00
return json_decode(self::request($url, $data, $token), true);
} catch (GuzzleException $e) {
return ['errCode' => $e->getCode(), 'errMsg' => $errMsg, 'errDlt' => $e->getMessage()];
} catch (ValidatorException $e) {
return ['errCode' => 400, 'errMsg' => $errMsg, 'errDlt' => $e->getMessage()];
}
}
/**
* 获取管理员Token
* 如果缓存中没有,则自动获取并缓存
* @param string $userID 管理员ID
* @return string|null
*/
public static function getAdminToken(string $userID = 'imAdmin'): ?string
{
$tokenManager = self::getTokenManager();
$token = $tokenManager->getAdminToken($userID);
if (!$token) {
// 从服务器获取新的Token
$result = self::send(Url::$getAdminToken, [
'userID' => $userID,
'secret' => Config::getSecret()
], '获取管理员Token失败');
$token = $result['token'];
// 使用API返回的过期时间
$expireTimeSeconds = $result['expireTimeSeconds'] ?? null;
// 保存token,使用API返回的过期时间
$tokenManager->saveAdminToken($userID, $token, $expireTimeSeconds);
}
return $token;
}
/**
* 获取用户Token
* 如果缓存中没有,则自动获取并缓存
* @param string $userID 用户ID
2025-12-24 16:59:05 +08:00
* @param string $platformID 平台ID
2025-11-22 15:31:01 +08:00
* @return string|null
*/
2025-12-24 16:59:05 +08:00
public static function getUserToken(string $userID, string $platformID = 'android'): ?string
2025-11-22 15:31:01 +08:00
{
$tokenManager = self::getTokenManager();
$token = $tokenManager->getUserToken($userID);
if (!$token) {
// 从服务器获取新的Token
$adminToken = self::getAdminToken();
if (!$adminToken) {
return null;
}
$result = self::send(Url::$getUserToken, [
'userID' => $userID,
2025-12-24 16:59:05 +08:00
'platformID' => self::getPlatformId($platformID)
2025-11-22 15:31:01 +08:00
], '获取用户Token失败', $adminToken);
$token = $result['token'];
// 使用API返回的过期时间
$expireTimeSeconds = $result['expireTimeSeconds'] ?? null;
// 保存token,使用API返回的过期时间
$tokenManager->saveUserToken($userID, $token, $expireTimeSeconds);
}
return $token;
}
/**
* 清除Token缓存
* @param string $userID 用户ID
* @param bool $isAdmin 是否为管理员Token
* @return bool
*/
public static function clearToken(string $userID, bool $isAdmin = false): bool
{
return self::getTokenManager()->clearToken($userID, $isAdmin);
}
2025-12-24 16:59:05 +08:00
public static function getPlatformId($name=''): int{
$arr = [
'ios' => 1,
'android' => 2,
'windows' => 3,
'macos' => 4,
'web' => 5,
'mp-weixin' => 6,
'linux' => 7,
'androidpad' => 8,
'ipad' => 9,
'admin' => 10,
];
$name = strtolower($name);
if(isset($arr[$name])){
return $arr[$name];
}
return 2;
}
2025-11-22 15:31:01 +08:00
}