28 def post(self, request, *args, **kwargs):
30 logger.info(f
"Datos recibidos en create-preference: {request.data}")
34 if not serializer.is_valid():
35 logger.error(f
"Datos inválidos: {serializer.errors}")
36 return Response({
"error": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
39 user_token = serializer.validated_data[
'user_token']
40 email = serializer.validated_data.get(
'email')
42 logger.info(f
"Token recibido: {user_token[:10]}... (truncado por seguridad)")
45 cart_data = cart_service.get_cart(user_token)
48 logger.error(f
"No se pudo obtener el carrito con el token proporcionado: {user_token[:10]}...")
51 error_message =
"No se pudo obtener el carrito o está vacío"
53 error_message +=
". Para pruebas, utiliza un token que contenga 'test' para generar un carrito de prueba, o proporciona un token válido de un usuario con sesión iniciada."
56 {
"error": error_message},
57 status=status.HTTP_400_BAD_REQUEST
61 if not cart_data.get(
"productos", []):
62 logger.error(f
"El carrito está vacío: {cart_data}")
64 {
"error":
"El carrito está vacío"},
65 status=status.HTTP_400_BAD_REQUEST
69 total_amount = Decimal(str(cart_data.get(
"total",
"0")))
70 payment_request = PaymentRequest.objects.create(
71 user_token=user_token,
73 total_amount=total_amount,
79 items = mp_service.process_cart_to_items(cart_data)
82 payment_request.status =
"error"
83 payment_request.save()
85 {
"error":
"No se pudieron procesar los ítems del carrito"},
86 status=status.HTTP_400_BAD_REQUEST
90 notification_url = f
"{request.build_absolute_uri('/').rstrip('/')}/payment/webhook/"
92 env = request.data.get(
'env')
or request.POST.get(
'env')
95 "success":
"foodapp://success",
96 "failure":
"https://ispcfood.netlify.app/error",
97 "pending":
"https://ispcfood.netlify.app/pendiente"
101 "success":
"https://ispcfood.netlify.app/exito",
102 "failure":
"https://ispcfood.netlify.app/error",
103 "pending":
"https://ispcfood.netlify.app/pendiente"
105 preference = mp_service.create_preference(
107 external_reference=str(payment_request.id),
109 notification_url=notification_url,
114 payment_request.status =
"error"
115 payment_request.save()
117 {
"error":
"Error al crear la preferencia de pago"},
118 status=status.HTTP_500_INTERNAL_SERVER_ERROR
122 payment_request.preference_id = preference.get(
"id")
123 payment_request.init_point = preference.get(
"init_point")
124 payment_request.save()
128 "init_point": preference.get(
"init_point"),
129 "preference_id": preference.get(
"id"),
130 "payment_request_id": str(payment_request.id)
131 }, status=status.HTTP_201_CREATED)