1+ package com .outfitlab .project .domain .service ;
2+
3+ import com .mercadopago .MercadoPagoConfig ;
4+ import com .mercadopago .client .payment .PaymentClient ;
5+ import com .mercadopago .client .preference .PreferenceClient ;
6+ import com .mercadopago .client .preference .PreferenceItemRequest ;
7+ import com .mercadopago .client .preference .PreferencePayerRequest ;
8+ import com .mercadopago .client .preference .PreferenceRequest ;
9+ import com .mercadopago .exceptions .MPApiException ;
10+ import com .mercadopago .resources .payment .Payment ;
11+ import com .mercadopago .resources .preference .Preference ;
12+ import com .mercadopago .exceptions .MPException ;
13+ import org .springframework .beans .factory .annotation .Value ;
14+ import org .springframework .stereotype .Service ;
15+ import java .math .BigDecimal ;
16+ import java .util .ArrayList ;
17+ import java .util .List ;
18+
19+ @ Service
20+ public class SubscriptionService {
21+
22+ /**
23+ * Constructor para inicializar el SDK con el Access Token.
24+ * Se ejecuta al iniciar Spring Boot.
25+ */
26+ public SubscriptionService (@ Value ("${mercadopago.access.token}" ) String accessToken ) {
27+ if (accessToken == null || accessToken .trim ().isEmpty () || accessToken .equals ("${mercadopago.access.token}" )) {
28+ throw new IllegalArgumentException ("ERROR: El Access Token de Mercado Pago no está configurado. Revisa la variable de entorno MP_ACCESS_TOKEN." );
29+ }
30+ MercadoPagoConfig .setAccessToken (accessToken );
31+ System .out .println ("Mercado Pago SDK de Java inicializado (desde SubscriptionService)." );
32+ }
33+
34+ /**
35+ * Crea una Preferencia de Pago Único (para la demo).
36+ */
37+ public String createMercadoPagoPreference (String planId , String userEmail , BigDecimal price , String currency ) throws MPException , MPApiException {
38+
39+ // 1. Definir el ítem
40+ PreferenceItemRequest itemRequest = PreferenceItemRequest .builder ()
41+ .id (planId )
42+ .title ("Demo Premium Outfit Lab" )
43+ .description ("Acceso único a funciones premium" )
44+ .quantity (1 )
45+ .unitPrice (price )
46+ .currencyId (currency )
47+ .build ();
48+
49+ List <PreferenceItemRequest > items = new ArrayList <>();
50+ items .add (itemRequest );
51+
52+ // 2. Definir el pagador (con el email de prueba)
53+ PreferencePayerRequest payer = PreferencePayerRequest .builder ()
54+ .email (userEmail )
55+ .build ();
56+
57+ // 3. Crear la solicitud de Preferencia
58+ PreferenceRequest request = PreferenceRequest .builder ()
59+ .items (items )
60+ .payer (payer )
61+ // --- SE ELIMINAN backUrls y autoReturn ---
62+ // Esto evita el error 500 (MPApiException) al validar localhost.
63+ // Mercado Pago usará las URLs configuradas en el dashboard
64+ // o mostrará un botón simple de "Volver al sitio".
65+ .externalReference (planId )
66+ .build ();
67+
68+ // 4. Ejecutar la API
69+ PreferenceClient client = new PreferenceClient ();
70+ Preference preference = client .create (request );
71+
72+ // 5. Devolver la URL de pago
73+ return preference .getInitPoint ();
74+ }
75+
76+ /**
77+ * Procesa el Webhook para un Pago Único.
78+ */
79+ public void processPaymentNotification (Long paymentId ) throws MPException , MPApiException {
80+ PaymentClient client = new PaymentClient ();
81+ Payment payment = client .get (paymentId );
82+
83+ String status = payment .getStatus ();
84+ String externalReference = payment .getExternalReference ();
85+
86+ System .out .printf ("Procesando Webhook de PAGO. ID Pago MP: %s, ID Plan Interno: %s, Status: %s%n" ,
87+ paymentId , externalReference , status );
88+
89+ if ("approved" .equals (status )) {
90+ System .out .println ("Pago AUTHORIZED. Activando Premium (Demo) para: " + externalReference );
91+ // TODO: Aquí iría tu lógica de base de datos para activar el servicio
92+ } else if ("rejected" .equals (status ) || "cancelled" .equals (status )) {
93+ System .out .println ("Pago REJECTED/CANCELLED para: " + externalReference );
94+ }
95+ }
96+ }
0 commit comments