2012-10-19 40 views
4

我在搞清楚當付款完成與Woocommerce和PayPal發送IPN什麼函數被調用的一個問題。什麼Woocommerce函數被調用在PayPal IPN反應?

由於PayPal日誌文件在我點擊Pay後立即被更新,因此我收到了IPN,但我無法弄清楚寫入該文件的函數。

我需要弄清楚,如果已經有一個內置的功能,當創建訂單發送電子郵件給管理員,並其中發生這種情況。

如果它確實存在,我需要修改其電子郵件其他人也一樣,如果沒有的話,我需要創建它自己,但我需要知道在哪裏可以把代碼。

回答

10

檢查文件/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

我曾經想過一段時間以前,如果我沒記錯的話,那和我所做的相似。感謝您的迴應! – Brian

4

大廈@ brasofilo的回答,我必須爲每個產品當前定單做額外的工作。

注意:我是(un)序列化數據的新手,所以我不知道爲什麼我不得不使用雙引號使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... 

       } 
      } 
     } 
    } 
}