Spaces:
Sleeping
Sleeping
Verificar existencia Cliente
Browse files- app.py +37 -26
- bridges.py +5 -2
- funciones.py +31 -27
app.py
CHANGED
@@ -20,49 +20,60 @@ async def health_check():
|
|
20 |
@app.post("/creaCliente/")
|
21 |
async def creaCliente(
|
22 |
email: str = Form(...),
|
23 |
-
|
24 |
-
|
25 |
-
phone: Optional[str] = Form(None),
|
26 |
-
# Si quieres pasar metadata, podrías recibirla como un JSON string y luego parsearla
|
27 |
-
# o como múltiples campos de formulario si sabes cuáles serán.
|
28 |
-
# Por simplicidad aquí, no incluiremos metadata compleja directamente en Form,
|
29 |
-
# pero es posible extenderlo.
|
30 |
):
|
31 |
"""
|
32 |
-
|
|
|
33 |
|
34 |
Args:
|
35 |
email (str): El correo electrónico del cliente.
|
36 |
-
|
37 |
-
|
38 |
-
phone (str, opcional): El número de teléfono del cliente.
|
39 |
|
40 |
Returns:
|
41 |
-
dict: Un diccionario con el ID del cliente de Stripe
|
42 |
-
|
|
|
43 |
"""
|
44 |
try:
|
45 |
-
# Llama a la función create_stripe_customer
|
46 |
-
|
47 |
email=email,
|
48 |
-
|
49 |
-
|
50 |
-
phone=phone
|
51 |
-
# Si quieres añadir metadata, aquí la pasarías si la recibes en el Form.
|
52 |
-
# Por ejemplo: metadata={"origen": "FastAPI", "username": some_username_variable}
|
53 |
)
|
54 |
|
55 |
-
if
|
56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
else:
|
58 |
-
|
59 |
-
raise HTTPException(status_code=500, detail="No se pudo crear el cliente en Stripe. Verifica los logs del servidor.")
|
60 |
|
61 |
except HTTPException as e:
|
62 |
-
# Re-lanza HTTPException para que FastAPI la maneje directamente
|
63 |
raise e
|
64 |
except Exception as e:
|
65 |
-
# Captura cualquier otra excepción no esperada
|
66 |
raise HTTPException(status_code=500, detail=f"Ocurrió un error inesperado al procesar la solicitud: {str(e)}")
|
67 |
|
68 |
|
|
|
20 |
@app.post("/creaCliente/")
|
21 |
async def creaCliente(
|
22 |
email: str = Form(...),
|
23 |
+
firebase_user: Optional[str] = Form(None),
|
24 |
+
site: Optional[str] = Form(None),
|
|
|
|
|
|
|
|
|
|
|
25 |
):
|
26 |
"""
|
27 |
+
Busca un cliente existente en Stripe por email.
|
28 |
+
Si no existe, lo crea con el email, Firebase User ID y site.
|
29 |
|
30 |
Args:
|
31 |
email (str): El correo electrónico del cliente.
|
32 |
+
firebase_user (str, opcional): El ID de usuario de Firebase asociado.
|
33 |
+
site (str, opcional): El nombre del sitio de origen.
|
|
|
34 |
|
35 |
Returns:
|
36 |
+
dict: Un diccionario con el ID del cliente de Stripe (existente o nuevo)
|
37 |
+
si la operación fue exitosa, indicando si fue encontrado o creado.
|
38 |
+
O un error si la operación falló.
|
39 |
"""
|
40 |
try:
|
41 |
+
# Llama a la función 'create_stripe_customer' y desempaca la tupla
|
42 |
+
customer_result = funciones.create_stripe_customer(
|
43 |
email=email,
|
44 |
+
firebase_user=firebase_user,
|
45 |
+
site=site
|
|
|
|
|
|
|
46 |
)
|
47 |
|
48 |
+
if customer_result:
|
49 |
+
customer, status = customer_result # Desempaca el objeto customer y el estado
|
50 |
+
|
51 |
+
message_text = ""
|
52 |
+
if status == "found":
|
53 |
+
message_text = "Cliente existente encontrado exitosamente."
|
54 |
+
elif status == "created":
|
55 |
+
message_text = "Nuevo cliente creado exitosamente."
|
56 |
+
else:
|
57 |
+
message_text = "Operación de cliente exitosa." # Fallback por si acaso
|
58 |
+
|
59 |
+
response_data = {
|
60 |
+
"message": message_text,
|
61 |
+
"status": status, # Agregamos el estado explícitamente también
|
62 |
+
"customer_id": customer.id,
|
63 |
+
"customer_email": customer.email
|
64 |
+
}
|
65 |
+
if customer.metadata:
|
66 |
+
if 'firebase_user' in customer.metadata:
|
67 |
+
response_data['firebase_user'] = customer.metadata.firebase_user
|
68 |
+
if 'site' in customer.metadata:
|
69 |
+
response_data['site'] = customer.metadata.site
|
70 |
+
return response_data
|
71 |
else:
|
72 |
+
raise HTTPException(status_code=500, detail="No se pudo procesar la operación del cliente en Stripe. Verifica los logs del servidor.")
|
|
|
73 |
|
74 |
except HTTPException as e:
|
|
|
75 |
raise e
|
76 |
except Exception as e:
|
|
|
77 |
raise HTTPException(status_code=500, detail=f"Ocurrió un error inesperado al procesar la solicitud: {str(e)}")
|
78 |
|
79 |
|
bridges.py
CHANGED
@@ -1,2 +1,5 @@
|
|
1 |
-
#
|
2 |
-
llave = "sk_test_UEqlnnbMITO2SqRQ10ZJh33P"
|
|
|
|
|
|
|
|
1 |
+
#Test Mode
|
2 |
+
#llave = "sk_test_UEqlnnbMITO2SqRQ10ZJh33P"
|
3 |
+
|
4 |
+
#Splashmix Sandbox
|
5 |
+
llave = "sk_test_51RXpcZROVpWRmEfB3XhFbdA7H4xNc0JkkPE36ldm8eatSdLAOxRVrCrSv9OXFTOnXpJjqm0Dhaczg0FBXGdTc36z00Bb7L34Lt"
|
funciones.py
CHANGED
@@ -60,51 +60,55 @@ def create_checkout_session(price_id, customer_email=None, customer_id=None):
|
|
60 |
print(f"Ocurrió un error inesperado al crear la Checkout Session: {e}")
|
61 |
return None
|
62 |
|
63 |
-
def create_stripe_customer(email,
|
64 |
"""
|
65 |
-
|
|
|
66 |
|
67 |
Args:
|
68 |
email (str): La dirección de correo electrónico del cliente.
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
phone (str, opcional): El número de teléfono del cliente.
|
73 |
-
metadata (dict, opcional): Un diccionario de pares clave-valor para almacenar datos personalizados.
|
74 |
-
(Ej. {'user_id_interno': 'XYZ789'}).
|
75 |
|
76 |
Returns:
|
77 |
-
stripe.Customer
|
78 |
None: Si ocurre un error.
|
79 |
"""
|
80 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
customer_params = {
|
82 |
'email': email,
|
83 |
}
|
84 |
|
85 |
-
|
86 |
-
|
87 |
-
if
|
88 |
-
|
89 |
-
if
|
90 |
-
|
91 |
-
|
92 |
-
|
|
|
93 |
|
94 |
-
# Llamada a la API de Stripe para crear el cliente
|
95 |
customer = stripe.Customer.create(**customer_params)
|
96 |
|
97 |
-
print(f"
|
98 |
-
|
99 |
-
if 'name' in customer and customer.name:
|
100 |
-
print(f"Nombre: {customer.name}")
|
101 |
-
return customer
|
102 |
|
103 |
except stripe.error.StripeError as e:
|
104 |
-
|
105 |
-
print(f"Error de Stripe al crear el cliente: {e}")
|
106 |
return None
|
107 |
except Exception as e:
|
108 |
-
|
109 |
-
print(f"Ocurrió un error inesperado al crear el cliente: {e}")
|
110 |
return None
|
|
|
60 |
print(f"Ocurrió un error inesperado al crear la Checkout Session: {e}")
|
61 |
return None
|
62 |
|
63 |
+
def create_stripe_customer(email, firebase_user=None, site=None):
|
64 |
"""
|
65 |
+
Busca un cliente existente en Stripe por su email.
|
66 |
+
Si el cliente no existe, lo crea con los datos proporcionados.
|
67 |
|
68 |
Args:
|
69 |
email (str): La dirección de correo electrónico del cliente.
|
70 |
+
(Se usará para buscar si el cliente ya existe).
|
71 |
+
firebase_user (str, opcional): El ID de usuario de Firebase. Se agregará a 'metadata'.
|
72 |
+
site (str, opcional): El nombre del sitio de origen. Se agregará a 'metadata'.
|
|
|
|
|
|
|
73 |
|
74 |
Returns:
|
75 |
+
tuple: (stripe.Customer, str) donde el string indica "found" o "created".
|
76 |
None: Si ocurre un error.
|
77 |
"""
|
78 |
try:
|
79 |
+
# --- 1. Intentar buscar un cliente existente por email ---
|
80 |
+
existing_customers = stripe.Customer.list(email=email, limit=1)
|
81 |
+
|
82 |
+
if existing_customers.data:
|
83 |
+
customer = existing_customers.data[0]
|
84 |
+
print(f"Cliente existente encontrado por email. ID: {customer.id}")
|
85 |
+
return customer, "found" # Retorna el cliente y el estado "found"
|
86 |
+
|
87 |
+
# --- 2. Si el cliente no existe, crearlo ---
|
88 |
+
print(f"Cliente con email '{email}' no encontrado. Creando nuevo cliente...")
|
89 |
+
|
90 |
customer_params = {
|
91 |
'email': email,
|
92 |
}
|
93 |
|
94 |
+
# Construir el diccionario de metadata con firebase_user y site
|
95 |
+
customer_metadata = {}
|
96 |
+
if firebase_user:
|
97 |
+
customer_metadata['firebase_user'] = firebase_user
|
98 |
+
if site:
|
99 |
+
customer_metadata['site'] = site
|
100 |
+
|
101 |
+
if customer_metadata: # Solo agregar metadata si no está vacía
|
102 |
+
customer_params['metadata'] = customer_metadata
|
103 |
|
|
|
104 |
customer = stripe.Customer.create(**customer_params)
|
105 |
|
106 |
+
print(f"Nuevo cliente creado exitosamente. ID: {customer.id}")
|
107 |
+
return customer, "created" # Retorna el cliente y el estado "created"
|
|
|
|
|
|
|
108 |
|
109 |
except stripe.error.StripeError as e:
|
110 |
+
print(f"Error de Stripe al buscar o crear el cliente: {e}")
|
|
|
111 |
return None
|
112 |
except Exception as e:
|
113 |
+
print(f"Ocurrió un error inesperado: {e}")
|
|
|
114 |
return None
|