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'