¿Qué función de Woocommerce se llama en la respuesta de IPN de PayPal?

2 minutos de lectura

avatar de usuario
Brian

Tengo problemas para averiguar qué función se llama cuando se completa un pago con Woocommerce y PayPal envía el IPN.

El IPN se recibe porque el archivo de registro de PayPal se actualiza tan pronto como hago clic Paypero no puedo averiguar qué función está escribiendo en ese archivo.

Necesito averiguar si ya existe una funcionalidad integrada para enviar correos electrónicos al administrador. cuando se crea una orden, y dónde esto pasa.

Si existe, necesito modificarlo para enviar correos electrónicos a otras personas también, y si no, entonces necesito crearlo yo mismo, pero necesito saber dónde colocar el código.

avatar de usuario
brasofilo

Comprobando el archivo /wp-content/plugins/woocommerce/classes/gateways/paypal/class-wc-paypal.phpvemos que hay un gancho de acción dentro de la función check_ipn_response:

if ($this->check_ipn_request_is_valid()) :

    header('HTTP/1.1 200 OK');

    do_action("valid-paypal-standard-ipn-request", $_POST);

Puedes conectarlo así:

add_action( 'valid-paypal-standard-ipn-request', 'so_12967331_ipn_response', 10, 1 );

function so_12967331_ipn_response( $formdata )
{
    // do your stuff
}

  • Me di cuenta de eso hace un tiempo, y si no recuerdo mal, es similar a lo que hice. ¡Gracias por la respuesta!

    – Brian

    03/04/2013 a las 16:46

avatar de usuario
Jibran

Sobre la base de la respuesta de @brasofilo, tuve que hacer trabajo adicional para cada producto del pedido actual.

Nota: soy nuevo en (des) serializar datos, por lo que no sé por qué tuve que eliminar las comillas dobles para obtener unserialize() trabajar. Lanzó un error, de lo contrario. Tal vez haya una mejor manera de manejar esto.

function so_12967331_ipn_response( $formdata ) {

    if ( !empty( $formdata['invoice'] ) && !empty( $formdata['custom'] ) ) {

        if( $formdata['payment_status'] == 'Completed' ) {

            if( is_serialized( $posted['custom'] ) ) {

                // backwards compatible
                // unserialize data
                $order_data = unserialize( str_replace('\"', '"', $posted['custom'] ) );
                $order_id = $order_data[0];

            } else {

                // custom data was changed to JSON at some point
                $order_data = (array)json_decode( $posted['custom'] );
                $order_id = $order_data['order_id'];

            }

            // get order
            $order = new WC_Order( $order_id );

            // got something to work with?
            if ( $order ) {

                // get user id
                $user_id = get_post_meta( $order_id, '_customer_user', true );

                // get user data
                $user = get_userdata( $user_id );

                // get order items
                $items = $order->get_items();

                // loop thru each item
                foreach( $items as $order_item_id => $item ) {

                    $product = new WC_Product( $item['product_id'] );

                    // do extra work...

                }   
            }   
        }
    }
}

¿Ha sido útil esta solución?