mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-07 14:15:02 +00:00
195 lines
7.1 KiB
Python
195 lines
7.1 KiB
Python
"""
|
|
Конфигурация платежных систем.
|
|
"""
|
|
|
|
import os
|
|
from typing import Dict, Any, Optional
|
|
from services.donation_service import PaymentConfig
|
|
|
|
|
|
class PaymentConfiguration:
|
|
"""
|
|
Конфигурация для всех платежных провайдеров.
|
|
|
|
Управляет настройками Stripe, YooKassa, СБП и других провайдеров.
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""Инициализация конфигурации"""
|
|
self.providers = self._load_provider_configs()
|
|
|
|
def _load_provider_configs(self) -> Dict[str, PaymentConfig]:
|
|
"""
|
|
Загрузка конфигураций всех провайдеров.
|
|
|
|
Returns:
|
|
Dict[str, PaymentConfig]: Конфигурации провайдеров
|
|
"""
|
|
return {
|
|
'stripe': PaymentConfig(
|
|
enabled=self._get_bool_env('PAYMENT_STRIPE_ENABLED', True),
|
|
api_key=os.getenv('STRIPE_API_KEY'),
|
|
webhook_secret=os.getenv('STRIPE_WEBHOOK_SECRET')
|
|
),
|
|
|
|
'yookassa': PaymentConfig(
|
|
enabled=self._get_bool_env('PAYMENT_YOOKASSA_ENABLED', False),
|
|
shop_id=os.getenv('YOOKASSA_SHOP_ID'),
|
|
secret_key=os.getenv('YOOKASSA_SECRET_KEY')
|
|
),
|
|
|
|
'sbp': PaymentConfig(
|
|
enabled=self._get_bool_env('PAYMENT_SBP_ENABLED', False),
|
|
api_key=os.getenv('SBP_API_KEY'),
|
|
bank_id=os.getenv('SBP_BANK_ID'),
|
|
webhook_secret=os.getenv('SBP_WEBHOOK_SECRET')
|
|
)
|
|
}
|
|
|
|
def _get_bool_env(self, key: str, default: bool = False) -> bool:
|
|
"""
|
|
Получение булевого значения из переменной окружения.
|
|
|
|
Args:
|
|
key: Ключ переменной окружения
|
|
default: Значение по умолчанию
|
|
|
|
Returns:
|
|
bool: Булево значение
|
|
"""
|
|
value = os.getenv(key, str(default)).lower()
|
|
return value in ('true', '1', 'yes', 'on')
|
|
|
|
def get_provider_config(self, provider_name: str) -> Optional[PaymentConfig]:
|
|
"""
|
|
Получение конфигурации провайдера.
|
|
|
|
Args:
|
|
provider_name: Название провайдера
|
|
|
|
Returns:
|
|
Optional[PaymentConfig]: Конфигурация провайдера или None
|
|
"""
|
|
return self.providers.get(provider_name)
|
|
|
|
def get_enabled_providers(self) -> Dict[str, PaymentConfig]:
|
|
"""
|
|
Получение всех включенных провайдеров.
|
|
|
|
Returns:
|
|
Dict[str, PaymentConfig]: Включенные провайдеры
|
|
"""
|
|
return {name: config for name, config in self.providers.items() if config.enabled}
|
|
|
|
def validate_configs(self) -> Dict[str, Any]:
|
|
"""
|
|
Валидация всех конфигураций.
|
|
|
|
Returns:
|
|
Dict[str, Any]: Результаты валидации
|
|
"""
|
|
results = {
|
|
'valid': True,
|
|
'errors': [],
|
|
'warnings': []
|
|
}
|
|
|
|
for provider_name, config in self.providers.items():
|
|
if not config.enabled:
|
|
continue
|
|
|
|
# Проверка обязательных полей
|
|
if provider_name == 'stripe':
|
|
if not config.api_key:
|
|
results['errors'].append(f"STRIPE_API_KEY required for {provider_name}")
|
|
if not config.webhook_secret:
|
|
results['errors'].append(f"STRIPE_WEBHOOK_SECRET required for {provider_name}")
|
|
|
|
elif provider_name == 'yookassa':
|
|
if not config.shop_id:
|
|
results['errors'].append(f"YOOKASSA_SHOP_ID required for {provider_name}")
|
|
if not config.secret_key:
|
|
results['errors'].append(f"YOOKASSA_SECRET_KEY required for {provider_name}")
|
|
|
|
elif provider_name == 'sbp':
|
|
# Для СБП конфигурация пока не обязательна (заглушка)
|
|
if not config.api_key:
|
|
results['warnings'].append(f"SBP_API_KEY not set for {provider_name}")
|
|
|
|
results['valid'] = len(results['errors']) == 0
|
|
return results
|
|
|
|
def get_payment_limits(self) -> Dict[str, Any]:
|
|
"""
|
|
Получение лимитов платежей.
|
|
|
|
Returns:
|
|
Dict[str, Any]: Лимиты платежей
|
|
"""
|
|
return {
|
|
'min_amount': float(os.getenv('PAYMENT_MIN_AMOUNT', '10.0')),
|
|
'max_amount': float(os.getenv('PAYMENT_MAX_AMOUNT', '10000.0')),
|
|
'allowed_currencies': ['RUB', 'USD', 'EUR'],
|
|
'rate_limits': {
|
|
'max_payments_per_hour': int(os.getenv('PAYMENT_MAX_PER_HOUR', '10')),
|
|
'max_amount_per_hour': float(os.getenv('PAYMENT_MAX_AMOUNT_PER_HOUR', '50000.0'))
|
|
}
|
|
}
|
|
|
|
def get_notification_settings(self) -> Dict[str, Any]:
|
|
"""
|
|
Получение настроек уведомлений.
|
|
|
|
Returns:
|
|
Dict[str, Any]: Настройки уведомлений
|
|
"""
|
|
return {
|
|
'bot_token': os.getenv('TELEGRAM_BOT_TOKEN'),
|
|
'admin_chat_ids': self._parse_admin_chat_ids(os.getenv('PAYMENT_ADMIN_CHAT_IDS', '')),
|
|
'notify_success': self._get_bool_env('PAYMENT_NOTIFY_SUCCESS', True),
|
|
'notify_failure': self._get_bool_env('PAYMENT_NOTIFY_FAILURE', True),
|
|
'notify_admin_errors': self._get_bool_env('PAYMENT_NOTIFY_ADMIN_ERRORS', True)
|
|
}
|
|
|
|
def _parse_admin_chat_ids(self, chat_ids_str: str) -> list:
|
|
"""
|
|
Парсинг списка ID чатов администраторов.
|
|
|
|
Args:
|
|
chat_ids_str: Строка с ID чатов через запятую
|
|
|
|
Returns:
|
|
list: Список ID чатов
|
|
"""
|
|
if not chat_ids_str:
|
|
return []
|
|
|
|
try:
|
|
return [int(chat_id.strip()) for chat_id in chat_ids_str.split(',') if chat_id.strip()]
|
|
except ValueError:
|
|
return []
|
|
|
|
|
|
# Глобальная конфигурация
|
|
payment_config = PaymentConfiguration()
|
|
|
|
|
|
def get_payment_config() -> PaymentConfiguration:
|
|
"""Получение глобальной конфигурации платежей"""
|
|
return payment_config
|
|
|
|
|
|
# Функции для быстрого доступа
|
|
def get_provider_config(provider_name: str) -> Optional[PaymentConfig]:
|
|
"""Получение конфигурации провайдера"""
|
|
return payment_config.get_provider_config(provider_name)
|
|
|
|
|
|
def get_enabled_providers() -> Dict[str, PaymentConfig]:
|
|
"""Получение включенных провайдеров"""
|
|
return payment_config.get_enabled_providers()
|
|
|
|
|
|
def validate_payment_configs() -> Dict[str, Any]:
|
|
"""Валидация конфигураций"""
|
|
return payment_config.validate_configs() |