Moibe commited on
Commit
5607f58
·
1 Parent(s): f2528b2

Session Via Firebase User Ok!

Browse files
Files changed (2) hide show
  1. app.py +10 -5
  2. 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(...), # Sigue siendo requerido, enviado como Form si la petición es multipart/form-data
105
- customer_email: Optional[str] = Form(None), # Ahora opcional, valor por defecto None
106
- customer_id: Optional[str] = Form(None) # Ahora opcional, valor por defecto None
 
107
  ):
108
- return funciones.create_checkout_session(price_id, customer_email, customer_id)
 
 
 
 
 
 
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', #payment Para pagos únicos (one-time payment) o #subscription
25
- 'success_url': 'https://app.splashmix.ink/', #'https://tudominio.com/gracias?session_id={CHECKOUT_SESSION_ID}'
26
  'cancel_url': 'https://app.splashmix.ink/',
27
- 'locale': 'es', #'es' # Establece el idioma del checkout a español
28
- 'client_reference_id': 'HERC'
 
29
  }
30
 
31
- print("Estoy por entrar a checar el customer id que es: ", customer_id)
32
-
33
- # Opciones para el cliente
34
- if customer_id:
35
- session_params['customer'] = customer_id
 
 
36
  elif customer_email:
37
- session_params['customer_email'] = customer_email
38
- print("Salí del elif")
39
- else:
40
- print("Entré al else...")
41
- # Si no se provee ni customer_id ni customer_email, Stripe puede crear uno si es necesario
42
- # O podrías pedir el email en el formulario de Checkout.
43
- pass
44
-
45
- # Opcional: Agregar información de envío si aplica (para productos físicos)
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