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:
@@ -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,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user