WooCommerce付款完成挂钩

50
经过长时间的搜索,我找到了这篇文章:

WooCommerce hook for "after payment complete" actions

,讨论了如何在WooCommerce中创建Web Hooks以通知脚本执行某些操作,无论是什么操作都不太重要。我还阅读了WooCommerce文档中所有可以找到的内容,但我需要一些关于实际编写处理程序的文档或指导。我的目标是接收支付完成通知,然后将用户移动到另一个列表(客户列表而不是前景列表) - 我在内部使用PHPlist作为我的列表管理器。如果我能让侦听器启动,我相当确定我可以解决那部分。但是...我不知道Web Hook发送什么,如何使其发送我想要的数据以及如何处理侦听器。我还发现了这个:

https://wordpress.org/support/topic/plugin-woocommerce-excelling-ecommerce-order-id-for-payment-notification-to-external-webservice?replies=4

,这可能有帮助?我仍然不确定从哪里开始设置侦听器,或者由于它已经过了几年,这篇文章是否仍然有效...

似乎应该有一种简单的方法将查询参数附加到Woo WebHook上,这样您就不必费心编写PHP代码来挂钩付款完成并自己发送数据。 这是一个常见的用例,然而从迄今为止的答案中得知,似乎无法在不编写PHP的情况下实现。 - Danger
这有用吗?https://dev59.com/zF4c5IYBdhLWcg3wLXvI#66538110 - Vincenzo Di Gaetano
3个回答

81

woocommerce_payment_complete 钩子在支付完成时被触发。该钩子只传递订单ID变量,但是你可以从中获取订单对象,并最终获取到用户。

add_action( 'woocommerce_payment_complete', 'so_payment_complete' );
function so_payment_complete( $order_id ){
    $order = wc_get_order( $order_id );
    $user = $order->get_user();
    if( $user ){
        // do something with the user
    }
}

非常感谢!我得试着运用这些信息,看看能得到什么结果.. :) - Aaron Trumm
1
我不认为这应该被称为 webhook,而是 WordPress 的 action hook。是的,如果没有已注册用户,则 $user 将为 false。如果您只需要账单电子邮件,可以使用 $order->billing_email。由于我不确定您的具体操作,因此上述仅为示例。$order->get_items() 可以为您获取购买物品的数组。 - helgatheviking
啊,谢谢 - 这很有帮助...所以我正在做的是...我在 WooCommerce->设置->API 中设置了一个 Webhook,用于 woocommerce_payment_complete 操作 - 我希望它将订单的电子邮件地址和产品发送给我的监听器 - 我的监听器(我甚至还没有开始写!:))将检查该电子邮件和产品,并将地址移动到 phplist 中的不同列表中 - 所以人们通常会在我的潜在客户列表上,一旦他们购买了东西,就会被移到客户列表上 - 所以首先我正在尝试让 Webhook 发送我想要的数据... - Aaron Trumm
谢谢讨论。是的,我已经按照您的代码(当然还加了一些东西)发送了我想要的方式,并完全关闭了“Webhook”。Webhook本身只是以JSON格式发送订单ID,我不知道这有什么用,但我想这并不重要。我仍然需要编写处理程序/监听器——但这只是解析JSON并执行操作的问题——我将在答案中发布我用于操作钩子的代码,供其他人参考 :) - Aaron Trumm
1
我相信我们应该在这里使用$order->get_user(),而不是$this,因为get_user是WC_Order类的一个方法,而我们不在该类中。 - plushyObject
显示剩余2条评论

17

在@helgatheviking和@Scriptonomy的帮助下,我确定了这段代码,而且在woocommerce->settings->api->webhooks中没有启用任何webhook:

add_action( 'woocommerce_payment_complete', 'so_payment_complete' );
function so_payment_complete( $order_id ){  
  $order = wc_get_order( $order_id );
  $billingEmail = $order->billing_email;
  $products = $order->get_items();

foreach($products as $prod){
  $items[$prod['product_id']] = $prod['name'];
}

$url = 'http://requestb.in/15gbo981';
// post to the request somehow
wp_remote_post( $url, array(
 'method' => 'POST',
 'timeout' => 45,
 'redirection' => 5,
 'httpversion' => '1.0',
 'blocking' => true,
 'headers' => array(),
 'body' => array( 'billingemail' => $billingEmail, 'items' => $items ),
 'cookies' => array()
 )
);

现在我只需要编写监听器 :) 这是被发送的请求正文(我可以在 requestb.in 上看到):

billingemail=%22aaron-buyer%40thirdoptionmusic.com%22&items%5B78%5D=Cult+Of+Nice&items%5B126%5D=Still&items%5B125%5D=The+Monkey+Set

2
如果您希望检查 Webhook 请求的构成,我建议您前往 requestb.in 并设置一个 bin。这样可以让您检查请求并制定操作处理程序。
提示:Webhook 请求会将相关信息作为 JSON 格式数据发送到请求体中。一旦解码了请求体,就很容易遍历它并提取所需信息。
在另一个方面的答案中,我向您指出 @helgatheviking 的答案并使用 woocommerce_payment_complete 钩子。进入钩子后,触发 curl POST 请求并在请求体中插入任何请求处理程序依赖项。您将从 $order_id 中提取这些依赖项。

我对@helgatheviking说的话也适用于你 - 非常感谢!即使知道它是JSON也有帮助。我会试着玩一下 - 如果有问题可能还会回来问... :) - Aaron Trumm
您也可以使用 wp_remote_post - helgatheviking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接