Buenas, llevo unos días en los que al pagar correctamente los clientes, los pedidos se quedan en pendiente de pago y posteriormente se cancelan, por lo que tengo que completarlos manualmente.
He abierto un ticket de soporte y no han dado con la solución. Parece que no es nada referente al servidor: "A nivel servidor no se aplica ningún tipo de medida de seguridad para este tipo de comunicaciones, las cuales compruebo que se realizan correctamente" "Veo que en la plataforma de la TPV también aparece bien la ejecución de la petición y sin ningún tipo de error, está funcionando como debería."
Da igual el método de pago que utilice los clientes (redsys, stripe, bizum), el pago se realiza pero queda pendiente de pago/cancelado.
No he realizado ningún cambio de configuraciones últimamente.
Tengo el plugin Redsys de José Conti y el plugin oficial de stripe que siempre me ha funcionado.
Un saludo y muchísimas gracias.
Contenido solo visible a usuarios registrados
Hola Victor,
En este caso envíanos una captura de la nota que se marca en un pedido cuando se procesa, de esta forma podemos verificarlo con mayor detalle.
De manera general ten en WooCommerce las ordenes no se completan de forma automática, sino que es el administrador es quien debe marcarlos como completados. Sin embargo, existen diferentes formas para marcar el pedido de en espera ha completado automáticamente, una opción es usar algún plugin como -> https://wordpress.org/plugins/autocomplete-woocommerce-orders/
Solo debes configurar las opciones sobre que tipo de pedidos deseas se completen,
Por otro lado también puedes añadir un código en el function.php de tu tema (Preferiblemente un tema hijo) que te permita autocompletar de forma automática los pedidos, puedes verificar más detalles sobre estas configuraciones en el siguiente enlace -> https://www.webempresa.com/blog/cambiar-estado-del-pedido-en-woocommerce-automaticamente.html
Verifica esto y nos comentas como ha ido todo
Un Saludo
@karen Buenas, gracias por responder.
Tengo instalado el plugin de Autocomplete WooCommerce Orders -> Configurado para autocompletar productos digitales.
Nunca había tenido problemas de este tipo hasta hace 2 semanas, que se ha dejado de completar. Aun así, debería de quedarse en procesando, pero no, se queda pendiente de pago/cancelado.
Te adjunto captura de las notas del pedido.
Un saludo.
Hola Victor,
En este caso es posible que el plugin esté generando un error, prueba añadir el código en function.php de tu tema y comprobar si al hacer esto se completa de forma correcta una orden.
Por otro lado también puedes añadir un código en el function.php de tu tema (Preferiblemente un tema hijo) que te permita autocompletar de forma automática los pedidos, puedes verificar más detalles sobre estas configuraciones en el siguiente enlace -> https://www.webempresa.com/blog/cambiar-estado-del-pedido-en-woocommerce-automaticamente.html
Verifica esto y nos comentas como ha ido todo
Un Saludo
Buenas de nuevo y gracias por la respuesta @karen
Estamos probando quitando el plugin y activando el código del tutorial y parece que va bien, excepto que completa todos los pedidos (incluido los productos físicos que necesito que se queden procesando).
¿existe alguna modificación del código para autocompletar los productos virtuales y dejar en procesando los productos físicos?
Un saludo.
Hola Victor.
Puedes modificar el estado el en que quieres que se queden, por ejemplo, si quieres que se queden procesando:
// Actualiza automáticamente el estado de los pedidos a procesando
add_action( 'woocommerce_order_status_processing', 'actualiza_estado_pedidos_a_completado' );
add_action( 'woocommerce_order_status_on-hold', 'actualiza_estado_pedidos_a_completado' );
function actualiza_estado_pedidos_a_completado( $order_id ) {
global $woocommerce;
//ID's de las pasarelas de pago a las que afecta
$paymentMethods = array( 'redsys', 'bacs', 'cheque', 'cod', 'paypal' );
if ( !$order_id ) return;
$order = new WC_Order( $order_id );
if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( 'processing' );
}
Solo modificamos la linea " $order->update_status( 'processing' ); " indicando el estado en el que se quedar el pedido, en este caso Procesando.
Puedes poner el estado que quieras:
Para los productos virtuales puedes utilizar lo siguiente:
add_action('woocommerce_thankyou', 'we_autocomplete_virtual_orders', 10, 1 );
function we_autocomplete_virtual_orders( $order_id ) {
if( ! $order_id ) return;
// Get order
$order = wc_get_order( $order_id );
// get order items = each product in the order
$items = $order->get_items();
// Set variable
$only_virtual = true;
foreach ( $items as $item ) {
// Get product id
$product = wc_get_product( $item['product_id'] );
// Is virtual
$is_virtual = $product->is_virtual();
// Is_downloadable
$is_downloadable = $product->is_downloadable();
if ( ! $is_virtual && ! $is_downloadable ) {
$only_virtual = false;
}
}
// true
if ( $only_virtual ) {
$order->update_status( 'completed' );
}
}
Lo mismo que el anterior, si quieres que el producto se quede en otro estado solo tienes que modificar la linea " $order->update_status( 'completed' ); "
Un saludo
@pepesoler muy buenas y gracias por la respuesta.
He creado un fragmento de código con cada código que has enviado de esta manera, pero aún no funciona bien del todo, se me ha quedado "pendiente de pago" en vez de procesando un producto físico.
Quiero que los productos físicos se queden "Procesando" y los productos virtuales en "Completado".
Adjunto captura del orden de los fragmentos (he copiado tal cual el código).
No sé si hay que hacerlo de esta manera o en un solo fragmento, o cambiando el orden...
Un saludo.
Hola Victor.
Con el código que te indique los productos físicos se quedan en procesando:
$order->update_status( 'processing' );
un producto físico
Solo es un producto o son todos lso productos físicos ?
No me queda claro si solo es un producto o son todos
Un saludo
Muy buenas y gracias @pepesoler
En la web tengo productos físicos y también productos digitales.
Quiero que cuando haya un producto físico en el pedido, se quede "procesando".
Si hay un producto físico y también un producto virtual, se quede "procesando".
Si solamente hay productos virtuales en el pedido, que se quede "completado".
Muchas gracias por la ayuda.
Hola Victor,
En WooCommerce los productos de tipo virtual se autocompletan de forma automáticamente, pero si usas el código de autocompletados todos pasaran a completados, en este caso si solo deseas que sean los productos virtuales se completen no necesitas añadir ningún código, prueba desactivar los códigos que usas y revisar que tus productos virtuales este de este tipo, luego comprueba si al procesar una orden de estos se complementen automáticamente.
Ten en cuenta que si lo que buscas es que ciertos tipos de productos se completen y otros no es posible necesites un código a la medida, en este caso puedes consultar con nuestro directorio de claboradores quienes puede ayudarte a configurar todo lo que necesitas.
Un Saludo
Buenas @pepesoler soy Luis, el desarrollador web de covicar.net.
Necesito saber por qué estoy teniendo el mismo problema, pero en vez de en completado lo quiero en procesado tal cual sale en tu código, principalmente para cuando mi cliente se asegure de que el ingreso en la cuenta se realiza ellos poner que está completado el pedido. Mi cliente si visitas su web, además solo usa productos físicos ninguno virtual.
El código que expone me pueda solucionar la papeleta:
// Actualiza automáticamente el estado de los pedidos a procesando
add_action( 'woocommerce_order_status_processing', 'actualiza_estado_pedidos_a_completado' );
add_action( 'woocommerce_order_status_on-hold', 'actualiza_estado_pedidos_a_completado' );
function actualiza_estado_pedidos_a_completado( $order_id ) {
global $woocommerce;//ID's de las pasarelas de pago a las que afecta
$paymentMethods = array( 'redsys', 'bacs', 'cheque', 'cod', 'paypal' );if ( !$order_id ) return;
$order = new WC_Order( $order_id );if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( 'processing' );
}
Lo único que no se es que en la línea 8 del código, cuál es el ID que debo poner de la pasarela que estoy utilizando, que se llama Cecabank:
$paymentMethods = array( 'redsys', 'bacs', 'cheque', 'cod', 'paypal' );
Según he investigado previamente antes de poder acceder al foro, he utilizado perplexity para intentar resolver la consulta:
"Para encontrar el ID de la pasarela de pago que estás utilizando, en este caso Cecabank, debes ir a "WooCommerce > Ajustes > Finalizar compra > Opciones de pago". Al final de la página, verás todas las pasarelas habilitadas y sus respectivos IDs."
Cosa que hice, pero no llegue a encontrar, pero bueno, aun así me brindo otro resultado:
"En el caso de Cecabank, el ID de la pasarela de pago parece ser 'wc_gateway_ceca' según la documentación en GitHub. Por lo tanto, deberías agregar 'wc_gateway_ceca' a la lista de métodos de pago en la línea 8 de tu código. El código quedaría de la siguiente manera:"
$paymentMethods = array( 'redsys', 'bacs', 'cheque', 'cod', 'paypal', 'wc_gateway_ceca' );
Por último, solo quiero que se mantengan en procesando los métodos de pago que son:
—Redsys(inactivo)
—Paypal(inactivo)
—Stripe(inactivo/temporalmente)
—Cecabank(activo)
El resto de maneras de pago que efectúen la acción que tengan que realizar como si se tienen que poner en “en espera” pero que notifique a mi cliente de que se hizo una compra por parte de WooCommerce y a los clientes de mis clientes que se les notifique que se realizó la compra:
—Transferencia Bancaria(activo)
—Pago con cheque(inactivo)
—Contra reembolso(inactivo)
Este fue el resultado que me brindo la IA al preguntarle
"Para eliminar los métodos de pago de transferencia bancaria (bacs), pago por cheque (cheque) y contra reembolso (cod) del código que actualiza automáticamente el estado de los pedidos a procesando en WooCommerce, debes modificar el array
$paymentMethods
en tu código."
"Actualmente, tu código incluye estos métodos de pago:"
$paymentMethods = array( 'redsys', 'bacs', 'cheque', 'cod', 'paypal', 'wc_gateway_ceca' );
"Para eliminar los métodos de pago de transferencia bancaria, pago por cheque y contra reembolso, debes eliminar 'bacs', 'cheque' y 'cod' del array. Ademas para agregar los métodos de pago de Cecabank y Stripe, debes agregar 'wc_gateway_ceca' y 'stripe' al array."
"Tu código modificado se vería así:"
$paymentMethods = array( 'redsys', 'paypal', 'wc_gateway_ceca', 'stripe' );
Bien, entonces mis preguntas son:
¿El código que has expuesto es correcto?
¿Los cambios ejecutados por la IA son correctos?
¿Son realmente esos los ID de los métodos de pago qué yo necesito?
Gracias por su atención
Un cordial saludo
Hola Miguel
Por favor abre un nuevo tema con tu usuario, al seguir una consulta de otro usuario no podemos realizar las comprobaciones que necesitas en tu cuenta, de esta forma mantenemos un orden en el Foro y nos ayudas a nosotros en el trabajo, aparte te resultará más fácilmente encontrar las consultas de un tema si lo necesitas más adelante.
Puedes crear la consulta en esta URL:
-> https://www.webempresa.com/foro/preguntas-sobre-wordpress
Un Saludo