From a7d15a7d7100d86d844345bad9beafd76a73f095 Mon Sep 17 00:00:00 2001 From: imbeer Date: Fri, 30 May 2025 20:05:09 +0300 Subject: [PATCH] fix yookassa method id and time return --- backend/dashboard/views.py | 2 +- backend/subscription/serializers.py | 5 +++-- backend/subscription/service.py | 16 ++++++++++------ backend/subscription/tasks.py | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/backend/dashboard/views.py b/backend/dashboard/views.py index 44469726..7a44f787 100644 --- a/backend/dashboard/views.py +++ b/backend/dashboard/views.py @@ -76,7 +76,7 @@ def subscription_list_api(request): "start_date": sub.start_date.strftime("%Y-%m-%d") if sub.start_date else "N/A", "end_date": sub.end_date.strftime("%Y-%m-%d") if sub.end_date else "N/A", "is_active": sub.is_active, - "transaction_id": sub.yookassa_payment_method_id or "-", + "transaction_id": sub.latest_yookassa_payment_id or "-", } for sub in page.object_list ], diff --git a/backend/subscription/serializers.py b/backend/subscription/serializers.py index 783b012b..792cec8b 100644 --- a/backend/subscription/serializers.py +++ b/backend/subscription/serializers.py @@ -8,7 +8,7 @@ def payment_response(payment, subscription, status): 'yookassa_payment_id': payment.id, 'subscription_id': subscription.subscription_id } if payment is not None else { - 'yookassa_payment_id': subscription.yookassa_payment_method_id, + 'yookassa_payment_id': subscription.latest_yookassa_payment_id, 'subscription_id': subscription.subscription_id }, status=status ) @@ -19,7 +19,8 @@ def status_response(is_subscribed, subscription, user, status): { 'is_subscribed': is_subscribed, 'user_id': user.user_id, - 'next_payment': subscription.end_date, + 'next_payment': subscription.end_date.replace(tzinfo=None).isoformat( + timespec='seconds'), 'is_active': subscription.is_active, 'subscription_id': subscription.subscription_id } if subscription is not None else diff --git a/backend/subscription/service.py b/backend/subscription/service.py index 23c6789d..fd284350 100644 --- a/backend/subscription/service.py +++ b/backend/subscription/service.py @@ -1,7 +1,6 @@ import logging import uuid -from dateutil.utils import today from django.utils import timezone from yookassa import Configuration, Payment from yookassa.domain.notification import WebhookNotificationFactory, WebhookNotificationEventType @@ -80,7 +79,10 @@ def recreate_subscription_payment(user, subscription): payment = create_payment(subscription, payment_description) return payment, subscription else: - subscription.activate(subscription.yookassa_payment_method_id) + # payment = create_payment_without_confirmation(subscription, payment_description, subscription.yookassa_payment_method_id) + # subscription.activate(subscription.latest_yookassa_payment_id) + subscription.is_active = True + subscription.save() return None, subscription def cancel_subscription(token): @@ -109,11 +111,12 @@ def handle_message_from_yookassa(data): def handle_success(response_object): subscription = get_subscription_from_webhook(response_object) metadata = response_object.metadata + payment = Payment.find_one(payment_id=response_object.payment_id) if metadata.get('payment_type') == "initial_subscription": - subscription.activate(response_object.id) + subscription.activate(response_object.payment_id, payment.payment_method.id) logger.info(f"Initial subscription {subscription.subscription_id} activated") elif metadata.get('payment_type') == "reccurring_subscription": - subscription.renew_subscription(response_object.id) + subscription.renew_subscription(response_object.payment_id) logger.info(f"Initial subscription {subscription.subscription_id} updated") else: raise YooKassaError(f"Payment type {response_object.event} not supported") @@ -122,7 +125,7 @@ def handle_cancel(response_object): subscription = get_subscription_from_webhook(response_object) metadata = response_object.metadata if metadata.get('payment_type') == "initial_subscription": - subscription.delete() + subscription.deactivate() logger.info(f"Initial subscription {subscription.subscription_id} deleted, initial payment canceled") elif metadata.get('payment_type') == "reccurring_subscription": subscription.deactivate() @@ -148,7 +151,7 @@ def create_payment(subscription, description): } }, uuid.uuid4()) -def create_payment_without_confirmation(subscription, description): +def create_payment_without_confirmation(subscription, description, payment_method_id): return Payment.create({ "amount": { "value": SUBSCRIPTION_PRICE, @@ -157,6 +160,7 @@ def create_payment_without_confirmation(subscription, description): "capture": True, "description": description, "save_payment_method": True, + "payment_method_id": payment_method_id, "metadata": { "subscription_internal_id": str(subscription.subscription_id), "payment_type": "recurring_subscription" diff --git a/backend/subscription/tasks.py b/backend/subscription/tasks.py index 014582a7..0dbbb2b8 100644 --- a/backend/subscription/tasks.py +++ b/backend/subscription/tasks.py @@ -29,7 +29,7 @@ def charge_recurring_subscriptions(): logger.info(f"Attempting to renew subscription {sub.subscription_id} for user {sub.user.email}") try: - create_payment_without_confirmation(sub, f"Продление ежемесячной подписки для {sub.user.email}") + create_payment_without_confirmation(sub, f"Продление ежемесячной подписки для {sub.user.email}", sub.yookassa_payment_method_id) logger.info(f"Renewal payment initiated for subscription {sub.subscription_id}.") except Exception as e: logger.info(f"Failed to initiate renewal payment for subscription {sub.subscription_id}: {e}")