Spaces:
Running
Running
import stripe | |
import globales | |
stripe.api_key = globales.llave | |
def create_checkout_session(price_id, customer_email=None, customer_id=None): | |
""" | |
Crea una nueva Checkout Session para un pago 煤nico. | |
Args: | |
price_id (str): El ID del precio en Stripe para el art铆culo que se va a comprar. | |
customer_email (str, opcional): Email para pre-rellenar o asociar con un cliente existente. | |
customer_id (str, opcional): ID de un cliente existente en Stripe para asociar la sesi贸n. | |
Returns: | |
str: La URL de la Checkout Session, o None si hay un error. | |
""" | |
try: | |
session_params = { | |
'line_items': [{ | |
'price': price_id, | |
'quantity': 1, | |
}], | |
'mode': 'payment', #payment Para pagos 煤nicos (one-time payment) o #subscription | |
'success_url': 'https://app.splashmix.ink/', #'https://tudominio.com/gracias?session_id={CHECKOUT_SESSION_ID}' | |
'cancel_url': 'https://app.splashmix.ink/', | |
'locale': 'es', #'es' # Establece el idioma del checkout a espa帽ol | |
'client_reference_id': 'HERC' | |
} | |
print("Estoy por entrar a checar el customer id que es: ", customer_id) | |
# Opciones para el cliente | |
if customer_id: | |
session_params['customer'] = customer_id | |
elif customer_email: | |
session_params['customer_email'] = customer_email | |
print("Sal铆 del elif") | |
else: | |
print("Entr茅 al else...") | |
# Si no se provee ni customer_id ni customer_email, Stripe puede crear uno si es necesario | |
# O podr铆as pedir el email en el formulario de Checkout. | |
pass | |
# Opcional: Agregar informaci贸n de env铆o si aplica (para productos f铆sicos) | |
# session_params['shipping_address_collection'] = {'allowed_countries': ['US', 'CA', 'MX']} | |
# Opcional: Permitir c贸digos promocionales | |
# session_params['allow_promotion_codes'] = True | |
# Opcional: Agregar metadata a la sesi贸n (no al pago final directamente, pero 煤til para webhooks) | |
# session_params['metadata'] = {'order_id': 'ORD12345', 'user_id': 'user_abc'} | |
session = stripe.checkout.Session.create(**session_params) | |
print(f"Checkout Session creada exitosamente. ID: {session.id}") | |
print(f"URL de redirecci贸n: {session.url}") | |
return session.url | |
except stripe.error.StripeError as e: | |
print(f"Error de Stripe al crear la Checkout Session: {e}") | |
return None | |
except Exception as e: | |
print(f"Ocurri贸 un error inesperado al crear la Checkout Session: {e}") | |
return None | |
def create_stripe_customer(email, firebase_user=None, site=None): | |
""" | |
Busca un cliente existente en Stripe, priorizando el Firebase User ID usando Customer.search. | |
Si el cliente no existe por Firebase User ID, intenta buscar por email. | |
Si el cliente tampoco existe por email, lo crea. | |
Args: | |
email (str): La direcci贸n de correo electr贸nico del cliente. | |
(Se usar谩 para buscar si el cliente ya existe si no se encuentra por Firebase UID). | |
firebase_user (str, opcional): El ID de usuario de Firebase. **Identificador principal para la b煤squeda.** | |
Se agregar谩 a 'metadata'. | |
site (str, opcional): El nombre del sitio de origen. Se agregar谩 a 'metadata'. | |
Returns: | |
tuple: (stripe.Customer, str) donde el string indica "found_by_firebase_user", "found_by_email" o "created". | |
None: Si ocurre un error. | |
""" | |
try: | |
customer_found_status = None | |
found_customer = None | |
# --- 1. Intentar buscar un cliente existente por firebase_user (PRIORIDAD ALTA con Customer.search) --- | |
if firebase_user: | |
# Usamos stripe.Customer.search para buscar en metadata. | |
# Aseg煤rate de escapar comillas si el firebase_user pudiera contenerlas, | |
# aunque los UIDs de Firebase no suelen tenerlas. | |
search_query = f"metadata['firebase_user']:'{firebase_user}'" | |
print(f"Buscando cliente con query: {search_query}") # Para depuraci贸n | |
# search retorna un StripeSearchResultObject, que se itera como una lista | |
existing_customers_by_firebase = stripe.Customer.search(query=search_query, limit=1) | |
if existing_customers_by_firebase.data: | |
found_customer = existing_customers_by_firebase.data[0] | |
customer_found_status = "found_by_firebase_user" | |
print(f"Cliente existente encontrado por Firebase User ID. ID: {found_customer.id}") | |
# --- 2. Si no se encontr贸 por firebase_user, intentar buscar por email --- | |
if not found_customer: | |
print(f"Cliente no encontrado por Firebase UID. Buscando por email: {email}") # Para depuraci贸n | |
existing_customers_by_email = stripe.Customer.list(email=email, limit=1) | |
if existing_customers_by_email.data: | |
found_customer = existing_customers_by_email.data[0] | |
customer_found_status = "found_by_email" | |
print(f"Cliente existente encontrado por email. ID: {found_customer.id}") | |
# Opcional: Si lo encontraste por email pero tiene un firebase_user nuevo o nulo, actual铆zalo | |
# o si el site difiere, tambi茅n actualizarlo. | |
updated_metadata = found_customer.metadata.copy() if found_customer.metadata is not None else {} | |
needs_update = False | |
if firebase_user and updated_metadata.get('firebase_user') != firebase_user: | |
updated_metadata['firebase_user'] = firebase_user | |
needs_update = True | |
if site and updated_metadata.get('site') != site: | |
updated_metadata['site'] = site | |
needs_update = True | |
if needs_update: | |
print(f"Actualizando metadata para cliente {found_customer.id}") | |
found_customer = stripe.Customer.modify(found_customer.id, metadata=updated_metadata) | |
# Si se encontr贸 un cliente (por cualquiera de los m茅todos), lo retornamos | |
if found_customer: | |
return found_customer, customer_found_status | |
# --- 3. Si el cliente no existe (ni por firebase_user ni por email), crearlo --- | |
print(f"Cliente con email '{email}' y/o firebase_user '{firebase_user}' no encontrado. Creando nuevo cliente...") | |
customer_params = { | |
'email': email, | |
} | |
customer_metadata = {} | |
if firebase_user: | |
customer_metadata['firebase_user'] = firebase_user | |
if site: | |
customer_metadata['site'] = site | |
if customer_metadata: | |
customer_params['metadata'] = customer_metadata | |
customer = stripe.Customer.create(**customer_params) | |
print(f"Nuevo cliente creado exitosamente. ID: {customer.id}") | |
return customer, "created" | |
except stripe.error.StripeError as e: | |
print(f"Error de Stripe al buscar o crear el cliente: {e}") | |
return None | |
except Exception as e: | |
print(f"Ocurri贸 un error inesperado: {e}") | |
return None |