Problema / reto
Integrar pagos sin romper el flujo de compra
El reto principal era adaptar métodos de pago externos dentro de tiendas ya existentes, asegurando que el usuario pudiera finalizar el pedido correctamente y que el comercio recibiera toda la información necesaria para gestionar la venta.
- Configurar TPV bancarios en modo pruebas y preparar el paso a producción.
- Modificar textos del checkout y emails para explicar correctamente las instrucciones de pago.
- Resolver problemas cuando los datos del pedido no llegaban correctamente.
- Comprobar estados de pedido, notificaciones y recepción de emails.
- Evitar cambios que afectaran a procesos críticos de venta en producción.
Solución
Configuración, pruebas y adaptación del proceso de compra
La solución consistió en revisar cada método de pago, configurar sus credenciales, realizar pruebas en entorno sandbox cuando era posible y adaptar textos, plantillas o lógica del checkout según las necesidades del negocio.
- Configuración de códigos de comercio, terminales, moneda y entorno de pruebas.
- Revisión de módulos de pago instalados y compatibilidad con la tienda.
- Pruebas de pedido para comprobar estados, emails y recepción de datos.
- Ajustes en plantillas de WooCommerce y PrestaShop cuando el flujo lo requería.
- Documentación de los cambios para facilitar futuras revisiones.
Enfoque técnico
No solo instalar módulos, sino validar el flujo completo
En pagos online no basta con activar una opción en el panel. Es necesario revisar el recorrido completo del usuario y del comercio: selección del método, confirmación, pedido generado, email enviado, datos recibidos y comportamiento posterior.
- Revisión del checkout desde la perspectiva del cliente.
- Comprobación de la información recibida por administración.
- Ajuste de instrucciones cuando el pago requería acciones posteriores.
- Pruebas con distintos métodos, transportistas y escenarios de pedido.
- Validación de que los cambios no rompieran otros flujos existentes.
Arquitectura / flujo
Lógica avanzada de checkout y reglas dinámicas de envío
Uno de los retos más importantes fue adaptar el proceso de compra a múltiples escenarios reales de negocio mediante reglas dinámicas de envío, restricciones según clases de producto y condiciones automáticas basadas en subtotal, ubicación y tipo de pedido.
La implementación se realizó sobre WooCommerce utilizando hooks y filtros personalizados para modificar dinámicamente los métodos disponibles durante el checkout.
- Ocultación dinámica de métodos de envío según clase de producto.
- Reglas automáticas de envío gratuito según subtotal.
- Comportamiento diferente para Baleares y Gibraltar.
- Gestión de productos estándar, semipesados y especiales.
- Adaptación del checkout según combinaciones reales de carrito.
- Persistencia de metadatos de envío dentro del pedido.
- Eliminación de regiones no soportadas en el checkout.
/* ↓↓ Codigo personalizable ↓↓ */
/*
ENVÍO ESTÁNDAR SIN CLASE (7 + IVA). SI >= 250 ENVÍO GRATUITO
CLASE POCO PESADO (20 + IVA) SI CESTA >= 250 ENVÍO GRATUITO
CLASE ENVÍO SEMIPESADO (40 + IVA) SI CESTA >= 250 ENVÍO GRATUITO
CLASE PLATOS/MUEBLES (20 + IVA) NO HAY ENVÍO GRATUITO
CLASE ESPECIAL 100 (100 + IVA) NO HAY ENVÍO GRATUITOs
https://es.planetcalc.com/3757/ pagina para hacer combinaciones
*/
$envio_especial_100_baleares = 'flat_rate:38';
$estandar_baleares = 'flat_rate:19';
$semi_pesado_baleares = 'flat_rate:40';
$poco_pesado_baleares = 'flat_rate:39';
$estandar_gibraltar = 'flat_rate:9';
$semi_pesado_gibraltar = 'flat_rate:29';
$poco_pesado_gibraltar = 'flat_rate:28';
$envio_especial_100 = 'flat_rate:47';
$semi_pesado = 'flat_rate:52';
$platos_muebles = 'flat_rate:54';
$poco_pesado = 'flat_rate:51';
$envio_clase_estandar = 'flat_rate:50';
$envio_estandar = 'flat_rate:3';
$envio_gratuito = 'free_shipping:2';
add_filter('woocommerce_package_rates', 'custom_shipping_based_on_class', 10, 2);
function custom_shipping_based_on_class($rates, $package) {
global $estandar_baleares, $envio_especial_100, $semi_pesado, $platos_muebles, $poco_pesado, $envio_clase_estandar;
// Clase de envío específica
$shipping_class_to_allow = 'envio-especial-100'; // Reemplaza con el slug de tu clase de envío
$ocultar_metodos = array('flat_rate:3', $envio_clase_estandar, $poco_pesado, $semi_pesado, $platos_muebles, 'free_shipping:2', $estandar_baleares);
// Verificar si hay productos en el carrito con esta clase de envío
$shipping_class_in_cart = false;
foreach (WC()->cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$product_shipping_class = $product->get_shipping_class();
if ($product_shipping_class === $shipping_class_to_allow) {
$shipping_class_in_cart = true;
break;
}
}
// Si el producto con la clase de envío está en el carrito
if ($shipping_class_in_cart) {
foreach ($ocultar_metodos as $id) {
unset($rates[$id]);
}
}
return $rates;
}
add_filter('woocommerce_package_rates', 'custom_shipping_based_price', 10, 2);
function custom_shipping_based_price($rates, $package) {
global $estandar_gibraltar, $estandar_baleares, $envio_especial_100, $semi_pesado, $platos_muebles, $poco_pesado, $envio_clase_estandar;
$current_total = WC()->cart->subtotal;
// Clase de envío específica
if ($current_total >= 250) {
$ocultar_metodos = array('flat_rate:3');
}
if ($current_total >= 500) {
array_push($ocultar_metodos, $estandar_baleares);
}
if ($current_total >= 1200) {
array_push($ocultar_metodos, $estandar_gibraltar);
}
// Si el producto con la clase de envío está en el carrito
foreach ($ocultar_metodos as $id) {
unset($rates[$id]);
}
return $rates;
}
add_filter('woocommerce_package_rates', 'custom_shipping_based_on_class_envio_estandar', 10, 2);
function custom_shipping_based_on_class_envio_estandar($rates, $package) {
global $estandar_baleares, $envio_especial_100, $semi_pesado, $platos_muebles, $poco_pesado, $envio_clase_estandar;
// Clase de envío específica
$shipping_class_to_allow = 'envio-estandar'; // Reemplaza con el slug de tu clase de envío
$ocultar_metodos = array('flat_rate:3');
$current_total = WC()->cart->subtotal;
if ($current_total >= 250) {
array_push($ocultar_metodos, 'flat_rate:3', $envio_clase_estandar);
}
// Verificar si hay productos en el carrito con esta clase de envío
$shipping_class_in_cart = false;
foreach (WC()->cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$product_shipping_class = $product->get_shipping_class();
if ($product_shipping_class === $shipping_class_to_allow) {
$shipping_class_in_cart = true;
break;
}
}
// Si el producto con la clase de envío está en el carrito
if ($shipping_class_in_cart) {
foreach ($ocultar_metodos as $id) {
unset($rates[$id]);
}
}
return $rates;
}
add_filter('woocommerce_package_rates', 'custom_shipping_based_on_class_envio_poco_pesado', 10, 2);
function custom_shipping_based_on_class_envio_poco_pesado($rates, $package) {
global $estandar_gibraltar, $semi_pesado_gibraltar, $poco_pesado_gibraltar, $poco_pesado_baleares, $estandar_baleares, $envio_especial_100, $semi_pesado, $platos_muebles, $poco_pesado, $envio_clase_estandar;
// Clase de envío específica
$shipping_class_to_allow = 'envio-poco-pesado'; // Reemplaza con el slug de tu clase de envío
$ocultar_metodos = array('flat_rate:3', $envio_clase_estandar, $platos_muebles, $poco_pesado_gibraltar, $poco_pesado_baleares);
$current_total = WC()->cart->subtotal;
if ($current_total >= 250) {
array_push($ocultar_metodos, $poco_pesado);
unset($ocultar_metodos[2]);
}
if ($current_total >= 500) {
array_push($ocultar_metodos, $estandar_baleares);
}
if ($current_total >= 1200) {
array_push($ocultar_metodos, $estandar_gibraltar);
}
// Verificar si hay productos en el carrito con esta clase de envío
$shipping_class_in_cart = false;
foreach (WC()->cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$product_shipping_class = $product->get_shipping_class();
if ($product_shipping_class === $shipping_class_to_allow) {
$shipping_class_in_cart = true;
break;
}
}
// Si el producto con la clase de envío está en el carrito
if ($shipping_class_in_cart) {
foreach ($ocultar_metodos as $id) {
unset($rates[$id]);
}
}
return $rates;
}
add_filter('woocommerce_package_rates', 'custom_shipping_based_on_class_envio_platos_y_muebles', 10, 2);
function custom_shipping_based_on_class_envio_platos_y_muebles($rates, $package) {
global $envio_especial_100, $semi_pesado, $platos_muebles, $poco_pesado, $envio_clase_estandar;
// Clase de envío específica
$shipping_class_to_allow = 'envio-platos-y-muebles'; // Reemplaza con el slug de tu clase de envío
$ocultar_metodos = array('flat_rate:3', $envio_clase_estandar, 'free_shipping:2');
// Verificar si hay productos en el carrito con esta clase de envío
$shipping_class_in_cart = false;
foreach (WC()->cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$product_shipping_class = $product->get_shipping_class();
if ($product_shipping_class === $shipping_class_to_allow) {
$shipping_class_in_cart = true;
break;
}
}
// Si el producto con la clase de envío está en el carrito
if ($shipping_class_in_cart) {
foreach ($ocultar_metodos as $id) {
unset($rates[$id]);
}
}
return $rates;
}
add_filter('woocommerce_package_rates', 'custom_shipping_based_on_class_envio_semi_pesado', 10, 2);
function custom_shipping_based_on_class_envio_semi_pesado($rates, $package) {
global $estandar_gibraltar, $semi_pesado_gibraltar, $poco_pesado_gibraltar, $semi_pesado_baleares, $estandar_baleares, $envio_especial_100, $semi_pesado, $platos_muebles, $poco_pesado, $envio_clase_estandar;
// Clase de envío específica
$shipping_class_to_allow = 'envio-semi-pesado'; // Reemplaza con el slug de tu clase de envío
$ocultar_metodos = array('flat_rate:3', $envio_clase_estandar, $poco_pesado, $platos_muebles, $semi_pesado_gibraltar, $semi_pesado_baleares);
$current_total = WC()->cart->subtotal;
if ($current_total >= 250) {
array_push($ocultar_metodos, $semi_pesado);
unset($ocultar_metodos[3]);
}
if ($current_total >= 500) {
array_push($ocultar_metodos, $estandar_baleares);
}
if ($current_total >= 1200) {
array_push($ocultar_metodos, $estandar_gibraltar);
}
// Verificar si hay productos en el carrito con esta clase de envío
$shipping_class_in_cart = false;
foreach (WC()->cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$product_shipping_class = $product->get_shipping_class();
if ($product_shipping_class === $shipping_class_to_allow) {
$shipping_class_in_cart = true;
break;
}
}
// Si el producto con la clase de envío está en el carrito
if ($shipping_class_in_cart) {
foreach ($ocultar_metodos as $id) {
unset($rates[$id]);
}
}
return $rates;
}
El sistema completo incluye múltiples reglas condicionales según subtotal, clases de envío, zonas geográficas y tipos de producto, centralizando gran parte de la lógica comercial directamente dentro del checkout.
Esta implementación permitía centralizar gran parte de la lógica comercial directamente en WooCommerce, adaptando dinámicamente el checkout según el contenido del carrito, subtotal, tipo de producto y ubicación del cliente.
Métodos de pago
Casos reales trabajados
Dentro de este bloque se agrupan distintas tareas relacionadas con pagos online, cada una con un objetivo concreto dentro del proceso de venta.
-
BBVA / Redsys TPV:
configuración del comercio en entorno de pruebas, revisión de credenciales técnicas y preparación del paso a producción.
-
Transferencia bancaria:
modificación de textos en checkout y emails para mostrar instrucciones claras al cliente.
-
PayPal con recargo:
análisis de implementación para añadir un porcentaje adicional sobre este método de pago.
-
Pago en tienda:
configuración de métodos alternativos para eventos o compras presenciales.
Checkout
Adaptación de mensajes, reglas y comportamiento
Además de los métodos de pago, también se trabajaron ajustes relacionados con el checkout y la lógica de negocio asociada al proceso de compra.
- Textos específicos para pagos por transferencia bancaria.
- Revisión de errores en la finalización del pedido.
- Validaciones y condiciones según método seleccionado.
- Comprobación de emails enviados tras el pedido.
- Ajustes en plantillas cuando el mensaje estándar no cubría la necesidad del cliente.
Emails transaccionales
Comunicación clara después de la compra
En varios casos fue necesario adaptar los emails que recibe el cliente después de realizar un pedido, especialmente cuando el método de pago requería instrucciones adicionales.
- Modificación de plantillas de email en WooCommerce.
- Instrucciones claras para adjuntar justificantes de transferencia.
- Revisión de destinatarios y recepción de notificaciones.
- Pruebas con pedidos reales o de test para comprobar el flujo completo.
Resultado
Pagos más claros, pedidos más controlados y menos incidencias
Estas integraciones permitieron adaptar el checkout a necesidades reales de negocio, mejorar la claridad de los métodos de pago disponibles y reducir problemas relacionados con pedidos, emails o datos incompletos.
A nivel técnico, este caso demuestra experiencia trabajando sobre una de las zonas más delicadas de una tienda online: el momento en el que el cliente paga, el pedido se registra y el comercio debe recibir información fiable para poder gestionarlo.
No se trata solo de configurar plugins, sino de entender el flujo completo de venta y saber intervenir cuando hay que ajustar plantillas, mensajes, validaciones o comportamiento del checkout.