Login to bookmark this video
Buy Access to Course
07.

Completar la compra

|

Share this awesome video!

|

Keep on Learning!

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

Acabo de comprar otro producto increíble en nuestra tienda online, y cuando terminé de pagar, LemonSqueezy me dio un mensaje de éxito:

¡Gracias por tu pedido!

Es breve, dulce y directo, pero ¿hay alguna forma de personalizarlo si lo necesitamos? Sí Y es específico para cada producto.

En el panel de control, haz clic en "Tienda"... "Productos"... "Elegir un producto", y en la sección "Modalidad de confirmación" de aquí abajo, busca los campos "Título" y "Mensaje". Aquí tenemos un texto por defecto, el mismo que vimos antes en el mensaje de confirmación.

De momento estoy bastante contento con el texto por defecto, aunque le vendrían bien unos cuantos signos de exclamación más, porque ese es el rollo de mi puesto de limonada. Si decides cambiar este texto, recuerda que los cambios que hagas aquí sólo se aplicarán a este producto en concreto, así que si quieres que todos tus productos reflejen tus cambios, tendrás que personalizarlos uno a uno.

Lo mismo ocurre con este botón. Aquí podemos cambiar su texto y su enlace. El enlace por defecto parece que va a una página de mis pedidos. Si hacemos clic en él... ¡sí! Estamos en la página de pedidos de LemonSqueezy.

Quiero personalizar esto para volver a nuestra aplicación después.

Borrar el carrito tras la compra

En primer lugar, tenemos un error.

En nuestro sitio... el producto que acabamos de comprar sigue en el carrito. Tenemos que asegurarnos de que el carrito se borra después de realizar una compra. Para ello, en OrderController, crea una acción especial. La llamaremos success(). A continuación, registra la ruta en#[Route('/checkout/success', name: 'app_order_success')]. Aquí será donde redirijamos a los clientes después de completar la compra en LemonSqueezy.

139 lines | src/Controller/OrderController.php
// ... lines 1 - 15
class OrderController extends AbstractController
{
// ... lines 18 - 69
#[Route('/checkout/success', name: 'app_order_success')]
public function success(): Response
{
}
// ... lines 74 - 137
}

Ahora, para evitar el acceso directo a esta página, vamos a utilizar un pequeño truco. Inyecta Request $request y, dentro, añade$referer = $request->headers->get('referer'). A continuación, crea una variable -$lsStoreUrl - y establécela en la URL de la tienda. Para ello, ve al panel de control, abre el escaparate, copia la URL y pégala en nuestro códigohttps://squeeze-the-day.lemonsqueezy.com'.

146 lines | src/Controller/OrderController.php
// ... lines 1 - 69
#[Route('/checkout/success', name: 'app_order_success')]
public function success(
Request $request,
): Response
{
$referer = $request->headers->get('referer');
$lsStoreUrl = 'https://squeeze-the-day.lemonsqueezy.com';
// ... lines 77 - 79
}
// ... lines 81 - 146

A continuación, añade if (!str_starts_with($referer, $lsStoreUrl)). Si esto es cierto, significa que alguien ha abierto esta URL directamente. En este caso, redirígelos a la página de inicio con return $this->redirectToRoute('app_homepage'). InyectaShoppingCart $cart y, debajo, continúa con if ($cart->isEmpty()). De nuevo, redirige a la página de inicio conreturn $this->redirectToRoute('app_homepage'). Si no, vacía el carrito con $cart->clear().

152 lines | src/Controller/OrderController.php
// ... lines 1 - 69
#[Route('/checkout/success', name: 'app_order_success')]
public function success(
// ... line 72
ShoppingCart $cart,
): Response
{
// ... lines 76 - 77
if (!str_starts_with($referer, $lsStoreUrl)) {
return $this->redirectToRoute('app_homepage');
}
if ($cart->isEmpty()) {
return $this->redirectToRoute('app_homepage');
}
$cart->clear();
}
// ... lines 87 - 152

Podríamos crear una página de éxito separada con algunos detalles si quisiéramos, pero por ahora, lo mantendremos simple y sólo añadiremos un mensaje flash -$this->addFlash('success', 'Thanks for your order!') - yreturn $this->redirectToRoute('app_homepage').

155 lines | src/Controller/OrderController.php
// ... lines 1 - 70
public function success(
// ... lines 72 - 73
): Response
{
// ... lines 76 - 85
$this->addFlash('success', 'Thanks for your order!');
return $this->redirectToRoute('app_homepage');
}
// ... lines 90 - 155

Vale, ahora tenemos que añadir esta URL al campo "Enlace del botón" de todos y cada uno de los productos. Un fastidio. Tiene que haber una forma más fácil de hacerlo, ¿verdad? Afortunadamente, sí: con una opción de la API.

En los documentos de la API, busca "Crear una compra". En product_options, mira esto redirect_url:

Una URL personalizada a la que redirigir después de una compra satisfactoria.

¡Eso es exactamente lo que estamos buscando!

En nuestro código, abre el método createLsCheckoutUrl(), y debajo, añade:$attributes['product_options']['redirect_url'] = $this->generateUrl('app_order_success', [], UrlGeneratorInterface::ABSOLUTE_URL).

158 lines | src/Controller/OrderController.php
// ... lines 1 - 91
private function createLsCheckoutUrl(HttpClientInterface $lsClient, ShoppingCart $cart, ?User $user): string
{
// ... lines 94 - 127
$attributes['product_options']['redirect_url'] = $this->generateUrl('app_order_success', [], UrlGeneratorInterface::ABSOLUTE_URL);
// ... lines 129 - 155
}
// ... lines 157 - 158

Bien, vuelve a pasar por caja. Introduce la información de la tarjeta y la dirección de facturación, haz clic en el botón "Realizar pedido" y espera a que aparezca el modal de confirmación. ¡Ya está! Si hacemos clic en "Continuar"... ¡sí! Vemos el mensaje flash de "realizado con éxito" - "¡Gracias por tu pedido!" - y el carrito ya está completamente vacío. ¡Muy bien!

Siguiente: Antes de hacer más peticiones a la API, separemos la lógica empresarial de LemonSqueezy del controlador y centralicémosla en un servicio independiente.