Pagos Divididos Woo
Checkout dividido en 3 pasos para pago de productos y envío por separado.
by Frankie Lencería · github.com/rodogaby1985/pagos-divididos-woo
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/rodogaby1985/pagos-divididos-woo/archive/refs/heads/main.zipPlugin de WooCommerce para checkout dividido en 3 pasos para Frankie Lencería.
Instalación
- Copiar este repositorio dentro de
wp-content/plugins/pagos-divididos-woo. - Activar Pagos Divididos Woo desde el panel de administración de WordPress.
- Verificar que WooCommerce esté activo.
- Crear una página e insertar el shortcode:
[pdw_checkout_dividido]
Configuración (Admin)
Ruta: WooCommerce > Checkout dividido
- Activar/desactivar checkout dividido.
- Definir pasarela exclusiva para pago de envío (cuenta separada).
- Personalizar texto de aviso de Paso 1.
- Personalizar texto de aviso de Paso 2.
- Definir texto de contacto para casos de fallo en pago de envío.
Flujo funcional (3 pasos)
Paso 1: Pago de productos
- Captura datos del cliente.
- Crea orden de productos sin envío.
- Redirige al
order-payestándar de WooCommerce. - Se usan gateways activos de WooCommerce, excluyendo la pasarela reservada para envío.
- Mensaje por defecto:
- “Estás pagando solo PRODUCTOS. El envío se paga en el siguiente paso.”
Paso 2: Pago de envío
- Calcula métodos de envío usando dirección guardada en la orden de productos.
- Crea una orden separada solo para el cobro de envío.
- Redirige al
order-payde esa orden. - En este paso se fuerza únicamente la pasarela configurada para envío.
- Mensaje por defecto:
- “Estás pagando solo ENVÍO. Este cobro se procesa en una cuenta distinta.”
Paso 3: Resumen y confirmación
- Muestra separación de montos y estado:
- Pago productos
- Pago envío
- Confirmación final idempotente (no doble confirmación).
Reglas de negocio implementadas
- Si falla pago de productos (Paso 1), el flujo no avanza.
- Si pago de productos OK y pago de envío falla:
- Orden de productos en
on-hold. - Nota visible de coordinación con texto de contacto configurado.
- Orden de productos en
- Si ambos pagos OK:
- Orden final en
processingocompletedsegúnneeds_processing()de WooCommerce.
- Orden final en
Persistencia y seguridad
- Estado del flujo y pagos guardado como
order meta:_pdw_products_payment_status_pdw_shipping_payment_status_pdw_shipping_order_id_pdw_finalized- metadatos de envío seleccionado y monto.
- Validaciones mínimas:
- Nonces en acciones de formularios.
- Evita recrear pago de envío si existe uno pendiente.
- Evita doble confirmación final.
Supuestos técnicos
- No se usa endpoint externo.
- Paso 1 llama directamente a
process_payment()del gateway seleccionado (sin pasar pororder-pay). - Paso 2 usa pasarela específica configurable para credenciales/cuenta separada.
- El checkout estándar de WooCommerce no se modifica si el modo dividido está desactivado.
Changelog
v0.1.2 — HOTFIX URGENTE: Paso 1 no debe cerrar en order-received sin pago real
Problema reportado:
En algunos intentos del Paso 1 ("PAGAR PRODUCTOS"), el flujo terminaba en order-received
sin una aprobación de pago real, mostrando avance incorrecto.
Corrección aplicada:
- Validación estricta de respuesta en Paso 1:
- Solo se redirige cuando
process_payment($order->get_id())devuelve:is_array($result)result === 'success'redirectno vacío.
- Solo se redirige cuando
- Sin fallback a thank-you:
- No se usa fallback a
order-received. - Si el gateway devuelve redirect hacia
order-receivedpero la orden aún no está pagada, se rechaza y se informa error al usuario.
- No se usa fallback a
- UX de error explícita:
- Mensaje visible al usuario cuando falla inicio de pago:
- "No fue posible iniciar el pago de productos. Intentá nuevamente o contactá soporte."
- Mensaje explícito cuando no existe pasarela elegible para productos.
- Mensaje visible al usuario cuando falla inicio de pago:
- Logging de diagnóstico (fuente
pdw):infoal iniciar pago y registrar resumen sanitizado deprocess_payment.errorcuando se rechaza la respuesta, con motivo (sin exponer secretos).
Pruebas realizadas:
php -l pagos-divididos-woo.php- Verificación funcional manual del Paso 1:
- gateway devolviendo
resultinválido/no array - gateway sin
redirect - redirect a
order-receivedsin orden pagada (debe bloquearse) - mensaje de error visible y opción de reintento en el flujo
- gateway devolviendo
v0.1.1 — HOTFIX: Flujo Paso 1 "PAGAR PRODUCTOS" (loop silencioso)
Causa del bug:
Al crear la orden de productos, el plugin redirigía al endpoint estándar de WooCommerce
/checkout/order-pay/{order_id}/. Esa pantalla requiere que el usuario elija gateway y envíe
el formulario. Si el gateway devolvía un error o no había ninguno disponible, la página se
recargaba en silencio, generando un loop: la orden quedaba en pending payment y el usuario
no avanzaba.
Corrección aplicada:
-
Se reemplazó la redirección a
order-paypor una llamada directa aprocess_payment():- Se selecciona automáticamente el primer gateway activo en WooCommerce (excluyendo la pasarela reservada para envío).
- Se asigna el gateway a la orden (
set_payment_method) antes de procesarla. - Si
process_payment()devuelvesuccess + redirect, se redirige al usuario a la pasarela. - Si no hay gateway elegible, se muestra un error claro: "No hay método de pago configurado para productos. Por favor, contactá al administrador."
- Si
process_payment()falla o no devuelve redirect, se muestra un error accionable (sin recargar en silencio).
-
El botón "PAGAR PRODUCTOS" del estado pendiente pasa de ser un
<a>(link aorder-pay) a un formulario POST que vuelve a ejecutar el flujo de pago directo. -
Se agregan logs WooCommerce (
WooCommerce > Estado > Logs, fuentepdw) con:order_id- Gateway elegido
- Resultado de
process_payment() - URL de redirect devuelta
Habilitar logging para diagnóstico en producción
- Ir a WooCommerce > Estado > Logs.
- Filtrar por fuente:
pdw. - Los registros incluyen nivel
info(flujo normal) yerror(problemas de gateway). - Para aumentar verbosidad de WooCommerce en general, podés agregar en
wp-config.php:define( 'WC_LOG_THRESHOLD', 'debug' );(Recomendado solo en staging; deshabilitar en producción cuando no sea necesario.)