当使用 Woocommerce 完成付款并且 PayPal 发送 IPN 时,我无法确定调用哪个函数。
正在接收 IPN,因为一旦我单击 PayPal 日志文件就会更新Pay
,但我无法弄清楚正在写入该文件的函数是什么。
我需要弄清楚是否已经有内置功能可以在创建订单时向管理员发送电子邮件,以及发生在哪里。
如果确实存在,我也需要修改它以向其他人发送电子邮件,如果不存在,则我需要自己创建它,但我需要知道将代码放在哪里。
当使用 Woocommerce 完成付款并且 PayPal 发送 IPN 时,我无法确定调用哪个函数。
正在接收 IPN,因为一旦我单击 PayPal 日志文件就会更新Pay
,但我无法弄清楚正在写入该文件的函数是什么。
我需要弄清楚是否已经有内置功能可以在创建订单时向管理员发送电子邮件,以及发生在哪里。
如果确实存在,我也需要修改它以向其他人发送电子邮件,如果不存在,则我需要自己创建它,但我需要知道将代码放在哪里。
检查文件/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
}
基于@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...
}
}
}
}
}