fix support issue
This commit is contained in:
@@ -25,7 +25,15 @@ class ChatWebhookService
|
||||
return false;
|
||||
}
|
||||
|
||||
$webhookUrl = rtrim((string) config('app.url'), '/').'/api/chat/support-message-notify';
|
||||
$webhookUrl = $this->webhookUrl();
|
||||
if ($this->isUnreachableWebhookUrl($webhookUrl)) {
|
||||
Log::warning('chat webhook register refused: unreachable/local URL', [
|
||||
'webhook_url' => $webhookUrl,
|
||||
'hint' => 'Set chat_webhook_base_url to public Laravel URL (e.g. https://niazitala.ir/server) or fix APP_URL',
|
||||
]);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$response = Http::timeout(8)->post('https://'.$host.'/api/projects/set-webhook', [
|
||||
@@ -34,10 +42,27 @@ class ChatWebhookService
|
||||
'webhook_secret' => $secret,
|
||||
]);
|
||||
|
||||
return $response->successful();
|
||||
if (! $response->successful()) {
|
||||
Log::warning('chat webhook register non-2xx', [
|
||||
'host' => $host,
|
||||
'webhook_url' => $webhookUrl,
|
||||
'status' => $response->status(),
|
||||
'body' => mb_substr($response->body(), 0, 300),
|
||||
]);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Log::info('chat webhook registered', [
|
||||
'host' => $host,
|
||||
'webhook_url' => $webhookUrl,
|
||||
]);
|
||||
|
||||
return true;
|
||||
} catch (\Throwable $e) {
|
||||
Log::warning('chat webhook register failed', [
|
||||
'host' => $host,
|
||||
'webhook_url' => $webhookUrl,
|
||||
'error' => $e->getMessage(),
|
||||
]);
|
||||
|
||||
@@ -45,9 +70,39 @@ class ChatWebhookService
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* آدرس عمومی وبهوک — باید به لاراول بخورد نه فرانت SPA.
|
||||
* اولویت: chat_webhook_base_url (مثلاً https://niazitala.ir/server) سپس APP_URL.
|
||||
*/
|
||||
public function webhookUrl(): string
|
||||
{
|
||||
$base = trim((string) Controller::Config('chat_webhook_base_url'));
|
||||
if ($base === '' || $base === '0' || strtolower($base) === 'false') {
|
||||
$base = rtrim((string) config('app.url'), '/');
|
||||
} else {
|
||||
$base = rtrim($base, '/');
|
||||
}
|
||||
|
||||
return $base.'/api/chat/support-message-notify';
|
||||
}
|
||||
|
||||
public function isUnreachableWebhookUrl(string $url): bool
|
||||
{
|
||||
$host = parse_url($url, PHP_URL_HOST);
|
||||
if (! is_string($host) || $host === '') {
|
||||
return true;
|
||||
}
|
||||
|
||||
$host = strtolower($host);
|
||||
|
||||
return in_array($host, ['localhost', '127.0.0.1', '::1', '0.0.0.0'], true)
|
||||
|| str_ends_with($host, '.local')
|
||||
|| str_ends_with($host, '.internal');
|
||||
}
|
||||
|
||||
public function ensureSecret(): string
|
||||
{
|
||||
$existing = trim((string) Controller::Config('chat_webhook_secret'));
|
||||
$existing = $this->sanitizeSecret((string) Controller::Config('chat_webhook_secret'));
|
||||
if ($existing !== '') {
|
||||
return $existing;
|
||||
}
|
||||
@@ -56,11 +111,18 @@ class ChatWebhookService
|
||||
|
||||
$row = Setting::where('key', 'chat_webhook_secret')->first();
|
||||
if ($row) {
|
||||
if (trim((string) $row->value) === '') {
|
||||
$current = $this->sanitizeSecret((string) $row->value);
|
||||
if ($current === '') {
|
||||
$row->value = $secret;
|
||||
$row->save();
|
||||
} else {
|
||||
return (string) $row->value;
|
||||
// مقدار ذخیرهشده کاراکتر نامعتبر هدر داشت — با نسخهٔ تمیز جایگزین کن
|
||||
if ($current !== trim((string) $row->value)) {
|
||||
$row->value = $current;
|
||||
$row->save();
|
||||
}
|
||||
|
||||
return $current;
|
||||
}
|
||||
} else {
|
||||
Setting::create([
|
||||
@@ -76,4 +138,18 @@ class ChatWebhookService
|
||||
|
||||
return $secret;
|
||||
}
|
||||
|
||||
/** فقط ASCII قابلاستفاده در هدر HTTP (بدون فاصله/خط جدید/یونیکد). */
|
||||
public function sanitizeSecret(string $secret): string
|
||||
{
|
||||
$secret = trim($secret);
|
||||
if ($secret === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
// حذف کاراکترهای غیرقابلقبول برای header value
|
||||
$clean = preg_replace('/[^\x21-\x7E]/', '', $secret) ?? '';
|
||||
|
||||
return trim($clean);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user