Actualizacion la compra con logs logs correspondientes
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
venv/
|
||||
home/__pycache__
|
||||
home/migrations/__pycache__
|
||||
**/__pycache__/*.pyc
|
||||
@@ -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)),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -272,3 +272,19 @@ class HomeApiPoints(models.Model):
|
||||
def __str__(self):
|
||||
return f"Cuenta {self.accountID} - PV: {self.vp}, DP: {self.dp}"
|
||||
|
||||
|
||||
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})"
|
||||
+24
-2
@@ -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)}
|
||||
+3
-1
@@ -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
|
||||
@@ -72,6 +72,8 @@ urlpatterns = [
|
||||
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("webhook/stripe/", stripe_webhook, name="stripe-webhook"),
|
||||
|
||||
]
|
||||
|
||||
handler404 = 'home.views.not_found'
|
||||
|
||||
+237
-74
@@ -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,24 +1163,31 @@ 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': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
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)
|
||||
|
||||
@@ -1168,18 +1197,26 @@ def rename_character_view(request):
|
||||
if response is None:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error de comunicación con el servidor. Intente nuevamente más tarde.</span>'})
|
||||
|
||||
# Validar si el personaje fue seleccionado
|
||||
if not character_name:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Por favor, seleccione un personaje.</span>'})
|
||||
|
||||
# Verificar si el personaje pertenece al usuario
|
||||
if character_name not in characters:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">No tienes permiso para renombrar este personaje.</span>'})
|
||||
|
||||
# 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': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
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': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
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': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
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': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
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': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
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'<span class="red-form-response">Error al obtener los personajes: {str(e)}</span>'})
|
||||
|
||||
# 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': '<span class="red-form-response">Cuenta no encontrada. Por favor, inicie sesión nuevamente.</span>'})
|
||||
|
||||
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,14 +1971,35 @@ 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
|
||||
@@ -1856,6 +2018,7 @@ def store_novawow_view(request):
|
||||
'total_price': total_price_with_iva
|
||||
})
|
||||
|
||||
|
||||
from collections import Counter
|
||||
|
||||
def store_novawow_success_view(request):
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2
-2
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user