Files
im/support/OpenImSdk/Core/Utils.php
T
2026-04-13 20:00:32 +08:00

218 lines
6.4 KiB
PHP
Executable File

<?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 post($uri,$data,[
"token: {$token}",
"operationID: {$options[RequestOptions::HEADERS]['operationID']}",
]);
return $client->post($uri, $options)->getBody()->getContents();
}
/**
* 发送API请求
* @param string $path API路径
* @param array $data 请求数据
* @return array 响应数据
*/
public static function send(string $path, array $data): array|bool
{
if($path != Url::$getAdminToken){
$token = Utils::getAdminToken();
}
$url = Url::buildUrl($path);
$res = self::request($url, $data, $token);
$res = json_decode($res, true);
if($res['errCode'] !==0 ){
cp('=============================调试信息=====================================');
cp($url);
cp(json_encode($data));
cp($res);
cp('=============================end=====================================');
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);
//cp($url);
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 = $result['token'];
// 使用API返回的过期时间
$expireTimeSeconds = $result['expireTimeSeconds'] ?? null;
// 保存token,使用API返回的过期时间
$tokenManager->saveAdminToken($userID, $token, $expireTimeSeconds);
}
return $token;
}
/**
* 获取用户Token
* 如果缓存中没有,则自动获取并缓存
* @param string $userID 用户ID
* @param string $platformID 平台ID
* @return string|null
*/
public static function getUserToken(string $userID, string $platformID = 'android'): ?string
{
$tokenManager = self::getTokenManager();
$token = $tokenManager->getUserToken($userID);
if (!$token) {
// 从服务器获取新的Token
$adminToken = self::getAdminToken();
if (!$adminToken) {
return null;
}
$result = self::send(Url::$getUserToken, [
'userID' => $userID,
'platformID' => self::getPlatformId($platformID)
]);
$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);
}
public static function getPlatformId($name=''): int{
if(ctype_digit($name)){
return (int)$name;
}
$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;
}
}