*/ public static function realSendingRequiredEnv(): array { return match (self::driver()) { 'submail' => self::submailRequiredEnv(), default => self::tencentCloudRequiredEnv(), }; } /** @return array */ public static function tencentCloudRequiredEnv(): array { return [ 'sms.tencentcloud.endpoint' => 'TENCENT_SMS_ENDPOINT', 'sms.tencentcloud.sdk_app_id' => 'TENCENT_SMS_SDK_APP_ID', 'sms.tencentcloud.app_key' => 'TENCENT_SMS_APP_KEY', 'sms.tencentcloud.sign_name' => 'TENCENT_SMS_SIGN_NAME', 'sms.tencentcloud.template_id' => 'TENCENT_SMS_TEMPLATE_ID', ]; } /** @return array */ public static function submailRequiredEnv(): array { return [ 'sms.submail.endpoint' => 'SUBMAIL_SMS_ENDPOINT', 'sms.submail.app_id' => 'SUBMAIL_APP_ID', 'sms.submail.app_key' => 'SUBMAIL_APP_KEY', 'sms.submail.sign_name' => 'SUBMAIL_SMS_SIGN_NAME', 'sms.submail.login_template_id' => 'SUBMAIL_LOGIN_TEMPLATE_ID', ]; } public static function driver(): string { $driver = trim((string) config('sms.driver', 'submail')); return $driver !== '' ? $driver : 'submail'; } public static function activeProvider(): string { if (! (bool) config('sms.enabled')) { return SmsVerification::PROVIDER_DISABLED; } return self::driver() === 'tencentcloud' ? SmsVerification::PROVIDER_TENCENTCLOUD : SmsVerification::PROVIDER_SUBMAIL; } public static function activeLoginTemplateId(): string { return self::driver() === 'tencentcloud' ? (string) config('sms.tencentcloud.template_id') : (string) config('sms.submail.login_template_id'); } public static function activeSignName(): string { return self::driver() === 'tencentcloud' ? (string) config('sms.tencentcloud.sign_name') : (string) config('sms.submail.sign_name'); } public static function assertReadyForRealSending(): void { if (! (bool) config('sms.enabled')) { return; } $driver = self::driver(); if ($driver === 'submail') { self::assertKeysPresent(self::submailRequiredEnv(), 'Submail SMS configuration is incomplete.'); return; } if ($driver !== 'tencentcloud') { throw new RuntimeException('SMS_ENABLED=true requires SMS_DRIVER=submail or tencentcloud.'); } $missing = []; foreach (self::tencentCloudRequiredEnv() as $configKey => $envName) { $value = config($configKey); if ($value === null || trim((string) $value) === '') { $missing[] = $envName; } } if ((int) config('sms.tencentcloud.template_param_count') !== 2) { $missing[] = 'TENCENT_SMS_TEMPLATE_PARAM_COUNT must be 2'; } if ($missing !== []) { throw new RuntimeException( 'SMS_ENABLED=true but Tencent Cloud SMS configuration is incomplete. ' .'The legacy application API requires SDKAppID and App Key. Missing or invalid: ' .implode(', ', $missing) ); } } /** * @param array $map */ private static function assertKeysPresent(array $map, string $prefix): void { $missing = []; foreach ($map as $configKey => $envName) { $value = config($configKey); if ($value === null || trim((string) $value) === '') { $missing[] = $envName; } } if ($missing !== []) { throw new RuntimeException($prefix.' Missing or invalid: '.implode(', ', $missing)); } } }