Spaces:
Sleeping
Sleeping
Session Via Firebase User Ok!
Browse files- app.py +10 -5
- funciones.py +89 -26
app.py
CHANGED
@@ -98,11 +98,16 @@ async def creaCliente(
|
|
98 |
except Exception as e:
|
99 |
raise HTTPException(status_code=500, detail=f"Ocurrió un error inesperado al procesar la solicitud: {str(e)}")
|
100 |
|
101 |
-
|
102 |
@app.post("/creaLinkSesion/")
|
103 |
async def creaLinkSesion(
|
104 |
-
price_id: str = Form(...),
|
105 |
-
customer_email: Optional[str] = Form(None),
|
106 |
-
customer_id: Optional[str] = Form(None)
|
|
|
107 |
):
|
108 |
-
|
|
|
|
|
|
|
|
|
|
|
|
98 |
except Exception as e:
|
99 |
raise HTTPException(status_code=500, detail=f"Ocurrió un error inesperado al procesar la solicitud: {str(e)}")
|
100 |
|
|
|
101 |
@app.post("/creaLinkSesion/")
|
102 |
async def creaLinkSesion(
|
103 |
+
price_id: str = Form(...),
|
104 |
+
customer_email: Optional[str] = Form(None),
|
105 |
+
customer_id: Optional[str] = Form(None),
|
106 |
+
firebase_user: Optional[str] = Form(None) # <-- ¡Nuevo parámetro para Firebase User ID!
|
107 |
):
|
108 |
+
"""
|
109 |
+
Crea una Checkout Session, ahora con la opción de buscar/crear cliente
|
110 |
+
usando firebase_user.
|
111 |
+
"""
|
112 |
+
# Llama a la función de Stripe con el nuevo parámetro
|
113 |
+
return funciones.create_checkout_session(price_id, customer_email, customer_id, firebase_user)
|
funciones.py
CHANGED
@@ -3,53 +3,116 @@ import globales
|
|
3 |
|
4 |
stripe.api_key = globales.llave
|
5 |
|
6 |
-
def create_checkout_session(price_id, customer_email=None, customer_id=None):
|
7 |
"""
|
8 |
Crea una nueva Checkout Session para un pago único.
|
|
|
|
|
9 |
|
10 |
Args:
|
11 |
price_id (str): El ID del precio en Stripe para el artículo que se va a comprar.
|
12 |
customer_email (str, opcional): Email para pre-rellenar o asociar con un cliente existente.
|
13 |
customer_id (str, opcional): ID de un cliente existente en Stripe para asociar la sesión.
|
|
|
|
|
14 |
|
15 |
Returns:
|
16 |
str: La URL de la Checkout Session, o None si hay un error.
|
17 |
"""
|
18 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
session_params = {
|
20 |
'line_items': [{
|
21 |
'price': price_id,
|
22 |
'quantity': 1,
|
23 |
}],
|
24 |
-
'mode': 'payment',
|
25 |
-
'success_url': 'https://app.splashmix.ink/',
|
26 |
'cancel_url': 'https://app.splashmix.ink/',
|
27 |
-
'locale': 'es',
|
28 |
-
'client_reference_id': 'HERC'
|
|
|
29 |
}
|
30 |
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
|
|
|
|
36 |
elif customer_email:
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
# session_params['shipping_address_collection'] = {'allowed_countries': ['US', 'CA', 'MX']}
|
47 |
-
|
48 |
-
# Opcional: Permitir códigos promocionales
|
49 |
-
# session_params['allow_promotion_codes'] = True
|
50 |
-
|
51 |
-
# Opcional: Agregar metadata a la sesión (no al pago final directamente, pero útil para webhooks)
|
52 |
-
# session_params['metadata'] = {'order_id': 'ORD12345', 'user_id': 'user_abc'}
|
53 |
|
54 |
session = stripe.checkout.Session.create(**session_params)
|
55 |
|
|
|
3 |
|
4 |
stripe.api_key = globales.llave
|
5 |
|
6 |
+
def create_checkout_session(price_id, customer_email=None, customer_id=None, firebase_user=None):
|
7 |
"""
|
8 |
Crea una nueva Checkout Session para un pago único.
|
9 |
+
Busca o crea un cliente en Stripe si no se provee customer_id ni customer_email,
|
10 |
+
usando firebase_user como método de búsqueda principal si está disponible.
|
11 |
|
12 |
Args:
|
13 |
price_id (str): El ID del precio en Stripe para el artículo que se va a comprar.
|
14 |
customer_email (str, opcional): Email para pre-rellenar o asociar con un cliente existente.
|
15 |
customer_id (str, opcional): ID de un cliente existente en Stripe para asociar la sesión.
|
16 |
+
firebase_user (str, opcional): ID de usuario de Firebase. Se usará para buscar
|
17 |
+
un cliente de Stripe si customer_id/email no están presentes.
|
18 |
|
19 |
Returns:
|
20 |
str: La URL de la Checkout Session, o None si hay un error.
|
21 |
"""
|
22 |
try:
|
23 |
+
# --- Lógica para obtener o crear el Customer de Stripe ---
|
24 |
+
final_customer_id = customer_id # Empezamos con el customer_id si ya lo tenemos
|
25 |
+
|
26 |
+
if not final_customer_id: # Si no tenemos un customer_id directo, intentamos buscar/crear
|
27 |
+
found_customer = None
|
28 |
+
|
29 |
+
# Prioridad 1: Buscar por firebase_user en metadata
|
30 |
+
if firebase_user:
|
31 |
+
search_query = f"metadata['firebase_user']:'{firebase_user}'"
|
32 |
+
print(f"Buscando cliente por Firebase UID: {firebase_user}")
|
33 |
+
existing_customers_by_firebase = stripe.Customer.search(query=search_query, limit=1)
|
34 |
+
if existing_customers_by_firebase.data:
|
35 |
+
found_customer = existing_customers_by_firebase.data[0]
|
36 |
+
print(f"Cliente encontrado por Firebase UID: {found_customer.id}")
|
37 |
+
final_customer_id = found_customer.id
|
38 |
+
|
39 |
+
# Prioridad 2: Si no se encontró por firebase_user, y tenemos un email, buscar por email
|
40 |
+
if not final_customer_id and customer_email:
|
41 |
+
print(f"Cliente no encontrado por Firebase UID. Buscando por email: {customer_email}")
|
42 |
+
existing_customers_by_email = stripe.Customer.list(email=customer_email, limit=1)
|
43 |
+
if existing_customers_by_email.data:
|
44 |
+
found_customer = existing_customers_by_email.data[0]
|
45 |
+
print(f"Cliente encontrado por email: {found_customer.id}")
|
46 |
+
final_customer_id = found_customer.id
|
47 |
+
|
48 |
+
# Opcional: Si lo encontraste por email pero falta el firebase_user, actualízalo
|
49 |
+
if firebase_user and (not found_customer.metadata or found_customer.metadata.get('firebase_user') != firebase_user):
|
50 |
+
print(f"Actualizando firebase_user para cliente {found_customer.id}")
|
51 |
+
updated_metadata = found_customer.metadata.copy() if found_customer.metadata is not None else {}
|
52 |
+
updated_metadata['firebase_user'] = firebase_user
|
53 |
+
stripe.Customer.modify(found_customer.id, metadata=updated_metadata)
|
54 |
+
|
55 |
+
# Si después de las búsquedas, todavía no tenemos un customer_id, y tenemos email, creamos uno nuevo
|
56 |
+
if not final_customer_id and customer_email:
|
57 |
+
print(f"Cliente no encontrado. Creando nuevo cliente con email: {customer_email}")
|
58 |
+
customer_metadata = {}
|
59 |
+
if firebase_user:
|
60 |
+
customer_metadata['firebase_user'] = firebase_user
|
61 |
+
|
62 |
+
new_customer = stripe.Customer.create(
|
63 |
+
email=customer_email,
|
64 |
+
metadata=customer_metadata if customer_metadata else None # Asegura que no se envíe un diccionario vacío si no hay metadata
|
65 |
+
)
|
66 |
+
final_customer_id = new_customer.id
|
67 |
+
print(f"Nuevo cliente creado: {final_customer_id}")
|
68 |
+
elif not final_customer_id and not customer_email and firebase_user:
|
69 |
+
# Si no hay email, pero hay firebase_user, también podríamos crear un cliente
|
70 |
+
# Esto es menos común pero posible si el email no es obligatorio para ti.
|
71 |
+
print(f"Cliente no encontrado. Creando nuevo cliente (sin email) con Firebase UID: {firebase_user}")
|
72 |
+
customer_metadata = {'firebase_user': firebase_user}
|
73 |
+
new_customer = stripe.Customer.create(
|
74 |
+
metadata=customer_metadata
|
75 |
+
)
|
76 |
+
final_customer_id = new_customer.id
|
77 |
+
print(f"Nuevo cliente creado (sin email): {final_customer_id}")
|
78 |
+
|
79 |
+
# Nota: Si no hay customer_id, customer_email, ni firebase_user, final_customer_id seguirá siendo None
|
80 |
+
# y la sesión de checkout se creará sin un cliente asociado explícitamente. Stripe puede crearlo
|
81 |
+
# automáticamente en el checkout si se recopila el email.
|
82 |
+
|
83 |
+
print("Estoy por entrar a checar el customer id que es: ", final_customer_id)
|
84 |
+
|
85 |
+
# --- Parámetros de la Checkout Session ---
|
86 |
session_params = {
|
87 |
'line_items': [{
|
88 |
'price': price_id,
|
89 |
'quantity': 1,
|
90 |
}],
|
91 |
+
'mode': 'payment',
|
92 |
+
'success_url': 'https://app.splashmix.ink/',
|
93 |
'cancel_url': 'https://app.splashmix.ink/',
|
94 |
+
'locale': 'es',
|
95 |
+
'client_reference_id': 'HERC',
|
96 |
+
'metadata': {} # Inicializamos metadata para añadir el customer_id y firebase_user si existen
|
97 |
}
|
98 |
|
99 |
+
# Asociar el cliente encontrado/creado a la sesión
|
100 |
+
if final_customer_id:
|
101 |
+
session_params['customer'] = final_customer_id
|
102 |
+
session_params['metadata']['stripe_customer_id'] = final_customer_id # Útil para webhooks
|
103 |
+
|
104 |
+
# Pre-rellenar el email si está disponible y no se asoció un customer_id directamente
|
105 |
+
# (Stripe recomienda usar 'customer' en lugar de 'customer_email' si ya tienes el ID del cliente)
|
106 |
elif customer_email:
|
107 |
+
session_params['customer_email'] = customer_email
|
108 |
+
|
109 |
+
# Añadir firebase_user a la metadata de la sesión si está presente
|
110 |
+
if firebase_user:
|
111 |
+
session_params['metadata']['firebase_user'] = firebase_user
|
112 |
+
|
113 |
+
# Limpiar metadata si quedó vacía (Stripe no acepta diccionarios vacíos)
|
114 |
+
if not session_params['metadata']:
|
115 |
+
del session_params['metadata']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
|
117 |
session = stripe.checkout.Session.create(**session_params)
|
118 |
|