Moibe commited on
Commit
03e7a68
·
1 Parent(s): 64e0349

Verificar existencia Cliente

Browse files
Files changed (3) hide show
  1. app.py +37 -26
  2. bridges.py +5 -2
  3. 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
- name: Optional[str] = Form(None),
24
- description: Optional[str] = Form(None),
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
- Crea un nuevo cliente (Customer) en Stripe utilizando los datos proporcionados.
 
33
 
34
  Args:
35
  email (str): El correo electrónico del cliente.
36
- name (str, opcional): El nombre del cliente.
37
- description (str, opcional): Una descripción para el cliente.
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 si la creación fue exitosa.
42
- O un error si la creación falló.
 
43
  """
44
  try:
45
- # Llama a la función create_stripe_customer que definimos previamente.
46
- customer = funciones.create_stripe_customer(
47
  email=email,
48
- name=name,
49
- description=description,
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 customer:
56
- return {"message": "Cliente creado exitosamente", "customer_id": customer.id, "customer_email": customer.email}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  else:
58
- # Si la función retorna None, significa que hubo un error interno
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
- #Bridges
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, name=None, description=None, phone=None, metadata=None):
64
  """
65
- Crea un nuevo cliente en Stripe.
 
66
 
67
  Args:
68
  email (str): La dirección de correo electrónico del cliente.
69
- (Altamente recomendado para identificar al cliente).
70
- name (str, opcional): El nombre completo del cliente.
71
- description (str, opcional): Una descripción arbitraria del cliente para tus registros.
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: El objeto Customer creado por Stripe si es exitoso.
78
  None: Si ocurre un error.
79
  """
80
  try:
 
 
 
 
 
 
 
 
 
 
 
81
  customer_params = {
82
  'email': email,
83
  }
84
 
85
- if name:
86
- customer_params['name'] = name
87
- if description:
88
- customer_params['description'] = description
89
- if phone:
90
- customer_params['phone'] = phone
91
- if metadata:
92
- customer_params['metadata'] = metadata
 
93
 
94
- # Llamada a la API de Stripe para crear el cliente
95
  customer = stripe.Customer.create(**customer_params)
96
 
97
- print(f"Cliente creado exitosamente. ID del Cliente: {customer.id}")
98
- print(f"Email: {customer.email}")
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
- # Manejo de errores específicos de la API de Stripe
105
- print(f"Error de Stripe al crear el cliente: {e}")
106
  return None
107
  except Exception as e:
108
- # Manejo de cualquier otro error inesperado
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