File size: 7,417 Bytes
11cdb7c
4579ff3
d90d6a6
4579ff3
2695e7b
5cfc6de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64e0349
2695e7b
 
ddb4143
64e0349
5cfc6de
 
f2528b2
 
5cfc6de
f2528b2
 
5cfc6de
 
f2528b2
5cfc6de
f2528b2
5cfc6de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64e0349
 
03e7a68
64e0349
f2528b2
 
 
64e0349
 
 
f2528b2
 
 
03e7a68
64e0349
 
f2528b2
64e0349
 
 
f2528b2
 
03e7a68
f2528b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
03e7a68
64e0349
 
 
 
03e7a68
 
 
 
 
 
f2528b2
03e7a68
64e0349
 
 
03e7a68
f2528b2
64e0349
 
03e7a68
64e0349
 
03e7a68
5cfc6de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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