Hooks del plugin
-
Hola
Estamos trabajando en una web que se conecta a una API y si el pago es correcto debe obtener de la API una url y almacenarla en un meta-field del pedido.
A la vuelta del TPV el cliente debe ver el enlace en la página de confirmación de pedido.¿Tiene el plugin un hook para el evento del pago OK o debemos usar los hook de WooCommerce?
Creo que sería en este caso ‘woocommerce_order_status_processing’.Muchas gracias.
-
Hola,
Por lo que entiendo debéis ponerlo en la página de agradecimiento, que es la que se muestra cuando el usuario vuelve a la web tras el pago.
Para hacerlo, solo debéis hacer lo siguiente:
function pagina_agradecimiento( $text, $order ) { if ( ! empty( $order ) ) { $order_id = $order->get_id(); $status = $order->get_status(); // Aquí debeis poner la lógica del status. Pueden haber muchos estados diferentes creados por diferentes plugins que signifiquen que no esté pagado. $texto_anadido = '<p>Añadís todo el texto que querais para el ID de pedido ' . $order_id . '</p>'; return $text . $texto_anadido; } else { return $text; } } add_filter( 'woocommerce_thankyou_order_received_text', 'pagina_agradecimiento', 20, 2 );Saludos
Ah, y si queréis utilizar hooks para el momento, son 3 hooks diferentes.
Para la parte pública,
add_action( 'woocommerce_payment_complete', $order_id );Y para la adminsitración:
add_action( 'woocommerce_order_status_processing', $order_id ); add_action( 'woocommerce_order_status_completed', $order_id );Los dos ya que se puede realizar el cambio a cualqueira de los dos estados. Debereis de alguna forma controlar si ya ha habido un cambio anterior, es decir, que se si pasa a procesando, no se vuelva a realizar la acción cuando se pase a completado. Por ejemplo mediante un meta que podría ser la misma URL que debeis conseguir mediante la API.
@jconti muchas gracias por la respuesta.
woocommerce_order_status_processing es el que sugería yo en la pregunta, lo que no tenía claro es si tu plugin creaba otro hook distinto.
La web tiene un producto único “ticket”.
A su vez hay un buscador de viajes que se conecta a una API y recibe orígenes, destinos, resultados, etc.
Cuando finalmente el cliente ha selecciona (por ejemplo) “Vigo-Oporto 01/09/2020 @ 09:00” se inyecta en el Carrito el producto ticket al cual se le modifica el nombre según el viaje elegido.
En el momento de hacer el Checkout y generarse el pedido, se envía a la API el viaje junto con el $order_id.Y es en el momento del Pago OK cuando se le confirma a la API el $order_id.
El intervalo entre ambas llamadas permite un tiempo de bloqueo de ese billete.Así que la Página de Agradecimiento es tarde.
Si por alguna razón el usuario no sale de la ventana del Redsys, por lo que sea, el billete no sería efectivo.
Pero en cambio sí está pagado, así que la API debería tener conocimiento del pago.
Creo que además los emails se envían aunque no retorne a la tienda.Así que la confirmación del pago a la API deber ser también asíncrona.
Y en ese momento recuperamos de la API las url de los billetes y la factura, que guardamos en unos meta fields del pedido $order_id.
En la Página de Agradecimiento el cliente ya los podría descargar, así como en el email que recibe o entrando en Mi Cuenta > Mis Pedidos.Saludos
Funcionó con la forma de pago Contra Reembolso pero al pagar con Redsys nos falla, parece que no llama a la API para obtener los PDF.
Haré más pruebas y te comento.Tenemos estos mensajes:
[04-Sep-2020 11:42:37 UTC] PHP Notice: Undefined index: Ds_Merchant_Identifier in D:\HTDocs\misitio\wp-content\plugins\woo-redsys-gateway-light\includes\apiRedsys7.php on line 35 [04-Sep-2020 11:42:37 UTC] PHP Notice: Undefined index: Ds_ErrorCode in D:\HTDocs\misitio\wp-content\plugins\woo-redsys-gateway-light\includes\apiRedsys7.php on line 35 [04-Sep-2020 11:42:37 UTC] PHP Notice: Undefined index: Ds_PayMethod in D:\HTDocs\misitio\wp-content\plugins\woo-redsys-gateway-light\includes\apiRedsys7.php on line 35Saludos
El plugin llama a la función específica de Woo para marcar los pedidos como pagados, y esa función dispara todos hooks necesarios.
De hecho, los hooks que os pasé son los que utilizo en el número secuencial de factura que tengo en la versión premium y funciona sin problemas
¿Estás utilizando en la parte pública este?
add_action( 'woocommerce_payment_complete', $order_id );Es el que se dispara realmente cuando Woo marca un pedido como pagado.
En cuanto a lo que os sale en los logs, lo sé. Seguramente lo arreglaré en la próxima versión. Esos errores salen en la API propia de Redsys, la que distribuye redsys para los desarrolladores, que está hecha muy bien (como puedes ver). En el premium ya lo arreglé en su día, o lo he arreglado para la próxima versión, no lo recuerdo la verdad.
Como la “otra parte” interesada en el mismo proyecto, comentar que estamos usando
woocommerce_order_status_processingQue SI funciona con los otros pagos que no son por redsys.
Usad el hook que os digo.
El contrareembolso os funciona ya que debéis marcar el pedido desde la administración, y por lo tanto es el hook
woocommerce_order_status_processingtal y como ya os dije aquí https://ww.wp.xz.cn/support/topic/hooks-del-plugin/#post-13353133¿Qué otro plugin de pago os funciona con ese hook? Seguramente en vez de utilizar la función
payment_complete()the WooCommerce (como hago yo) https://docs.woocommerce.com/document/woocommerce-order-status-control/#section-5, utiliza update_status() https://docs.woocommerce.com/document/payment-gateway-api/#section-4. Ambos funcionan, pero lo correcto es utilziar la función, como yo hago.Utilizad el hook
add_action( 'woocommerce_payment_complete', $order_id );con Redsys, y vereis que os funciona.Ok. Vamos a probarlo. Principalmente es con Redsys con quien debería funcionar. En un futuro podrían estar interesados en implementar otro tipo de pago a mayores, pero supongo que ese mismo hook funcionaría de igual forma.
Gracias :))
Si, simplemente utilizad ambos hooks y pillareis siembre el marcado como pagado, lo hagan como lo hagan, ya sea mediante la función de pago, o mediante la de cambio de estado.
Saludos
@jconti cuando hablas de parte pública y adminsitración … ¿te refieres a cambios de estado del pedido si lo lanza el cliente o es un administrador que modifica un pedido ?
Seguramente el problema sea ese woocommerce_order_status_processing nos está funcionando con el pago Contra Reembolso, que marca el pedido automáticamente como Procesando (aunque realmente no está pagado) pero con Redsys no va.
Si, todo lo que se realiza desde la administración o con la función update_status(), hay que detectarlo mediante estos dos hooks:
add_action( 'woocommerce_order_status_processing', $order_id ); add_action( 'woocommerce_order_status_completed', $order_id );Pero en el front, si se utiliza la función payment_complete() (como hago yo), no sirven esos hooks, y hay que utilizar
add_action( 'woocommerce_payment_complete', $order_id );Pues nada. Acabamos de hacer cambios y con los dos hooks activados, nos sigue funcionando para el pago por transferencia (que es lo que menos nos preocupa ya que solo lo usamos para pruebas) y por Redsys sigue sin funcionar … al menos no se nos añaden los datos que si se añaden por el otro método de pago…
function add_booking_to_checkout($order_id) { ... } add_action('woocommerce_order_status_processing', 'add_booking_to_checkout', 10, 1); add_action('woocommerce_payment_complete', 'add_booking_to_checkout', 10, 1);Y digo yo – que igual es una tontería – podría tener algo que ver la prioridad asignada a la ejecución del hook ?
Mira, aquí lo teneis.
Si el pago que debe hacer es superior a 0, utiliza update_staus(), pero si es 0, utiliza payment_complete().
Si queréis probar, cread un producto con coste 0, realizad el pago mediante contra reembolso (que no haya tampoco coste de envío ni nada, 100% gratis todo), y veréis que tampoco os funciona.
Yo lo tengo sin prioridades puesta en mi código de premium y funciona.
if ( 'yes' === get_option( 'wc_settings_tab_redsys_sort_invoices_is_active' ) ) { add_filter( 'manage_edit-shop_order_columns', 'redsys_add_invoice_number' ); add_action( 'manage_shop_order_posts_custom_column', 'redsys_add_invoice_number_value', 2 ); add_filter( 'manage_edit-shop_order_sortable_columns', 'redsys_add_invoice_number_sortable_colum' ); add_action( 'woocommerce_payment_complete', 'redsys_sort_invoice_orders' ); add_action( 'woocommerce_order_status_processing', 'redsys_sort_invoice_orders_admin' ); add_action( 'woocommerce_order_status_completed', 'redsys_sort_invoice_orders_admin' ); if ( ! is_admin() ) { add_filter( 'woocommerce_order_number', 'redsys_show_invoice_number', 10, 2 ); } }
The topic ‘Hooks del plugin’ is closed to new replies.