Caso de estudio

Integraciones y métodos de pago en eCommerce

Caso de estudio basado en tareas reales de integración, configuración y adaptación de métodos de pago en tiendas WordPress, WooCommerce y PrestaShop.

En estos proyectos trabajé sobre partes críticas del proceso de compra: configuración de TPV bancarios, adaptación de mensajes del checkout, pruebas de pedido, emails transaccionales y resolución de incidencias relacionadas con pagos y datos del pedido.

El objetivo no era únicamente “activar un módulo”, sino comprobar que el flujo completo funcionara correctamente: selección del método de pago, finalización del pedido, generación de emails, recepción de datos por parte del comercio y comportamiento correcto en producción.

Pagos online Checkout TPV bancario Pedidos reales Producción
TPV configuración y pruebas de Redsys / BBVA
Redsys validación del método y pruebas de compatibilidad
Checkout adaptación de reglas, textos y comportamiento de compra
Emails ajustes en mensajes transaccionales y datos del pedido

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.

Proceso

Cómo se abordaban las integraciones

01

Análisis del método de pago

Se revisaba qué módulo o sistema estaba instalado, qué credenciales necesitaba y cómo debía encajar dentro del flujo actual de la tienda.

02

Configuración técnica

Se configuraban datos como comercio, terminal, moneda, entorno de pruebas, claves o parámetros necesarios, evitando exponer información sensible en documentación pública.

03

Pruebas de compra

Se realizaban pedidos de prueba para comprobar que el cliente podía avanzar por el checkout, seleccionar el método de pago y finalizar el proceso correctamente.

04

Validación de emails y pedidos

Se comprobaba que el pedido quedara registrado con la información correcta y que tanto el cliente como el comercio recibieran las notificaciones necesarias.

05

Ajustes de checkout y plantillas

Cuando el comportamiento estándar no era suficiente, se modificaban textos, plantillas o lógica asociada al proceso de compra.

06

Documentación y entrega

Se documentaban los cambios realizados, los puntos pendientes y las pruebas necesarias para facilitar futuras revisiones o pasos a producción.

Fortalezas

Qué demuestra este bloque

  • Experiencia trabajando en partes críticas de eCommerce.
  • Capacidad para configurar e interpretar métodos de pago reales.
  • Conocimiento práctico de WooCommerce y PrestaShop.
  • Resolución de incidencias relacionadas con pedidos y emails.
  • Adaptación de checkout a necesidades concretas de negocio.
  • Criterio para probar cambios antes de dejarlos en producción.
  • Capacidad para documentar procesos técnicos de forma comprensible.

Precauciones

Aspectos críticos en pagos online

  • No exponer claves, terminales ni datos sensibles en capturas públicas.
  • Separar claramente entorno de pruebas y entorno real.
  • Verificar que los emails lleguen correctamente antes de cerrar la tarea.
  • Probar distintos escenarios de pedido, transporte y método de pago.
  • Documentar cualquier dependencia externa, como bancos o pasarelas.
  • Evitar cambios directos en producción sin comprobar el impacto sobre ventas.

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.

Galería

Evidencias visuales recomendadas

Aquí puedes añadir capturas censuradas del checkout, configuración del método de pago, pedido de prueba, email transaccional y panel del TPV. Es importante ocultar claves, códigos de comercio, emails privados o cualquier dato sensible.

Contacto

¿Quieres ver más proyectos o hablar de un desarrollo similar?

Puedo enseñarte más casos de WordPress, PrestaShop, automatización, scraping, checkout o integraciones a medida.