From e94915e6670b1b942abe75787a6b514d116aa06c Mon Sep 17 00:00:00 2001 From: adevopg <133045315+adevopg@users.noreply.github.com> Date: Tue, 18 Feb 2025 11:11:47 +0100 Subject: [PATCH] Actualizacion la compra con logs logs correspondientes --- .gitignore | 3 +- home/migrations/0009_stripelog.py | 30 ++ home/models.py | 18 +- home/pagos_stripe.py | 28 +- home/urls.py | 6 +- home/views.py | 319 +++++++++++++----- novawow/__pycache__/__init__.cpython-313.pyc | Bin 156 -> 0 bytes novawow/__pycache__/__init__.cpython-39.pyc | Bin 124 -> 0 bytes .../__pycache__/middleware.cpython-313.pyc | Bin 1882 -> 0 bytes novawow/__pycache__/middleware.cpython-39.pyc | Bin 1197 -> 0 bytes novawow/__pycache__/settings.cpython-313.pyc | Bin 5706 -> 0 bytes novawow/__pycache__/settings.cpython-39.pyc | Bin 4696 -> 0 bytes novawow/__pycache__/urls.cpython-313.pyc | Bin 1123 -> 0 bytes novawow/__pycache__/urls.cpython-39.pyc | Bin 577 -> 0 bytes novawow/__pycache__/views.cpython-313.pyc | Bin 360 -> 0 bytes novawow/__pycache__/views.cpython-39.pyc | Bin 300 -> 0 bytes novawow/__pycache__/wsgi.cpython-313.pyc | Bin 644 -> 0 bytes novawow/__pycache__/wsgi.cpython-39.pyc | Bin 527 -> 0 bytes novawow/settings.py | 4 +- 19 files changed, 321 insertions(+), 87 deletions(-) create mode 100644 home/migrations/0009_stripelog.py delete mode 100644 novawow/__pycache__/__init__.cpython-313.pyc delete mode 100644 novawow/__pycache__/__init__.cpython-39.pyc delete mode 100644 novawow/__pycache__/middleware.cpython-313.pyc delete mode 100644 novawow/__pycache__/middleware.cpython-39.pyc delete mode 100644 novawow/__pycache__/settings.cpython-313.pyc delete mode 100644 novawow/__pycache__/settings.cpython-39.pyc delete mode 100644 novawow/__pycache__/urls.cpython-313.pyc delete mode 100644 novawow/__pycache__/urls.cpython-39.pyc delete mode 100644 novawow/__pycache__/views.cpython-313.pyc delete mode 100644 novawow/__pycache__/views.cpython-39.pyc delete mode 100644 novawow/__pycache__/wsgi.cpython-313.pyc delete mode 100644 novawow/__pycache__/wsgi.cpython-39.pyc diff --git a/.gitignore b/.gitignore index 2330325..a4c6b38 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ venv/ home/__pycache__ -home/migrations/__pycache__ \ No newline at end of file +home/migrations/__pycache__ +**/__pycache__/*.pyc \ No newline at end of file diff --git a/home/migrations/0009_stripelog.py b/home/migrations/0009_stripelog.py new file mode 100644 index 0000000..187eb4b --- /dev/null +++ b/home/migrations/0009_stripelog.py @@ -0,0 +1,30 @@ +# Generated by Django 5.1.4 on 2025-02-16 18:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0008_category_remove_storecategory_parent_category_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='StripeLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('account_id', models.IntegerField()), + ('username', models.CharField(max_length=100)), + ('email', models.EmailField(max_length=254)), + ('acore_ip', models.GenericIPAddressField()), + ('stripe_ip', models.GenericIPAddressField(blank=True, null=True)), + ('product_name', models.TextField()), + ('amount', models.DecimalField(decimal_places=2, max_digits=10)), + ('session_id', models.CharField(max_length=255)), + ('mode', models.CharField(choices=[('test', 'Test'), ('live', 'Live')], max_length=10)), + ('character_name', models.CharField(max_length=100)), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/home/models.py b/home/models.py index 91adf0e..2bd828c 100644 --- a/home/models.py +++ b/home/models.py @@ -271,4 +271,20 @@ class HomeApiPoints(models.Model): def __str__(self): return f"Cuenta {self.accountID} - PV: {self.vp}, DP: {self.dp}" - \ No newline at end of file + + +class StripeLog(models.Model): + account_id = models.IntegerField() # ID de la cuenta en acore_auth + username = models.CharField(max_length=100) # Nombre de la cuenta + email = models.EmailField() # Correo electrónico + acore_ip = models.GenericIPAddressField() # IP de acore_auth + stripe_ip = models.GenericIPAddressField(blank=True, null=True) # IP detectada por Stripe + product_name = models.TextField() # Producto comprado + amount = models.DecimalField(max_digits=10, decimal_places=2) # Precio total + session_id = models.CharField(max_length=255) # ID de la sesión de Stripe + mode = models.CharField(max_length=10, choices=[("test", "Test"), ("live", "Live")]) # Modo de Stripe + character_name = models.CharField(max_length=100) # Nombre del personaje que compró + timestamp = models.DateTimeField(auto_now_add=True) # Fecha y hora + + def __str__(self): + return f"{self.username} compró {self.product_name} por {self.amount}€ ({self.mode})" \ No newline at end of file diff --git a/home/pagos_stripe.py b/home/pagos_stripe.py index d4b9522..debec79 100644 --- a/home/pagos_stripe.py +++ b/home/pagos_stripe.py @@ -1,10 +1,12 @@ import stripe from django.conf import settings - +from .models import StripeLog +from django.utils.timezone import now stripe.api_key = settings.STRIPE_SECRET_KEY -def create_checkout_session(amount, currency="eur", success_url=None, cancel_url=None, product_name=""): +def create_checkout_session(account_id, username, email, acore_ip, amount, character_name, currency="eur", success_url=None, cancel_url=None, product_name=""): try: + # 🔹 Crear sesión de pago en Stripe session = stripe.checkout.Session.create( payment_method_types=["card"], line_items=[{ @@ -19,6 +21,26 @@ def create_checkout_session(amount, currency="eur", success_url=None, cancel_url success_url=success_url, cancel_url=cancel_url, ) + + # 🔹 Determinar si Stripe está en modo TEST o LIVE + mode = "live" if settings.STRIPE_SECRET_KEY.startswith("sk_live") else "test" + + # 🔹 Guardar el log en la base de datos + StripeLog.objects.create( + account_id=account_id, + username=username, + email=email, + acore_ip=acore_ip, + stripe_ip=None, # Se actualizará cuando llegue el webhook + product_name=product_name, + amount=amount, + session_id=session.id, + mode=mode, + character_name=character_name, + timestamp=now() + ) + return {"success": True, "session_id": session.id} + except Exception as e: - return {"success": False, "error": str(e)} + return {"success": False, "error": str(e)} \ No newline at end of file diff --git a/home/urls.py b/home/urls.py index 86844ab..ff1b669 100644 --- a/home/urls.py +++ b/home/urls.py @@ -1,6 +1,6 @@ from django.urls import path from . import views -from .views import home_view, download_client_view, content_creators_view +from .views import home_view, download_client_view, content_creators_view, stripe_webhook urlpatterns = [ path('', views.home_view, name='index'), # Ruta para la página principal @@ -71,7 +71,9 @@ urlpatterns = [ path('restore-character/', views.restore_character_view, name='restore-character'), path('restore-items/', views.restore_items_view, name='restore-items'), path('quest-character/', views.quest_character_view, name='quest-character'), - path('send-gift/', views.send_gift_view, name='send-gift'), + path('send-gift/', views.send_gift_view, name='send-gift'), + path("webhook/stripe/", stripe_webhook, name="stripe-webhook"), + ] handler404 = 'home.views.not_found' diff --git a/home/views.py b/home/views.py index 0a446c6..f3d95eb 100644 --- a/home/views.py +++ b/home/views.py @@ -6,8 +6,9 @@ from django.db import connections from django.contrib import messages from django.contrib.auth import logout from django import forms +import stripe from .pagos_stripe import create_checkout_session -from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward, AccountActivation, SecurityToken, GuildRenameSettings, VoteSite, VoteLog, HomeApiPoints, UnstuckHistory, ReviveHistory, RenamePrice, CustomizePrice, ChangeRacePrice, ChangeFactionPrice, LevelUpPrice, GoldPrice, TransferPrice, Category, Item +from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward, AccountActivation, SecurityToken, GuildRenameSettings, VoteSite, VoteLog, HomeApiPoints, UnstuckHistory, ReviveHistory, RenamePrice, CustomizePrice, ChangeRacePrice, ChangeFactionPrice, LevelUpPrice, GoldPrice, TransferPrice, Category, Item, StripeLog from django.views.decorators.csrf import csrf_exempt from datetime import datetime, timedelta from .zone_definitions import get_zone_name @@ -22,6 +23,27 @@ from decimal import Decimal, ROUND_HALF_UP # Configuración del logger logger = logging.getLogger(__name__) +@csrf_exempt +def stripe_webhook(request): + payload = request.body + sig_header = request.META.get("HTTP_STRIPE_SIGNATURE") + + try: + event = stripe.Webhook.construct_event(payload, sig_header, settings.STRIPE_WEBHOOK_SECRET) + + if event["type"] == "checkout.session.completed": + session = event["data"]["object"] + session_id = session["id"] + stripe_ip = request.META.get("REMOTE_ADDR") # IP detectada + + # 🔹 Actualizar la IP de Stripe en el log + StripeLog.objects.filter(session_id=session_id).update(stripe_ip=stripe_ip, timestamp=now()) + + return JsonResponse({"success": True}) + + except stripe.error.SignatureVerificationError: + return JsonResponse({"success": False, "message": "Firma de webhook no válida."}, status=400) + def get_class_css(class_id): class_map = { 1: 'warrior', @@ -1141,45 +1163,60 @@ def rename_character_view(request): if not username: return redirect('login') - # Obtener personajes del usuario desde la base de datos `acore_characters` + # 🔹 Obtener información de la cuenta desde acore_auth + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + SELECT id, email, last_ip FROM account WHERE username = %s + """, [username]) + account_info = cursor.fetchone() + + if not account_info: + return JsonResponse({'success': False, 'message': 'Error: Cuenta no encontrada.'}) + + account_id, email, acore_ip = account_info + client_ip = request.META.get('REMOTE_ADDR', '') + + # 🔹 Obtener personajes del usuario desde la base de datos `acore_characters` with connections['acore_characters'].cursor() as cursor: cursor.execute(""" - SELECT name - FROM characters - WHERE account = ( - SELECT id - FROM acore_auth.account - WHERE username = %s - ) - """, [username]) + SELECT name FROM characters WHERE account = %s + """, [account_id]) characters = [row[0] for row in cursor.fetchall()] - # Obtener el precio del renombrado + # 🔹 Obtener el precio del renombrado price_obj = RenamePrice.objects.first() price = price_obj.price if price_obj else 2.00 - - # Ejecutar el comando SOAP De prueba haber si el servidor funciona antes de proceder al pago + + # 🔹 Ejecutar el comando SOAP para verificar el servidor command = f".server info" response = execute_soap_command(command) if request.method == 'POST': character_name = request.POST.get('character') - + if response is None: return JsonResponse({'success': False, 'message': 'Error de comunicación con el servidor. Intente nuevamente más tarde.'}) - # Validar si el personaje fue seleccionado if not character_name: return JsonResponse({'success': False, 'message': 'Por favor, seleccione un personaje.'}) - # Verificar si el personaje pertenece al usuario if character_name not in characters: return JsonResponse({'success': False, 'message': 'No tienes permiso para renombrar este personaje.'}) - # Crear sesión de pago con Stripe + # 🔹 Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('rename-success')) cancel_url = request.build_absolute_uri(reverse('rename-cancel')) - stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Renombrar personaje: {character_name}") + stripe_response = create_checkout_session( + account_id=account_id, + username=username, + email=email, + acore_ip=acore_ip, + amount=price, + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Renombrar personaje: {character_name}" + ) if stripe_response["success"]: request.session['rename_character'] = character_name @@ -1244,17 +1281,25 @@ def customize_character_view(request): if not username: return redirect('login') - # Obtener personajes del usuario desde la base de datos `acore_characters` + # ?? Obtener informaci��n de la cuenta desde acore_auth + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + SELECT id, email, last_ip FROM account WHERE username = %s + """, [username]) + account_info = cursor.fetchone() + + if not account_info: + return JsonResponse({'success': False, 'message': 'Error: Cuenta no encontrada.'}) + + account_id, email, acore_ip = account_info + client_ip = request.META.get('REMOTE_ADDR', '') + + # ?? Obtener personajes del usuario desde la base de datos `acore_characters` with connections['acore_characters'].cursor() as cursor: cursor.execute(""" - SELECT name - FROM characters - WHERE account = ( - SELECT id - FROM acore_auth.account - WHERE username = %s - ) - """, [username]) + SELECT name FROM characters WHERE account = %s + """, [account_id]) + characters = [row[0] for row in cursor.fetchall()] # Obtener el precio de la personalización (si se gestiona desde el admin) @@ -1275,7 +1320,17 @@ def customize_character_view(request): # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('customize-success')) cancel_url = request.build_absolute_uri(reverse('customize-cancel')) - stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Personalizar personaje: {character_name}") + stripe_response = create_checkout_session( + account_id=account_id, + username=username, + email=email, + acore_ip=acore_ip, + amount=price, + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Personalizar personaje: {character_name}" + ) if stripe_response["success"]: @@ -1319,16 +1374,23 @@ def change_race_character_view(request): return redirect('login') # Obtener personajes del usuario desde la base de datos `acore_characters` + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + SELECT id, email, last_ip FROM account WHERE username = %s + """, [username]) + account_info = cursor.fetchone() + + if not account_info: + return JsonResponse({'success': False, 'message': 'Error: Cuenta no encontrada.'}) + + account_id, email, acore_ip = account_info + client_ip = request.META.get('REMOTE_ADDR', '') + + # ?? Obtener personajes del usuario desde la base de datos `acore_characters` with connections['acore_characters'].cursor() as cursor: cursor.execute(""" - SELECT name - FROM characters - WHERE account = ( - SELECT id - FROM acore_auth.account - WHERE username = %s - ) - """, [username]) + SELECT name FROM characters WHERE account = %s + """, [account_id]) characters = [row[0] for row in cursor.fetchall()] # Obtener el precio del cambio de raza @@ -1349,7 +1411,17 @@ def change_race_character_view(request): # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('change-race-success')) cancel_url = request.build_absolute_uri(reverse('change-race-cancel')) - stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Cambio de Raza del personaje: {character_name}") + stripe_response = create_checkout_session( + account_id=account_id, + username=username, + email=email, + acore_ip=acore_ip, + amount=price, + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Cambio de Raza del personaje: {character_name}" + ) if stripe_response["success"]: # Guardar el personaje en la sesión para el cambio @@ -1392,16 +1464,23 @@ def change_faction_character_view(request): return redirect('login') # Obtener personajes del usuario desde la base de datos `acore_characters` + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + SELECT id, email, last_ip FROM account WHERE username = %s + """, [username]) + account_info = cursor.fetchone() + + if not account_info: + return JsonResponse({'success': False, 'message': 'Error: Cuenta no encontrada.'}) + + account_id, email, acore_ip = account_info + client_ip = request.META.get('REMOTE_ADDR', '') + + # ?? Obtener personajes del usuario desde la base de datos `acore_characters` with connections['acore_characters'].cursor() as cursor: cursor.execute(""" - SELECT name - FROM characters - WHERE account = ( - SELECT id - FROM acore_auth.account - WHERE username = %s - ) - """, [username]) + SELECT name FROM characters WHERE account = %s + """, [account_id]) characters = [row[0] for row in cursor.fetchall()] # Obtener el precio del cambio de facción @@ -1422,7 +1501,17 @@ def change_faction_character_view(request): # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('change-faction-success')) cancel_url = request.build_absolute_uri(reverse('change-faction-cancel')) - stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Cambiar Faccion del personaje: {character_name}") + stripe_response = create_checkout_session( + account_id=account_id, + username=username, + email=email, + acore_ip=acore_ip, + amount=price, + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Cambiar Faccion del personaje: {character_name}" + ) if stripe_response["success"]: # Guardar el personaje seleccionado en la sesión @@ -1466,16 +1555,23 @@ def level_up_character_view(request): return redirect('login') # Obtener personajes del usuario desde la base de datos `acore_characters` + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + SELECT id, email, last_ip FROM account WHERE username = %s + """, [username]) + account_info = cursor.fetchone() + + if not account_info: + return JsonResponse({'success': False, 'message': 'Error: Cuenta no encontrada.'}) + + account_id, email, acore_ip = account_info + client_ip = request.META.get('REMOTE_ADDR', '') + + # ?? Obtener personajes del usuario desde la base de datos `acore_characters` with connections['acore_characters'].cursor() as cursor: cursor.execute(""" - SELECT name - FROM characters - WHERE account = ( - SELECT id - FROM acore_auth.account - WHERE username = %s - ) - """, [username]) + SELECT name FROM characters WHERE account = %s + """, [account_id]) characters = [row[0] for row in cursor.fetchall()] # Obtener el precio de subir a nivel 80 @@ -1496,7 +1592,17 @@ def level_up_character_view(request): # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('level-up-success')) cancel_url = request.build_absolute_uri(reverse('level-up-cancel')) - stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Subir el Nivel 80 del personaje: {character_name}") + stripe_response = create_checkout_session( + account_id=account_id, + username=username, + email=email, + acore_ip=acore_ip, + amount=price, + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Subir el Nivel 80 del personaje: {character_name}" + ) if stripe_response["success"]: # Guardar el personaje en la sesión para usarlo después del pago @@ -1542,19 +1648,30 @@ def gold_character_view(request): return redirect('login') # Obtener personajes y estado de conexión del usuario - with connections['acore_characters'].cursor() as cursor: - cursor.execute(""" - SELECT name, online, money - FROM characters - WHERE account = ( - SELECT id - FROM acore_auth.account - WHERE username = %s - ) - """, [username]) - characters_data = cursor.fetchall() + try: + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + SELECT id, email, last_ip FROM account WHERE username = %s + """, [username]) + account_info = cursor.fetchone() - characters = {row[0]: {'online': row[1], 'money': row[2]} for row in characters_data} + if not account_info: + return JsonResponse({'success': False, 'message': 'Error: Cuenta no encontrada.'}) + + account_id, email, acore_ip = account_info + client_ip = request.META.get('REMOTE_ADDR', '') + + # Obtener personajes del usuario desde la base de datos `acore_characters` + with connections['acore_characters'].cursor() as cursor: + cursor.execute(""" + SELECT name, online, money FROM characters WHERE account = %s + """, [account_id]) + characters_data = cursor.fetchall() + + characters = {row[0]: {'online': row[1], 'money': row[2]} for row in characters_data} + + except Exception as e: + return JsonResponse({'success': False, 'message': f'Error al obtener los personajes: {str(e)}'}) # Obtener precios del oro gold_prices = GoldPrice.objects.all().order_by('gold_amount') @@ -1588,7 +1705,19 @@ def gold_character_view(request): # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('gold-success')) cancel_url = request.build_absolute_uri(reverse('gold-cancel')) - stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Aumentar el Oro: {gold_amount} al Personaje: {character_name}") + + # Llamada corregida a create_checkout_session con todos los parámetros requeridos + stripe_response = create_checkout_session( + account_id=account_id, + username=username, + email=email, + acore_ip=acore_ip, + amount=stripe_price, # El precio calculado + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Aumentar el Oro: {gold_amount} al Personaje: {character_name}" + ) if stripe_response["success"]: # Guardar en sesión los datos para el callback tras el pago @@ -1645,12 +1774,12 @@ def transfer_character_view(request): # Obtener el ID de usuario desde acore_auth.account with connections['acore_auth'].cursor() as cursor: - cursor.execute("SELECT id FROM account WHERE username = %s", [username]) + cursor.execute("SELECT id, email, last_ip FROM account WHERE username = %s", [username]) user_data = cursor.fetchone() if not user_data: return JsonResponse({'success': False, 'message': 'Cuenta no encontrada. Por favor, inicie sesión nuevamente.'}) - user_id = user_data[0] # ID de la cuenta + user_id, email, acore_ip = user_data # ID de la cuenta, email y la última IP # Obtener personajes de la cuenta de origen with connections['acore_characters'].cursor() as cursor: @@ -1722,7 +1851,19 @@ def transfer_character_view(request): # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('transfer-success')) cancel_url = request.build_absolute_uri(reverse('transfer-cancel')) - stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Trasnferir el personaje: {character_name} a la cuenta de destino: {destination_account}") + + # Llamada corregida a create_checkout_session con todos los parámetros requeridos + stripe_response = create_checkout_session( + username=username, + email=email, + acore_ip=acore_ip, + account_id=user_id, # Pasar el account_id + amount=price, # El precio de la transferencia + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Transferir el personaje: {character_name} a la cuenta de destino: {destination_account}" + ) if stripe_response["success"]: # Guardar los datos de la transferencia en la sesión para usarlos después del pago @@ -1805,7 +1946,7 @@ def store_novawow_view(request): # Obtener carrito desde la sesión carrito = request.session.get('carrito', []) - # ✅ Calcular el precio total con 2 decimales + # Calcular el precio total con 2 decimales total_price = sum(Decimal(item['precio']) for item in carrito) total_price_with_iva = (total_price * Decimal('1.21')).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP) @@ -1818,11 +1959,11 @@ def store_novawow_view(request): if not character_name: return JsonResponse({'success': False, 'message': 'Por favor, selecciona un personaje.'}) - # ✅ ACTUALIZAR EL CARRITO Y FORZAR LA SESIÓN + # ACTUALIZAR EL CARRITO Y FORZAR LA SESIÓN request.session['carrito'] = carrito request.session.modified = True # Forzar que Django guarde la sesión inmediatamente - # ✅ RECALCULAR EL PRECIO CON EL CARRITO ACTUALIZADO + # RECALCULAR EL PRECIO CON EL CARRITO ACTUALIZADO total_price = sum(Decimal(item['precio']) for item in carrito) total_price_with_iva = (total_price * Decimal('1.21')).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP) @@ -1830,15 +1971,36 @@ def store_novawow_view(request): if character_name not in characters: return JsonResponse({'success': False, 'message': 'No tienes permiso para renombrar este personaje.'}) - # ✅ Definir siempre `product_description` antes de usarlo + # Definir siempre `product_description` antes de usarlo product_description = ", ".join([f"{item.get('nombre', 'Ítem desconocido')} x{item.get('cantidad', 1)}" for item in carrito]) + # Obtener detalles del usuario + with connections['acore_auth'].cursor() as cursor: + cursor.execute("SELECT id, email, last_ip FROM account WHERE username = %s", [username]) + user_data = cursor.fetchone() + + if not user_data: + return JsonResponse({'success': False, 'message': 'Cuenta no encontrada.'}) + + user_id, email, acore_ip = user_data # ID de la cuenta, email y la última IP # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('store-novawow/success')) cancel_url = request.build_absolute_uri(reverse('store-novawow/cancel')) - stripe_response = create_checkout_session(total_price_with_iva, success_url=success_url, cancel_url=cancel_url, product_name=f"Compra de items del personaje: {character_name} : {product_description}") + # Llamada corregida a create_checkout_session con todos los parámetros requeridos + stripe_response = create_checkout_session( + username=username, + email=email, + acore_ip=acore_ip, + account_id=user_id, # Pasar el account_id + amount=total_price_with_iva, # El precio con IVA + character_name=character_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Compra de ítems para el personaje: {character_name} : {product_description}" + ) + if stripe_response["success"]: request.session['store_novawow'] = character_name return JsonResponse({ @@ -1854,8 +2016,9 @@ def store_novawow_view(request): 'store_data': store_data, 'categories': categories, 'total_price': total_price_with_iva - }) - + }) + + from collections import Counter def store_novawow_success_view(request): diff --git a/novawow/__pycache__/__init__.cpython-313.pyc b/novawow/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 575c10196caeac77e88efdc6bd4537cae9232519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmey&%ge<81P+A-=^*+sh=2h`DC08=kTI1Zok5e)ZzV$!6Oi{ABz4Q$*(xTqIJKxa zrXas8H6_L+Ke;qFHLs*N#yzvdqckbTFTX4?JU=`p4@j5im&e4%XXa&=#K-FuRNmsS e$<0qG%}KQ@Vg;H7va1-x_{hx2$XLV-WB~xKxF&%B diff --git a/novawow/__pycache__/__init__.cpython-39.pyc b/novawow/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 7186450cadc3a5b8dae0350befb1717bf648a7da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmYe~<>g`kf?t6AzMB8oJC*^zJd*AP0&USx) z76JU!a%+D`2>s443BWyq?bC3qA_E!1b#zUjg34*}x_B)`Qz|-)-a|&}2r{Ii7%Nbz zmew-Q`9%{#nGxT&-5LY>*tG9AN`y5$myw%<)=ihVeu-E%B~`x~tH)UAUbaVpSVa{? z1p`sh5NOH}sl+|fv>^e`7-`y5%V<5}kYRkD7`tIxmP48*CC_;x!7`xin@6=_Qd6be zvt6_4WcEW{ot~Y&shZJY=-H2Sb;_&TuI;JJcGbCNvpEM`tNT{0Z|H*f1gAxWw5#}2%y{?A zTi&gT3un`7R_Z&|(Hr+e8DmiPF%C!et)QOpd%15J(AQ||=-5+vcpGT+R$gg%i1HF4 z##K}nN=YZVXcvmz(-ncwrFTKXKQD}RITn;jMR$^!M5W9w6}Y;oa%xBZ1H^qF*ejLT zF7ae`fgu=TGR3ZRr$1qrrD8XWQB)R7O7i~ZG*XGgP6QJO_M$8vL}x@d{r_XReeype z5lVb`cEP^U?Zm$m-3f?J(Xn8D^v!P(t}^gz2fvpOvqMx%t3$ENsp* z&k1~j18Rpolr$W(N+=(UFw1_h`O#K>w4E<>@*jUc_Jh8mugHI9(7@rX+;As%s+Bv{&gq@p*;elCuS>z)-jobJQ;ZeTiHj)L)mO_}f5@CV=ly9Z;-t71&~&e0J- z;Sk2qPv5R$)Ay-84?SlXZ=l#4?*-+(i4bo;dk4@r=%tuW%dh%`wDvkPm>!R%x!{bJ z4tuRHO}FOh@bzAZhbwvEy^p3SHd^48qqO3te-bBhfoj0u-vY)5|3yj=gl9;7hKhel MBf|JA1SnGb8yKXh%K!iX diff --git a/novawow/__pycache__/middleware.cpython-39.pyc b/novawow/__pycache__/middleware.cpython-39.pyc deleted file mode 100644 index edddc50c6cef6eb5254e9a50922789fc75f730df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1197 zcmZ`(PiqrF6rVqvWSgc%qy-U_1yAvipx%l|)k=HNP@7622PfOiG~Ke<-OkLq7&fOC z&w@u0nxjWQL%|QRS5JNgPrkQlGzEPy@4b2Zd;cf#S61o-==H5+_}wAo2VNG5!(|hW zxerVdNkcNCJxWn$Asg`?r(~N*E}e5Coio;RWTi`*)t`VTOY{lAjaE1i3&~WEC>jiuG>y z?cAG9No zS)8>;e+JP?-WRSA(2Esf855Ni(DB`W&aE|vUMsW;ewei^^dl%ay&zLEVIb+0Bx{zP z@Cnbkc?cF~N-iprN;YK^$5wOajCM)RE^3lbsd+1T&OVbbY*LwHbCy@GVd;qrXa~?A zBtx`B?9!BgpR*8?T-0+qh3L&{XIwjmcec@Pk6ly@Y7Q)}HFj_*V-CEzT(~&WnAe6#CG;x?(B~l#}HLa4+A1KWcSU1+!)?|S_E}X;% zzJfuI(l8WwEf>_RYMdIno~G~;3I~(+Tu54$SMXGaJvUNWSxvdk8FSGMRyOb+yO zxebg^m#%V$-k>h8(|Rczbd9>~|ErvZ=rpSsFY-r9h@vjUD3)o6dP9iQ)DN$|)P#`n zKnT4A+4MRxd}9j?OVjX&LGT#t&!tY)<)y9DtQ5=g#E*t?3w|L-v#HK4*mOC*61xzy TOfl>E@vN{X6r*E`25qq4?MO4e diff --git a/novawow/__pycache__/settings.cpython-313.pyc b/novawow/__pycache__/settings.cpython-313.pyc deleted file mode 100644 index 4cf9b79b7d95ae5158d53121b553eb164ac6c341..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5706 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 diff --git a/novawow/__pycache__/settings.cpython-39.pyc b/novawow/__pycache__/settings.cpython-39.pyc deleted file mode 100644 index 5ff7f72b7ee6aec4bce838ad3d2ebf707cd7a448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4696 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 C^b}eE diff --git a/novawow/__pycache__/urls.cpython-39.pyc b/novawow/__pycache__/urls.cpython-39.pyc deleted file mode 100644 index 24c0e559519cbdf9f67726a6e1fcefdb821c5e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmZuuy>8nu5GEy2mi6NX2ohw;n8AyM4n{i!L7yN?hXh;%#bj){B59CxjB53kH_0P~ zYp1+IffhX~aFZbfc=z3RcOS`PTU9xN^?b2e-bM)h3c>r8LGTT>eFVc0!yS^CVjOVP zMKY%Gfa5Nagc6z3bcmB~Br}=;CM@m7GN(C4oUjqk_YwGvr)<2(`)C=_f)_jnF6Y_0 zTvtPW1oO|8K1^sXLW jx%ug{OR3qm<5yu&_6$skOMC>oj5A#RO-K?jF8}-k_P?EC diff --git a/novawow/__pycache__/views.cpython-313.pyc b/novawow/__pycache__/views.cpython-313.pyc deleted file mode 100644 index 4e7bc9b117c2b6bf53396b8657e2804bec72bc09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmey&%ge<81P+A->6t+KF^B^LOi;#WF(6|qLoh=yqc?*WV-ceQLokyRLlILtvnI<+ zkfN20w>XMYQ!> z8E>%{r52W^7MB!*lqlS?aJGsGElw>ejw#45OHGM!$xklLP0cGQj&aW{@hDA-@yjnu z49^db$pg~m`QG%(!Z7M|dC znOph-i}Yup0E3?<^DTjtti-(Ze7)j~{GyWN(vspL7N87R=SqemP7s?NNZjJE$<0qG f%}KQ@;sJ6&t_2(Vftit!@h*evXBI|A8L)ByklRus diff --git a/novawow/__pycache__/views.cpython-39.pyc b/novawow/__pycache__/views.cpython-39.pyc deleted file mode 100644 index c87e8fdb2ade5e8bd5d729dd97b086ca717d5cc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmYjL!AiqG5S`hyHi!kmOHbZ&>HdI-;5{H73cZw&UD`;Si94GHz3R{Om-gz(U-0Bi zQ0Rksvomk^y{+c+OAtIQx~-S~rNcRl3=dMg5OUyf4+mT$f-^4rgtc*#XDFuMqQVJN z9=vOUuVan6`GcO-=uwJup(sWlC=X5fKCzx{P`SV~3;wnD98VCYviZ5SfhgLNj@61* zwv|56V2_O-c-g(BoBzB`qz!jf+wd;a6!ilPGvTtx(zSc3+AS@4M$E T3lUO&cOcjA{k?vDG`ljt>uEl1 diff --git a/novawow/__pycache__/wsgi.cpython-313.pyc b/novawow/__pycache__/wsgi.cpython-313.pyc deleted file mode 100644 index 84bf3a8793a864b6b88b0fb713bfb3792805e7cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644 zcmYjPPiqrF6rb6RP1)E`#P&QCF9F?c4?!p*YExrcO`+S8%fe=|`?8s`JG0JA65Cr( zegg3`_-!f*g*_?a!JCpV;B1r7zQert=JEUUhMBFcImpC|_j&ReBlN3mmQh(0vw>JoCBk88K}vhpkby{0wq49?y{&BaKrBvxbP;@au? z?GA|qAF_lDg(O@|=u}KeF2xx{+I5_cCh#E_3KY>JAaejsQ#we2P(>)oL_AL6NeUB4 z$%IOFGvYLZnDqNJ&r=pr%>?iF4c}{{k_icfaU+=B42a-{oGCJ7DLf_$z!_M7G4Z_D$Xvj+$}ztPSQWPNlloolr56>VH? Xx>wt;zN5XL^{sF9N0&8u-+=xDEs?xN diff --git a/novawow/__pycache__/wsgi.cpython-39.pyc b/novawow/__pycache__/wsgi.cpython-39.pyc deleted file mode 100644 index 226e99d18ccd00a12bb3a2574cf89f64816dffc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 527 zcmYjO!EO^V5cN7~6BdekKou7xUn9X94qOnbKx!KWK`NA@NV#mxda`lk^{m!zLVN9@ zzd?`vA|ziq@e7=oBt^_ zlSx8%%kruNTZtJ}}PONpqCi|L?Sa1LOS2`Z`2ckeXGo_eeBOET(3Rj|T zZ~;Zg(sU36{HW1`7hw)!TcE5}-z^B`g%TC&OAD_oEWwJUYRo3(R0Ud0r>d^4DO51% zrc>&7Mk*CHAdDlyYLgJ?sJZcCW-PoE9w42EQ2TdMYAk%F7s{3R-&28=1Sj8SZ{!?T z0i}l8;#CDM$dxaRO#je0*szzxXC;Ju{g&_8h({-%J`Vfm`RMfGVleEF@-OEn-#(vS zA3pp(^ALh@rSElOC(p@3o=1*89&U|f1^Lg`Z5vKPu>)>t8gwzGLJc!@X+wOxqj=An s^&&U$_l0Z_gB;SN$2gV`nj7a?eHFX!xAQ!vg)`qJXg})mC;Tb@2c)o~VgLXD diff --git a/novawow/settings.py b/novawow/settings.py index c1b42a7..c1ecc9e 100644 --- a/novawow/settings.py +++ b/novawow/settings.py @@ -37,7 +37,7 @@ if not DEBUG: CSRF_COOKIE_SECURE = True else: # Modo desarrollo, no se aplican configuraciones de seguridad - ALLOWED_HOSTS = ['localhost', '127.0.0.1'] + ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'e37b-95-23-174-224.ngrok-free.app'] SECURE_SSL_REDIRECT = False SECURE_PROXY_SSL_HEADER = None SECURE_HSTS_SECONDS = 0 @@ -159,7 +159,7 @@ TEMPLATES = [ STRIPE_PUBLIC_KEY = "pk_test_51QQrdMI3Vazamytgfb8046k0AwaRR3Cu8ni80b8iglZMUlUZVJarW1azXGXl3qV5VZtr2S7Xmpgr43Zcg73Pd8eT00C8CPOnja" # Cambia según tu configuración STRIPE_SECRET_KEY = "sk_test_51QQrdMI3VazamytgcKpxF9cQcUfZYOam8b3IYgpJnpUBdY4xYOorTHRE0AbArfZbRT4nSbY2DEAMEvgxJl6gmgjJ00OaZgiryS" - +STRIPE_WEBHOOK_SECRET = "" WSGI_APPLICATION = 'novawow.wsgi.application'