Tesis 1.0.0
Loading...
Searching...
No Matches
MercadoPagoService.java
Go to the documentation of this file.
1package com.example.food_front.utils;
2
3import android.content.Context;
4import android.util.Log;
5
6import com.android.volley.Request;
7import com.android.volley.RequestQueue;
8import com.android.volley.Response;
9import com.android.volley.VolleyError;
10import com.android.volley.toolbox.JsonObjectRequest;
11import com.android.volley.toolbox.Volley;
12import com.example.food_front.models.MercadoPagoPreference;
13import com.google.gson.Gson;
14
15import org.json.JSONException;
16import org.json.JSONObject;
17
18import java.util.HashMap;
19import java.util.Map;
20
24public class MercadoPagoService {
25 private static final String TAG = "MercadoPagoService";
26 private static final String BASE_URL = "https://backmp.onrender.com"; // URL donde está desplegado el servicio de MP
27
28 private final Context context;
29 private final RequestQueue requestQueue;
30 private final SessionManager sessionManager;
31 private final Gson gson;
32
33 // Constantes para los estados de pago
34 public static final String STATUS_APPROVED = "approved";
35 public static final String STATUS_PENDING = "pending";
36 public static final String STATUS_REJECTED = "rejected";
37 public static final String STATUS_IN_PROCESS = "in_process";
38
39 public interface MercadoPagoCallback {
41 void onError(String errorMessage);
42 } public MercadoPagoService(Context context) {
43 this.context = context;
44 this.requestQueue = Volley.newRequestQueue(context);
45 this.sessionManager = new SessionManager(context);
46 this.gson = new Gson();
47 }
48
54 public void createPreference(String email, MercadoPagoCallback callback) {
55 String url = BASE_URL + "/payment/create-preference/";
56 String token = sessionManager.getToken();
57
58 if (token == null) {
59 callback.onError("Necesitas iniciar sesión para realizar un pago");
60 return;
61 }
62
63 try {
64 JSONObject jsonBody = new JSONObject();
65 jsonBody.put("user_token", token);
66
67 // Si el email es null, intentamos usar un email predeterminado para evitar errores
68 if (email != null && !email.isEmpty()) {
69 jsonBody.put("email", email);
70 } else {
71 // Usar un valor por defecto para evitar problemas en el servidor
72 jsonBody.put("email", "usuario@example.com");
73 Log.w(TAG, "Email no disponible. Usando email predeterminado.");
74 }
75
76 // Indicar el entorno para el backend (mobile)
77 jsonBody.put("env", "mobile");
78
79 // Log para depuración
80 Log.d(TAG, "Enviando solicitud a: " + url);
81 Log.d(TAG, "Cuerpo de la solicitud: " + jsonBody.toString()); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, jsonBody,
82 new Response.Listener<JSONObject>() {
83 @Override
84 public void onResponse(JSONObject response) {
85 try {
86 Log.d(TAG, "Respuesta MercadoPago: " + response.toString());
87
88 // Verificar si la respuesta contiene los campos necesarios
89 if (!response.has("init_point")) {
90 throw new JSONException("La respuesta no contiene la URL de pago (init_point)");
91 }
92
93 // Extraer los datos de la respuesta
94 String initPoint = response.getString("init_point");
95 String preferenceId = response.optString("preference_id", "");
96 String paymentRequestId = response.optString("payment_request_id", "");
97
98 // Crear el objeto de preferencia
99 MercadoPagoPreference preference = new MercadoPagoPreference(
100 initPoint,
101 preferenceId,
102 paymentRequestId
103 );
104
105 Log.d(TAG, "Preferencia creada con URL: " + initPoint);
106 callback.onSuccess(preference);
107 } catch (JSONException e) {
108 Log.e(TAG, "Error al parsear la respuesta", e);
109 callback.onError("Error al procesar la respuesta del servidor: " + e.getMessage());
110 }
111 }
112 }, new Response.ErrorListener() {
113 @Override
114 public void onErrorResponse(VolleyError error) {
115 Log.e(TAG, "Error en la solicitud a MercadoPago", error);
116 String errorMsg = "Error al conectar con el servicio de pagos";
117
118 if (error.networkResponse != null) {
119 // Log para depuración
120 Log.d(TAG, "Código de estado: " + error.networkResponse.statusCode);
121
122 // Manejar específicamente diferentes códigos de error
123 switch (error.networkResponse.statusCode) {
124 case 404:
125 errorMsg = "El servicio de pagos no está disponible en este momento. Por favor, intenta más tarde.";
126 break;
127 case 500:
128 errorMsg = "Error interno del servidor de pagos. Por favor, intenta más tarde.";
129 // Añadir enlaces a la documentación para ayudar en el desarrollo
130 errorMsg += " busca info de la implementación https://central.sonatype.com/artifact/com.mercadopago/sdk-java?smo=true https://github.com/mercadopago/sdk-java";
131 break;
132 default:
133 // Intentar procesamiento normal
134 if (error.networkResponse.data != null) {
135 try {
136 String responseBody = new String(error.networkResponse.data, "utf-8");
137 Log.d(TAG, "Cuerpo de respuesta de error: " + responseBody);
138
139 // Verificar si la respuesta es HTML
140 if (responseBody.trim().startsWith("<!DOCTYPE") ||
141 responseBody.trim().startsWith("<html")) {
142 // Es una respuesta HTML, manejar como error general
143 errorMsg = "Error en la comunicación con el servidor de pagos.";
144 } else {
145 // Intentar procesar como JSON
146 try {
147 JSONObject data = new JSONObject(responseBody);
148 if (data.has("error")) {
149 errorMsg = data.getString("error");
150 } else if (data.has("message")) {
151 errorMsg = data.getString("message");
152 }
153 } catch (JSONException je) {
154 // No es un JSON válido
155 Log.e(TAG, "La respuesta no es un JSON válido", je);
156 errorMsg = "Error en la comunicación con el servidor. Por favor, intenta más tarde.";
157 }
158 }
159 } catch (Exception e) {
160 Log.e(TAG, "Error al procesar la respuesta de error", e);
161 }
162 }
163 }
164 errorMsg += " (código: " + error.networkResponse.statusCode + ")";
165 }
166
167 callback.onError(errorMsg);
168 }
169 }) {
170 @Override
171 public Map<String, String> getHeaders() {
172 Map<String, String> headers = new HashMap<>();
173 headers.put("Content-Type", "application/json");
174 return headers;
175 }
176 };
177
178 requestQueue.add(request);
179 } catch (JSONException e) {
180 Log.e(TAG, "Error al crear el cuerpo de la solicitud", e);
181 callback.onError("Error al preparar la solicitud de pago");
182 }
183 }
184
193 public void createPreferenceFull(String email, org.json.JSONArray items, org.json.JSONObject payer, String externalReference, MercadoPagoCallback callback) {
194 String url = BASE_URL + "/payment/create-preference/";
195 String token = sessionManager.getToken();
196 if (token == null) {
197 callback.onError("Necesitas iniciar sesión para realizar un pago");
198 return;
199 }
200 try {
201 JSONObject jsonBody = new JSONObject();
202 jsonBody.put("user_token", token);
203 jsonBody.put("email", email != null && !email.isEmpty() ? email : "usuario@example.com");
204 jsonBody.put("items", items); // array de productos
205 jsonBody.put("payer", payer); // objeto con datos del comprador
206 JSONObject backUrls = new JSONObject();
207 backUrls.put("success", "https://backmp.onrender.com/payment/success/");
208 backUrls.put("failure", "https://ispcfood.netlify.app/checkout");
209 backUrls.put("pending", "https://ispcfood.netlify.app/exito");
210 jsonBody.put("back_urls", backUrls);
211 jsonBody.put("auto_return", "approved");
212 jsonBody.put("external_reference", externalReference);
213
214 Log.d(TAG, "Enviando solicitud a: " + url);
215 Log.d(TAG, "Cuerpo de la solicitud: " + jsonBody.toString());
216 JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, jsonBody,
217 new Response.Listener<JSONObject>() {
218 @Override
219 public void onResponse(JSONObject response) {
220 try {
221 Log.d(TAG, "Respuesta MercadoPago: " + response.toString());
222 if (!response.has("init_point")) {
223 throw new JSONException("La respuesta no contiene la URL de pago (init_point)");
224 }
225 String initPoint = response.getString("init_point");
226 String preferenceId = response.optString("preference_id", "");
227 String paymentRequestId = response.optString("payment_request_id", "");
228 MercadoPagoPreference preference = new MercadoPagoPreference(
229 initPoint,
230 preferenceId,
231 paymentRequestId
232 );
233 callback.onSuccess(preference);
234 } catch (JSONException e) {
235 Log.e(TAG, "Error al parsear la respuesta", e);
236 callback.onError("Error al procesar la respuesta del servidor: " + e.getMessage());
237 }
238 }
239 },
240 new Response.ErrorListener() {
241 @Override
242 public void onErrorResponse(VolleyError error) {
243 Log.e(TAG, "Error en la solicitud a MercadoPago", error);
244 String errorMsg = "Error al conectar con el servicio de pagos";
245 if (error.networkResponse != null) {
246 Log.d(TAG, "Código de estado: " + error.networkResponse.statusCode);
247 }
248 callback.onError(errorMsg);
249 }
250 }) {
251 @Override
252 public Map<String, String> getHeaders() {
253 Map<String, String> headers = new HashMap<>();
254 headers.put("Authorization", "Bearer " + token);
255 headers.put("Content-Type", "application/json");
256 return headers;
257 }
258 };
259 requestQueue.add(request);
260 } catch (JSONException e) {
261 Log.e(TAG, "Error al crear el body JSON", e);
262 callback.onError("Error al crear el body JSON: " + e.getMessage());
263 }
264 }
265
271 public void checkPaymentStatus(String paymentRequestId, PaymentStatusCallback callback) {
272 String url = BASE_URL + "/payment/status/" + paymentRequestId + "/";
273 String token = sessionManager.getToken();
274
275 if (token == null) {
276 callback.onError("Necesitas iniciar sesión para verificar el estado del pago");
277 return;
278 }
279
280 JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
281 @Override
282 public void onResponse(JSONObject response) {
283 try {
284 Log.d(TAG, "Respuesta estado de pago: " + response.toString());
285 String status = response.getString("status");
286 callback.onSuccess(status);
287 } catch (JSONException e) {
288 Log.e(TAG, "Error al parsear la respuesta de estado", e);
289 callback.onError("Error al procesar la respuesta del servidor");
290 }
291 }
292 },
293 new Response.ErrorListener() {
294 @Override
295 public void onErrorResponse(VolleyError error) {
296 Log.e(TAG, "Error al verificar estado del pago", error);
297 String errorMsg = "Error al verificar el estado del pago";
298
299 if (error.networkResponse != null) {
300 errorMsg += " (código: " + error.networkResponse.statusCode + ")";
301 }
302
303 callback.onError(errorMsg);
304 }
305 }) {
306 @Override
307 public Map<String, String> getHeaders() {
308 Map<String, String> headers = new HashMap<>();
309 headers.put("Content-Type", "application/json");
310 headers.put("Authorization", "Token " + token);
311 return headers;
312 }
313 };
314
315 requestQueue.add(request);
316 }
317
321 public interface OrderConfirmCallback {
322 void onSuccess(String orderId);
323 void onError(String errorMessage);
324 }
325
331 public void confirmOrder(String paymentRequestId, OrderConfirmCallback callback) {
332 String url = BASE_URL + "/payment/confirm/" + paymentRequestId + "/";
333 String token = sessionManager.getToken();
334
335 if (token == null) {
336 callback.onError("Necesitas iniciar sesión para confirmar el pedido");
337 return;
338 }
339
340 try {
341 JSONObject jsonBody = new JSONObject();
342 jsonBody.put("user_token", token);
343
344 JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, jsonBody,
345 new Response.Listener<JSONObject>() {
346 @Override
347 public void onResponse(JSONObject response) {
348 try {
349 Log.d(TAG, "Respuesta confirmación pedido: " + response.toString());
350 String orderId = response.optString("order_id", "");
351 callback.onSuccess(orderId);
352 } catch (Exception e) {
353 Log.e(TAG, "Error al parsear la respuesta de confirmación", e);
354 callback.onError("Error al procesar la respuesta del servidor");
355 }
356 }
357 },
358 new Response.ErrorListener() {
359 @Override
360 public void onErrorResponse(VolleyError error) {
361 Log.e(TAG, "Error en la solicitud de confirmación", error);
362 String errorMsg = "Error al confirmar el pedido";
363
364 if (error.networkResponse != null) {
365 errorMsg += " (código: " + error.networkResponse.statusCode + ")";
366 }
367
368 callback.onError(errorMsg);
369 }
370 }) {
371 @Override
372 public Map<String, String> getHeaders() {
373 Map<String, String> headers = new HashMap<>();
374 headers.put("Content-Type", "application/json");
375 headers.put("Authorization", "Token " + token);
376 return headers;
377 }
378 };
379
380 requestQueue.add(request);
381 } catch (JSONException e) {
382 Log.e(TAG, "Error al crear el cuerpo de la solicitud", e);
383 callback.onError("Error al preparar la confirmación del pedido");
384 }
385 }
386
390 public interface PaymentStatusCallback {
391 void onSuccess(String status);
392 void onError(String errorMessage);
393 }
394}
void confirmOrder(String paymentRequestId, OrderConfirmCallback callback)
void createPreferenceFull(String email, org.json.JSONArray items, org.json.JSONObject payer, String externalReference, MercadoPagoCallback callback)
void checkPaymentStatus(String paymentRequestId, PaymentStatusCallback callback)
void createPreference(String email, MercadoPagoCallback callback)