Hola,
Tras la migración a Webempresa, las renovaciones automáticas de suscripciones de WooCommerce están fallando porque WordPress registra la URL del sitio como http:// en lugar de https:// en los metadatos del pago en Stripe. Cuando el webhook de Stripe vuelve, el plugin de pagos (FunnelKit Stripe) compara esa URL con la del sitio, detecta la discrepancia y descarta el evento. El pago se cobra correctamente en Stripe, pero la orden nunca se crea en WooCommerce.
Si reprogramo la renovación manualmente, funciona bien. El problema ocurre solo cuando se ejecuta de forma automática.
Entiendo que al estar detrás de Nginx/Varnish, WordPress necesita recibir la cabecera X-Forwarded-Proto para detectar HTTPS correctamente. He añadido lo siguiente en wp-config.php:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
¿Es correcto este enfoque? ¿Hay algo adicional que deba configurarse desde el servidor para que las peticiones automáticas también se detecten como HTTPS?
Gracias.
Contenido solo visible a usuarios registrados
Hola Diego.
El enfoque es el correcto y es el método recomendado oficialmente por WooCommerce y WordPress.
El problema en estos casos es que las renovaciones automáticas de WooCommerce Subscriptions se ejecutan vía WP-Cron, y esas peticiones internas a menudo no pasan por el proxy de la misma forma que las peticiones de usuarios normales.
En estos casos lo mejor que que desactives el cron de WordPress y lo actives en el servidor en lugar de depender del WP-Cron interno de wordPress.
Una vez lo tengas accede a WooCommerce -> Estado -> Herramientas y ejecuta "Actualizar base de datos de WooCommerce" y "Limpiar caché de transitorios".
Revisa si con eso se soluciona.
Un saludo
Gracias por la respuesta.
Ya tengo el WP-Cron desactivado con DISABLE_WP_CRON en true en wp-config.php y estoy usando el cron del servidor que me configuró vuestro soporte.
Mi duda es: ¿el código que comenté en mi mensaje anterior solucionaría este problema? ¿O hace falta algo más desde el lado del servidor?
Además, estoy notando que tengo suscripciones en estado "pendiente de cancelación" con fecha de finalización de hace 2 días que nunca pasan a "cancelado", y los pagos que ingresan en Stripe no generan el pedido en WooCommerce. ¿Puede estar todo relacionado con el mismo problema?
Gracias.
Hola Diego.
¿el código que comenté en mi mensaje anterior solucionaría este problema? ¿O hace falta algo más desde el lado del servidor?
No no tienes que hacer nada mas, si que es verdad que antes tenias en el archivo wp-config el código de la url de la home con la URL temporal y en http:// pero lo elimine antes ya que ese código no hace falta.
tengo suscripciones en estado "pendiente de cancelación" con fecha de finalización de hace 2 días que nunca pasan a "cancelado"
Eso depende también del cron no se cuando lo configuraste.
Lo que haría es poner esas suscripciones en cancelado y ver estos días cómo funciona el tema de las suscripciones, si vemos que se soluciono, perfecto, si vuelves a tener problemas investigaríamos a ver de dónde puede venir.
Un Saludo
Gracias por eliminar ese código con la URL temporal, puede que fuese parte del problema.
El cron del servidor se configuró el viernes pasado, así que las suscripciones que siguen en "pendiente de cancelación" deberían haber cambiado de estado desde entonces.
Voy a cancelarlas manualmente como comentas y quedo pendiente estos días para ver cómo funcionan las próximas renovaciones automáticas.
Hay algo extra que pueda aportar/hacer?
Gracias.
Hola Diego,
Por el momento no, verifica una vez transcurrido el tiempo y comprueba como se muestra los estados de las suscripciones.
Quedamos atentos como ha ido todo
Un Saludo
Hola Karen,
El problema sigue ocurriendo. Ahora mismo tengo suscripciones que muestran "próximo pago: hace 26 minutos" con el icono rojo de "retraso en pago de suscripción", es decir, el pago debería haberse procesado pero no se ejecuta. El dinero se procesa en Stripe pero en Woocommerce no se genera el pedido asociado ni cambia de estado
También sigo con el tema de las cancelaciones: hoy una suscripción pasó correctamente de "pendiente de cancelación" a "cancelada", pero otra con la misma situación no cambió de estado.
El comportamiento es inconsistente, a veces funciona y a veces no. ¿Necesitáis algo de mi parte para revisar esto? ¿Acceso, logs, capturas?
Gracias.
Que tal Diego,
Considerando que ya has aplicado lo sugerido por mis compañeros al desactivar el Cron de WP el comportamiento de las suscripciones sigue siendo irregular; debemos profundizar que puede estar sucediendo
Podemos comenzar por lo más básico, validando que tanto las tablas siteurl y home en la base tengan la URL con https://
Por otro lado, para corroborar que las peticiones no se están ejecutando directamente desde http podemos presentar el siguiente fragmento de código, añadiéndolo en el functions.php, pero preferiblemente usando un plugin como Code Snippets
add_filter('cron_request', function($cron_request) {
$cron_request['url'] = str_replace('http://', 'https://', $cron_request['url']);
return $cron_request;
});
Por último, puedes compartirnos los logs de las transacciones que se destacan por la inconsistencia, como tambien otras que sí han funcionado correctamente, para poder presentar la comparativa
Saludos!
Hola,
Gracias por las indicaciones. Aquí va la actualización:
1. Verifiqué los valores de siteurl y home en la base de datos (tabla wpa6_options) y ambos ya están correctamente en https://drcacademy.com, por lo que descartamos ese punto como causa del problema.
2. Agregué el snippet de cron_request vía Code Snippets tal como lo sugirieron, y está activo.
3. Paralelamente, el soporte de WooCommerce (ticket #11317079) también analizó el problema y confirmó el mismo diagnóstico. Su recomendación fue agregar el siguiente snippet en wp-config.php, por encima de la línea /* That's all, stop editing! */:
if ( ! isset( $_SERVER['HTTPS'] ) || 'on' !== $_SERVER['HTTPS'] ) {
$_SERVER['HTTPS'] = 'on';
}
Este fix también está aplicado y activo.
La próxima renovación automática es en las próximas horas. Una vez que se ejecute les confirmo si el problema se resolvió o comparto los logs correspondientes.
Hola Diego,
Genial quedamos atentos a como ha ido todo
Saludos!
Hola Bruno, definitivamente no ha funcionado. Mis suscripciones se quedan en próximo pago "hace 2 horas" por ejemplo y con un pequeño icono rojo que dice "retraso en el pago de suscripción". Los pagos se procesan en la pasarela pero los estados de las suscripciones no cambian ni se genera el pedido de renovación.
Ya he hecho lo recomendado por ustedes y no logro dar con la solución
Que puedo hacer al respecto? Que necesitan de mi parte para poder ayudarles?
Hola Diego.
El problema es que el plugin es de pago y nosotros no podemos probarlo te damos recomendaciones.
1. Accede al Dashboard de Stripe
.- Accede a: https://dashboard.stripe.com/
Asegúrate de estar en el modo correcto:
2. Accede a la sección de Webhooks
En el menú lateral izquierdo, haz clic en Developers (Desarrolladores).
Luego selecciona Webhooks (o “Event destinations” en la nueva interfaz Workbench).
3. Revisa los endpoints registrados
Verás una lista de todos tus webhooks configurados.
Busca el endpoint que usa FunnelKit Stripe (normalmente tiene una URL que termina en algo como /wc-api/funnelkit_stripe/ o similar).
Lo que tienes que comprobar:
La columna Endpoint URL debe empezar con https:// (no http://).
Si ves http://, ese es el problema.
4. Si está en HTTP o quieres actualizarlo:
Como usas FunnelKit Stripe, es mejor dejar que el plugin lo gestione:
Si ya existe uno en HTTP, elimínalo primero desde Stripe y luego vuelve a crearlo desde FunnelKit.
Un Saludo
Hola,
Gracias por la guía. Ya lo hemos comprobado siguiendo esos pasos y os confirmo que ese no es el problema: todos los endpoints de webhook registrados en Stripe están en https://. En concreto, en Developers → Webhooks tenemos:
- https://drcacademy.com/wp-json/fkwcs/v1/webhook (endpoint principal de FunnelKit, activo, 0% de errores)
- https://drcacademy.com/?wc-api=wc_stripe (del plugin oficial de WooCommerce)
- Dos endpoints duplicados de FunnelKit, también en https://, que vamos a eliminar como parte de la limpieza
No hay ningún endpoint en http://. Los webhooks llegan correctamente al sitio y pasan la verificación de firma sin problema.
Tras la migración a nuestro nuevo hosting, descubrimos que la copia antigua del sitio seguía ejecutando cobros automáticos de suscripciones a través de Stripe. Esto provocó cobros duplicados a varios clientes (el sitio viejo cobraba por su cuenta y el nuevo también), con el consiguiente problema económico y de confianza con nuestros alumnos.
Por nuestra parte ya hicimos lo siguiente desde el panel de Plesk
- Desactivamos el control de wp-cron.php desde WP Toolkit
- Desactivamos el plugin de Stripe (FunnelKit Stripe Gateway)
- Activamos el modo mantenimiento del sitio
Puede tener algo que ver esto mencionado?
Recuerden que las suscripciones siguen sin generar un nuevo pedido en la web, pero si ingresan los cobros en Stripe
Saludos.
Que tal Diego,
Lamento saber que lo sugerido tampoco fue una solución efectiva, realmente es un caso curioso el que estas experimentando
Vamos a tomar otro acercamiento, instala el plugin https://es.wordpress.org/plugins/wp-crontrol/
Desde este complemento vamos a poder validar el estatus de las tareas que se quedan pendiente como por ejemplo "woocommerce_scheduled_subscription_payment"
Por otro lado aspectos que me gustaría corroborar y me disculpas si parezco redundante
Desde el archivo wp-config.php tenemos definida la siguiente regla?
define('DISABLE_WP_CRON', true);
Entiendo que los compañeros de tickets te han configurado un cron job, cual es su sintaxis? ya que podriamos probar con otra, por ejemplo
*/5 * * * * curl -s "https://tudominio.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
Quedamos atentos
Saludos!
Hola Bruno, espero estes bien.
Te comparto mi cron actual
| Horario de Cron | Comando | |
|---|---|---|
|
*/10 * * * * |
/opt/alt/php84/usr/bin/php /home/drcacade/public_html/drcacademy.com/wp-cron.php > /dev/null 2>&1 |
He instalado el plugin mencionado, cual seria el proximo paso?
También adjunto imagen sobre el "DISBALE_WP_CRON"
Un saludo y quedo pendiente, muchas gracias.