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
|