55 String url = BASE_URL +
"/payment/create-preference/";
56 String token = sessionManager.getToken();
59 callback.
onError(
"Necesitas iniciar sesión para realizar un pago");
64 JSONObject jsonBody =
new JSONObject();
65 jsonBody.put(
"user_token", token);
68 if (email !=
null && !email.isEmpty()) {
69 jsonBody.put(
"email", email);
72 jsonBody.put(
"email",
"usuario@example.com");
73 Log.w(TAG,
"Email no disponible. Usando email predeterminado.");
77 jsonBody.put(
"env",
"mobile");
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>() {
84 public void onResponse(JSONObject response) {
86 Log.d(TAG,
"Respuesta MercadoPago: " + response.toString());
89 if (!response.has(
"init_point")) {
90 throw new JSONException(
"La respuesta no contiene la URL de pago (init_point)");
94 String initPoint = response.getString(
"init_point");
95 String preferenceId = response.optString(
"preference_id",
"");
96 String paymentRequestId = response.optString(
"payment_request_id",
"");
99 MercadoPagoPreference preference = new MercadoPagoPreference(
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());
112 },
new Response.ErrorListener() {
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";
118 if (error.networkResponse !=
null) {
120 Log.d(TAG,
"Código de estado: " + error.networkResponse.statusCode);
123 switch (error.networkResponse.statusCode) {
125 errorMsg =
"El servicio de pagos no está disponible en este momento. Por favor, intenta más tarde.";
128 errorMsg =
"Error interno del servidor de pagos. Por favor, intenta más tarde.";
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";
134 if (error.networkResponse.data !=
null) {
136 String responseBody =
new String(error.networkResponse.data,
"utf-8");
137 Log.d(TAG,
"Cuerpo de respuesta de error: " + responseBody);
140 if (responseBody.trim().startsWith(
"<!DOCTYPE") ||
141 responseBody.trim().startsWith(
"<html")) {
143 errorMsg =
"Error en la comunicación con el servidor de pagos.";
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");
153 }
catch (JSONException je) {
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.";
159 }
catch (Exception e) {
160 Log.e(TAG,
"Error al procesar la respuesta de error", e);
164 errorMsg +=
" (código: " + error.networkResponse.statusCode +
")";
171 public Map<String, String> getHeaders() {
172 Map<String, String> headers =
new HashMap<>();
173 headers.put(
"Content-Type",
"application/json");
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");
194 String url = BASE_URL +
"/payment/create-preference/";
195 String token = sessionManager.getToken();
197 callback.
onError(
"Necesitas iniciar sesión para realizar un pago");
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);
205 jsonBody.put(
"payer", payer);
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);
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>() {
219 public void onResponse(JSONObject response) {
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)");
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(
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());
240 new Response.ErrorListener() {
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);
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");
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());
272 String url = BASE_URL +
"/payment/status/" + paymentRequestId +
"/";
273 String token = sessionManager.getToken();
276 callback.
onError(
"Necesitas iniciar sesión para verificar el estado del pago");
280 JsonObjectRequest request =
new JsonObjectRequest(Request.Method.GET, url,
null,
new Response.Listener<JSONObject>() {
282 public void onResponse(JSONObject response) {
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");
293 new Response.ErrorListener() {
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";
299 if (error.networkResponse !=
null) {
300 errorMsg +=
" (código: " + error.networkResponse.statusCode +
")";
303 callback.onError(errorMsg);
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);
315 requestQueue.add(request);
332 String url = BASE_URL +
"/payment/confirm/" + paymentRequestId +
"/";
333 String token = sessionManager.getToken();
336 callback.
onError(
"Necesitas iniciar sesión para confirmar el pedido");
341 JSONObject jsonBody =
new JSONObject();
342 jsonBody.put(
"user_token", token);
344 JsonObjectRequest request =
new JsonObjectRequest(Request.Method.POST, url, jsonBody,
345 new Response.Listener<JSONObject>() {
347 public void onResponse(JSONObject response) {
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");
358 new Response.ErrorListener() {
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";
364 if (error.networkResponse !=
null) {
365 errorMsg +=
" (código: " + error.networkResponse.statusCode +
")";
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);
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");