Actualizacion la compra con logs logs correspondientes

This commit is contained in:
adevopg
2025-02-18 11:11:47 +01:00
parent 162f4bf828
commit e94915e667
19 changed files with 321 additions and 87 deletions
+1
View File
@@ -1,3 +1,4 @@
venv/
home/__pycache__
home/migrations/__pycache__
**/__pycache__/*.pyc
+30
View File
@@ -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)),
],
),
]
+16
View File
@@ -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
View File
@@ -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
View File
@@ -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'
+233 -70
View File
@@ -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 informacin 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,20 +1648,31 @@ def gold_character_view(request):
return redirect('login')
# Obtener personajes y estado de conexión del usuario
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()
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 = (
SELECT id
FROM acore_auth.account
WHERE username = %s
)
""", [username])
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
View File
@@ -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'