什么Woocommerce功能被称为PayPal IPN响应?

时间:2012-10-19 04:18:33

标签: wordpress paypal-ipn woocommerce

在使用Woocommerce完成付款并且PayPal发送IPN时,我在确定调用哪个函数时遇到问题。

正在收到IPN,因为我单击Pay后会立即更新PayPal日志文件,但我无法确定写入该文件的功能。

我需要弄清楚是否已经有内置功能可以向管理员发送电子邮件 创建订单时, 会发生这种情况。

如果确实存在,我需要修改它以通过电子邮件发送给其他人,如果没有,那么我需要自己创建它,但我需要知道在哪里放置代码。

2 个答案:

答案 0 :(得分:11)

检查文件/wp-content/plugins/woocommerce/classes/gateways/paypal/class-wc-paypal.php,我们发现函数check_ipn_response中有一个动作挂钩:

if ($this->check_ipn_request_is_valid()) :

    header('HTTP/1.1 200 OK');

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

你可以像这样挂钩:

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

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

答案 1 :(得分:5)

在@ brasofilo的回答基础上,我不得不针对当前订单为每种产品做额外的工作。

注意:我是(联合国)序列化数据的新手,所以我不知道为什么我不得不使用双引号来让unserialize()工作。否则,它会抛出错误。也许有更好的方法来解决这个问题。

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...

                }   
            }   
        }
    }
}