WooCommerce 支付完成挂钩

Posted

技术标签:

【中文标题】WooCommerce 支付完成挂钩【英文标题】:WooCommerce payment complete hook 【发布时间】:2016-02-22 08:07:36 【问题描述】:

经过长时间的搜索,我找到了这个帖子:

WooCommerce hook for "after payment complete" actions

其中谈到在 WooCommerce 中创建网络挂钩以通知脚本执行...某事...什么都无关紧要。

我还阅读了我可以在 WooCommerce 文档中找到的所有内容。

但我需要一些文档或指导来实际编写另一端的处理程序。

我的目标是收到付款完成通知,然后在购买后将用户移动到不同的列表(客户列表而不是潜在客户列表) - 我在内部使用 phplist 作为我的列表管理器。很确定我可以处理这部分,如果我能让听众继续......

但是..我不知道网络钩子发送什么,如何让它发送我想要的数据,以及如何处理监听器。

我也发现了这个:

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

哪个 - 可能有帮助?我仍然不确定从听众那里开始,或者这篇文章是否仍然有效,因为它已经有几年历史了......

【问题讨论】:

似乎应该有一种简单的方法将 queryArgs 附加到 Woo WebHook,这样您就不必费心编写 PHP 代码来挂钩支付完成并自己发送数据。这是一个常见的用例,但是从到目前为止阅读的答案来看,如果不编写 PHP,这似乎是不可能的。 有用吗? ***.com/a/66538110/10447197 【参考方案1】:

付款完成时会触发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
    

【讨论】:

非常感谢!...我将不得不使用这些信息,看看我从哪里得到.. :) 好的,是的,现在我有几个问题......这块:'if($user)' 如果订单是客人订单(即:他们没有创建或拥有一个帐户)?我真正需要抓住的只是(现在;))是计费电子邮件,我猜是产品ID......另一个问题是......我不确定我要做什么//对用户做一些事情 - 以某种方式在请求中发送我的数据 - 但不确定这是如何完成的(你能告诉这是我的第一个 webhook 吗?:))顺便说一句 @scriptonomy requestb.in 太棒了!谢谢! :) 我不认为我会称之为 webhook,这是一个 WordPress 动作挂钩。是的,如果没有注册用户,$user 将为 false。如果您只需要账单电子邮件,您可以使用$order->billing_email。我不知道你在做什么,所以上面只是一个例子。 $order->get_items() 将为您提供一系列购买的物品。 啊谢谢 - 这很有帮助......所以我正在做的是......我在 woocommerce->settings->api 中有一个 webhook 设置 - 用于 woocommerce_payment_complete 操作 - 我希望它发送我的听众订单和产品的电子邮件地址 - 我的听众(我什至还没有收到!:))将检查该电子邮件和产品并将地址移动到 phplist 中的不同列表 - 所以人们通常会在我的潜在客户列表上,然后一旦他们购买了东西,就会被移动到客户列表中 - 所以首先我试图让 webhook 发送我想要的数据.. 我认为我们应该在这里使用$order->get_user(),而不是$this,因为get_user 是WC_Order 类的一个方法,我们不在该类中。【参考方案2】:

如果您想检查网络挂钩请求构成,我建议您前往 requestb.in 并设置一个 bin。从而允许您检查请求并制定操作处理程序。

提示:webhook 请求将请求正文中的相关信息作为 JSON 格式的数据发送。一旦你解码了身体,就很容易遍历它并提取所需的信息。

在答案的另一条腿上,我将您指向@helgatheviking 答案并使用woocommerce_payment_complete 钩子。一旦进入钩子,触发 curl POST 请求并在正文中插入任何请求处理程序依赖项。您将从$order_id 中提取这些依赖项。

【讨论】:

我在上面对@helgatheviking 说过的话 - 非常感谢!即使知道它是 JSON 也有帮助,哈哈。我会玩 - 我可能会回来问问题...... :) 你也可以使用wp_remote_post【参考方案3】:

在@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

【讨论】:

以上是关于WooCommerce 支付完成挂钩的主要内容,如果未能解决你的问题,请参考以下文章

成功付款后 woocommerce_thankyou 挂钩不起作用

Woocommerce 订阅挂钩案例

带有账户资金支付挂钩的 WooCommerce 订阅

支付网关未触发 woocommerce_payment_complete 和 woocommerce_after_checkout_validation 挂钩

在 Woocommerce 中为特定支付网关添加自定义费用

Woocommerce 订阅中的订阅频率和价格变化挂钩