Skip to content

Commit cb46ddb

Browse files
committed
traigo cambios de mercado pago
1 parent d7493fb commit cb46ddb

File tree

4 files changed

+201
-1
lines changed

4 files changed

+201
-1
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@
7373
<scope>compile</scope>
7474
</dependency>
7575

76+
<dependency>
77+
<groupId>com.mercadopago</groupId>
78+
<artifactId>sdk-java</artifactId>
79+
<version>2.1.7</version>
80+
</dependency>
81+
7682
<!-- TESTS -->
7783
<dependency>
7884
<groupId>org.springframework.boot</groupId>
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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+
}

src/main/resources/application.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,7 @@ spring.datasource.username=${SPRING_DATASOURCE_RENDER_USERNAME}
5757
spring.datasource.password=${SPRING_DATASOURCE_RENDER_PASSWORD}
5858
spring.datasource.driver-class-name=org.postgresql.Driver
5959

60-
60+
# ===== mercado pago =====
61+
mercadopago.access.token=${MP_ACCESS_TOKEN}
62+
mercadopago.urls.back=http://localhost:5173/suscripcion-finalizada
6163

0 commit comments

Comments
 (0)