Skip to content

fix(checkout): restaurar carrito al volver del redirect sin completar pago#5

Open
Sebah01a wants to merge 1 commit into
mainfrom
fix/restore-quote-on-redirect
Open

fix(checkout): restaurar carrito al volver del redirect sin completar pago#5
Sebah01a wants to merge 1 commit into
mainfrom
fix/restore-quote-on-redirect

Conversation

@Sebah01a
Copy link
Copy Markdown

@Sebah01a Sebah01a commented May 8, 2026

Contexto

Cuando el cliente vuelve al store sin completar el pago en Fintoc (botón atrás del navegador), el carrito aparece vacío. Magento cierra el carrito al crear la orden antes del redirect, y los handlers existentes con restoreQuote() solo se ejecutan cuando Fintoc redirige por cancel_url. Entonces cuando el usuario volvía atrás, por otro lado que no sea el cancel_url, no se restauraba el carrito.

quote = carrito

Causa raíz

  1. Place Order → Magento crea la orden → quote.is_active = 0 (carrito muerto)
  2. Plugin llama a Fintoc → recibe redirect_url
  3. Frontend redirige a pay.fintoc.com
  4. Si el usuario hace atrás del browser, nunca se llama a Commit controller → restoreQuote() no se ejecuta → /checkout/cart lo ve vacío.

Solución

Agregar un restoreQuote() en Controller/Checkout/Create.php justo antes de devolver el redirect_url al frontend.

Grabacion.de.pantalla.2026-05-08.a.la.s.5.35.15.p.m.mov

Magento consumes the quote (cart) when placing the order before
redirecting to Fintoc. If the customer hits browser back without
completing payment, the cart appears empty.

Restoring the quote right before returning the redirect_url keeps
the cart alive during the redirect. The success page clears the
quote naturally on payment completion; the cancel callback is
idempotent (already calls restoreQuote in processCancelAction).
@Sebah01a Sebah01a marked this pull request as ready for review May 8, 2026 14:08
throw new LocalizedException(__('Invalid response from Fintoc API'));
}

try {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No entendí, cuando se llama esto? Antes de redireccionar al usuario al Checkout de Fintoc? Si es así, no creo que sea la mejor opción, puede pasar que tengas 2 pagos al mismo tiempo para el mismo carrito.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

La Anto me acuerdo que estaba haciendo algo para hacer expired el pago cuando el usuario se va de la página, tal vez es mejor escuchar ese webhook y con eso devolver el carrito

Copy link
Copy Markdown
Author

@Sebah01a Sebah01a May 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esto se llama cuando el usuario vuelve del Checkout de Fintoc, pero no por el cancel_url, entonces lo que antes pasaba es que el carrito no se hacíaa restore (solo se hacía cuando llegaba por cancel_url). Por eso aplicamos esta misma lógica fuera del scope

EDIT:

Me confundí, si se llama antes de redireccionar al usuario al Checkout. Dejé una demo en la descripción para mostrar el flujo. Entiendo que podría generar 2 CS para el mismo carro, pero al final el pago sería solo desde una CS. O lo dices porque el dashboard de magento mostraría carritos "fantasmas"?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pero al final el pago sería solo desde una CS

Mmmm pero es que esto puede no ser verdad, una persona podría tratar de pagar el mismo carrito 2 veces y creo que eso trae mas problemas. Estilo:

  1. Aprieto pagar -> Me voy a nuestro Checkout.
  2. Vuelvo al carrito sin cerrar el Checkout orginal.
  3. Aprieto pagar de nuevo -> Me voy a nuestro Checkout.
  4. Completo el pago en 2 partes -> Pague 2 veces el mismo carrito

Copy link
Copy Markdown
Author

@Sebah01a Sebah01a May 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Entiendo. Podríamos expirar cada CS que sea abandonada
Porque el webhook expired sería solo cuando pasa el tiempo de vida de la CS o no?

me imagino que podemos hacer esto:

  1. Usuario sale del Checkout
  2. Se obtiene la última orden que hizo (la que se acaba de salir)
  3. Usamos el endpoint expire de la CS para
  4. Creamos una nueva CS si pone pagar de nuevo.

Consideraciones: el expire solo funciona para CS en created, por lo tanto con CS in_progress habría que redirigir de vuelta a la misma CS

Que opinas de algo así?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mmm igual me parece! Si el pago esta in_progress no redirigiria de vuelta al Checkout si no que esperaría que cuando llegue el WH dependiendo del estado que hacer con el carrito! Igual confirmaría con producto que opinan de funcionar así

@Sebah01a Sebah01a requested a review from Gonzalo9823 May 8, 2026 21:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants