在使用Woocommerce完成付款并且PayPal发送IPN时,我在确定调用哪个函数时遇到问题。
正在收到IPN,因为我单击Pay
后会立即更新PayPal日志文件,但我无法确定写入该文件的功能。
我需要弄清楚是否已经有内置功能可以向管理员发送电子邮件 创建订单时, 会发生这种情况。
如果确实存在,我需要修改它以通过电子邮件发送给其他人,如果没有,那么我需要自己创建它,但我需要知道在哪里放置代码。
答案 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...
}
}
}
}
}