Enable gated multi-level referral profit and harden chat/SMS notify paths.

Honor enable_customer_level_profit for order referral payouts, and tighten support-chat webhook/SMS plus SuperAdmin SMS panel sync settings.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-10 16:48:53 +03:30
co-authored by Cursor
parent f421fcb83f
commit 279e4bc881
8 changed files with 277 additions and 110 deletions
+80 -28
View File
@@ -12,62 +12,114 @@ class ChatWebhookService
{
public function ensureRegistered(): bool
{
return (bool) ($this->ensureRegisteredDetailed()['ok'] ?? false);
}
/**
* @return array{ok: bool, reason: string, message: string, webhook_url: string, attempts?: int}
*/
public function ensureRegisteredDetailed(int $maxAttempts = 3): array
{
$webhookUrl = $this->webhookUrl();
$chatApi = Controller::Config('chat_api');
$chatApiKey = Controller::Config('chat_api_key');
if (!$chatApi || !$chatApiKey) {
return false;
if (! $chatApi || ! $chatApiKey) {
return [
'ok' => false,
'reason' => 'missing_chat_config',
'message' => 'تنظیمات chat_api یا chat_api_key خالی است',
'webhook_url' => $webhookUrl,
];
}
$host = preg_replace('#^https?://#', '', rtrim((string) $chatApi, '/'));
$secret = $this->ensureSecret();
if ($host === '' || $secret === '') {
return false;
return [
'ok' => false,
'reason' => 'invalid_host_or_secret',
'message' => 'آدرس چت یا رمز وب‌هوک نامعتبر است',
'webhook_url' => $webhookUrl,
];
}
$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;
return [
'ok' => false,
'reason' => 'unreachable_webhook_url',
'message' => 'آدرس وب‌هوک محلی/غیرقابل‌دسترس است؛ chat_webhook_base_url را روی آدرس عمومی سرور بگذارید',
'webhook_url' => $webhookUrl,
];
}
try {
$response = Http::timeout(8)->post('https://'.$host.'/api/projects/set-webhook', [
'api_key' => $chatApiKey,
'webhook_url' => $webhookUrl,
'webhook_secret' => $secret,
]);
$attempts = max(1, $maxAttempts);
$lastReason = 'unknown';
$lastMessage = 'ثبت وب‌هوک ناموفق بود';
if (! $response->successful()) {
for ($i = 1; $i <= $attempts; $i++) {
try {
$response = Http::timeout(8)
->retry(0)
->post('https://'.$host.'/api/projects/set-webhook', [
'api_key' => $chatApiKey,
'webhook_url' => $webhookUrl,
'webhook_secret' => $secret,
]);
if ($response->successful()) {
Log::info('chat webhook registered', [
'host' => $host,
'webhook_url' => $webhookUrl,
'attempt' => $i,
]);
return [
'ok' => true,
'reason' => 'registered',
'message' => 'webhook registered',
'webhook_url' => $webhookUrl,
'attempts' => $i,
];
}
$lastReason = 'chat_api_http_'.$response->status();
$lastMessage = 'سرور چت ثبت وب‌هوک را رد کرد (HTTP '.$response->status().')';
Log::warning('chat webhook register non-2xx', [
'host' => $host,
'webhook_url' => $webhookUrl,
'status' => $response->status(),
'body' => mb_substr($response->body(), 0, 300),
'attempt' => $i,
]);
} catch (\Throwable $e) {
$lastReason = 'chat_api_exception';
$lastMessage = 'ارتباط با سرور چت برای ثبت وب‌هوک برقرار نشد';
Log::warning('chat webhook register failed', [
'host' => $host,
'webhook_url' => $webhookUrl,
'error' => $e->getMessage(),
'attempt' => $i,
]);
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(),
]);
return false;
if ($i < $attempts) {
usleep(250000 * $i);
}
}
return [
'ok' => false,
'reason' => $lastReason,
'message' => $lastMessage,
'webhook_url' => $webhookUrl,
'attempts' => $attempts,
];
}
/**