758435fe77
Seguridad / dinero: - store_novawow_view: recalcula precios y valida ítems contra la BD (Item) en vez de confiar en el precio/ítems que manda el cliente; guarda en sesión un carrito ya validado para la entrega - *_success_view (x9): @require_paid_stripe verifica el pago real en Stripe por session_id (Stripe lo añade a la success_url) y marca StripeLog.fulfilled para evitar re-entregas; cierra el bypass de ir directo a la success-url sin pagar - gold_character_view: deja de truncar el precio (int(4.99)->4); pasa el precio real Correctitud / 500s: - change_password_view: .get(...,'') evita AttributeError si falta un campo - revive_character_view: lógica de éxito corregida (vacío=éxito, no vacío=error, None=fallo de comunicación) — antes marcaba error como éxito y caía a HTML - store category y recruit_a_friend: guardas para Category.DoesNotExist y cuenta None Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
63 lines
2.2 KiB
Python
63 lines
2.2 KiB
Python
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 is_session_paid(session_id):
|
|
"""True si la sesión de Stripe existe y está realmente pagada."""
|
|
if not session_id:
|
|
return False
|
|
try:
|
|
s = stripe.checkout.Session.retrieve(session_id)
|
|
return bool(s and getattr(s, "payment_status", None) == "paid")
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def create_checkout_session(account_id, username, email, acore_ip, amount, character_name, currency="eur", success_url=None, cancel_url=None, product_name=""):
|
|
try:
|
|
# Añadir el id de sesión a la success_url para poder verificar el pago
|
|
# al volver (Stripe sustituye {CHECKOUT_SESSION_ID} por el id real).
|
|
if success_url:
|
|
sep = "&" if "?" in success_url else "?"
|
|
success_url = f"{success_url}{sep}session_id={{CHECKOUT_SESSION_ID}}"
|
|
|
|
# 🔹 Crear sesión de pago en Stripe
|
|
session = stripe.checkout.Session.create(
|
|
payment_method_types=["card"],
|
|
line_items=[{
|
|
"price_data": {
|
|
"currency": currency,
|
|
"product_data": {"name": product_name},
|
|
"unit_amount": int(amount * 100),
|
|
},
|
|
"quantity": 1,
|
|
}],
|
|
mode="payment",
|
|
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)} |