Corrige bugs de la revisión de home/views.py (dinero, bypass de pago, 500s)

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>
This commit is contained in:
2026-07-12 17:56:20 +00:00
parent faa9aabdbf
commit 758435fe77
4 changed files with 133 additions and 26 deletions
+17
View File
@@ -4,8 +4,25 @@ 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"],