diff --git a/app/services/freekassa_service.py b/app/services/freekassa_service.py index e091c1da..dd8e6f4b 100644 --- a/app/services/freekassa_service.py +++ b/app/services/freekassa_service.py @@ -16,6 +16,38 @@ from app.config import settings logger = structlog.get_logger(__name__) +# Email-заглушки для Freekassa API (test@example.com вызывает ошибку OP-SP-7) +_FALLBACK_EMAILS = [ + 'ivan.petrov@mail.ru', + 'user.alex@yandex.ru', + 'sergei.k@gmail.com', + 'dmitry.v@inbox.ru', + 'anna.s@bk.ru', + 'maxim.ivanov@list.ru', + 'elena.p@rambler.ru', + 'artem.n@mail.ru', + 'nikita.z@yandex.ru', + 'olga.m@gmail.com', + 'roman.t@inbox.ru', + 'svetlana.d@bk.ru', + 'kirill.a@mail.ru', + 'marina.b@yandex.ru', + 'pavel.g@list.ru', + 'tatiana.l@gmail.com', + 'andrey.f@rambler.ru', + 'natalia.e@inbox.ru', + 'vladislav.r@mail.ru', + 'yulia.h@yandex.ru', +] + + +def _get_fallback_email() -> str: + """Возвращает случайный email-заглушку из списка.""" + import random + + return random.choice(_FALLBACK_EMAILS) + + # Кэш для публичного IP _cached_public_ip: str | None = None _ip_fetch_lock = asyncio.Lock() @@ -190,7 +222,7 @@ class FreekassaService: # Определяем IP (важно для API запроса) - здесь синхронно, поэтому лучше иметь передачу IP # Если IP не передан, используем fallback target_ip = ip or '185.92.183.173' - target_email = email or 'test@example.com' + target_email = email or _get_fallback_email() params = { 'shopId': self.shop_id, @@ -278,7 +310,7 @@ class FreekassaService: # Используем payment_system_id из настроек, если не передан явно ps_id = payment_system_id or settings.FREEKASSA_PAYMENT_SYSTEM_ID or 1 - target_email = email or 'test@example.com' + target_email = email or _get_fallback_email() # Определяем публичный IP сервера server_ip = ip or await get_public_ip() diff --git a/app/services/payment/freekassa.py b/app/services/payment/freekassa.py index f0bba9f9..f8e5e4d2 100644 --- a/app/services/payment/freekassa.py +++ b/app/services/payment/freekassa.py @@ -350,13 +350,19 @@ class FreekassaPaymentMixin: # Resolve display name from payment metadata (sub-method aware) display_name = settings.get_freekassa_display_name_html() try: - meta = json.loads(payment.metadata_json) if payment.metadata_json else {} + raw = payment.metadata_json + if isinstance(raw, dict): + meta = raw + elif raw: + meta = json.loads(raw) + else: + meta = {} pm = meta.get('payment_method', 'freekassa') if pm == 'freekassa_sbp': display_name = settings.get_freekassa_sbp_display_name_html() elif pm == 'freekassa_card': display_name = settings.get_freekassa_card_display_name_html() - except (json.JSONDecodeError, AttributeError): + except (json.JSONDecodeError, AttributeError, TypeError): pass await self.bot.send_message( user.telegram_id,