diff --git a/app/Http/Controllers/V2/Admin/ConfigController.php b/app/Http/Controllers/V2/Admin/ConfigController.php index b3a7ce8..80f8afb 100644 --- a/app/Http/Controllers/V2/Admin/ConfigController.php +++ b/app/Http/Controllers/V2/Admin/ConfigController.php @@ -71,17 +71,22 @@ class ConfigController extends Controller public function setTelegramWebhook(Request $request) { - $app_url = admin_setting('app_url'); - if (blank($app_url)) - return $this->fail([422, '请先设置站点网址']); - $hookUrl = $app_url . '/api/v1/guest/telegram/webhook?' . http_build_query([ + $hookUrl = $this->resolveTelegramWebhookUrl(); + if (blank($hookUrl)) { + return $this->fail([422, 'Telegram Webhook地址未配置']); + } + $hookUrl .= '?' . http_build_query([ 'access_token' => md5(admin_setting('telegram_bot_token', $request->input('telegram_bot_token'))) ]); $telegramService = new TelegramService($request->input('telegram_bot_token')); $telegramService->getMe(); - $telegramService->setWebhook($hookUrl); + $telegramService->setWebhook(url: $hookUrl); $telegramService->registerBotCommands(); - return $this->success(true); + return $this->success([ + 'success' => true, + 'webhook_url' => $hookUrl, + 'webhook_base_url' => $this->getTelegramWebhookBaseUrl(), + ]); } public function fetch(Request $request) @@ -171,6 +176,7 @@ class ConfigController extends Controller 'telegram' => [ 'telegram_bot_enable' => (bool) admin_setting('telegram_bot_enable', 0), 'telegram_bot_token' => admin_setting('telegram_bot_token'), + 'telegram_webhook_url' => admin_setting('telegram_webhook_url'), 'telegram_discuss_link' => admin_setting('telegram_discuss_link') ], 'app' => [ @@ -313,4 +319,33 @@ class ConfigController extends Controller return ''; } + + private function getTelegramWebhookBaseUrl(): ?string + { + $customUrl = trim((string) admin_setting('telegram_webhook_url', '')); + if ($customUrl !== '') { + return rtrim($customUrl, '/'); + } + + $appUrl = trim((string) admin_setting('app_url', '')); + if ($appUrl !== '') { + return rtrim($appUrl, '/'); + } + + return null; + } + + private function resolveTelegramWebhookUrl(): ?string + { + $baseUrl = $this->getTelegramWebhookBaseUrl(); + if (!$baseUrl) { + return null; + } + + if (str_contains($baseUrl, '/api/v1/guest/telegram/webhook')) { + return $baseUrl; + } + + return $baseUrl . '/api/v1/guest/telegram/webhook'; + } } diff --git a/app/Http/Requests/Admin/ConfigSave.php b/app/Http/Requests/Admin/ConfigSave.php index 98a1952..5910421 100755 --- a/app/Http/Requests/Admin/ConfigSave.php +++ b/app/Http/Requests/Admin/ConfigSave.php @@ -68,6 +68,7 @@ class ConfigSave extends FormRequest // telegram 'telegram_bot_enable' => '', 'telegram_bot_token' => '', + 'telegram_webhook_url' => 'nullable|url', 'telegram_discuss_id' => '', 'telegram_channel_id' => '', 'telegram_discuss_link' => 'nullable|url', @@ -128,6 +129,7 @@ class ConfigSave extends FormRequest 'subscribe_url.url' => '订阅URL格式不正确,必须携带http(s)://', 'server_token.min' => '通讯密钥长度必须大于16位', 'tos_url.url' => '服务条款URL格式不正确,必须携带http(s)://', + 'telegram_webhook_url.url' => 'Telegram Webhook地址格式不正确,必须携带http(s)://', 'telegram_discuss_link.url' => 'Telegram群组地址必须为URL格式,必须携带http(s)://', 'logo.url' => 'LOGO URL格式不正确,必须携带https(s)://', 'secure_path.min' => '后台路径长度最小为8位',