WooCommerce钩子用于“付款完成后”操作

48

我正在使用WooCommerce和WordPress。 我有一个自定义的许可证密钥生成器,当有人通过WooCommerce成功购买我的插件时,我希望它能够生成一个许可证密钥。

这似乎非常简单:

  1. 用户在我的网站上完成结算
  2. 用户被重定向到Paypal,在那里他们输入付款凭据
  3. Paypal告诉我的网站付款已完成
  4. 我挂钩到某种“付款完成”或“order_complete” WooCommerce操作并生成许可证。

问题在于:我真的不确定哪个钩子对此效果最佳。 Woocommerce在其网站上列出了他们的完整钩子集合,但实际上没有关于哪个适用于什么的文档。

仅根据钩子名称,我认为woocommerce_payment_complete是一个不错的操作。不幸的是,它似乎根本没有被触发;我读过的一些地方说它永远不会被触发。

我也读到了一些关于PayPal IPN的内容,但我不明白如何从中挂入通知(这是否连接到WooCommerce挂钩?)

简而言之,我希望在付款得到验证后立即生成许可证密钥。 为了实现这一目标,我需要连接到什么内容?

3个回答

31

好的,我想到了几种可能的解决方案。

处理付款验证

WooCommerce的Paypal标准网关实际上已经内置了对Paypal IPN服务的支持。无论您选择哪种“钩子”路线,都应该使用它。

如何设置Paypal IPN

Paypal IPN连接到接收款项的帐户。例如,如果您在myemail@gmail.com上收到付款,则需要使用该帐户设置IPN。所有IPN都是Paypal向您选择的URL发送“付款完成!”(或类似的)通知。为了选择您希望Paypal发送通知的URL,您需要执行以下步骤:

  1. 登录Paypal
  2. 点击右上角的小脸图标
  3. 点击“个人资料和设置”
  4. 在左侧边栏中点击“我的销售工具”
  5. 找到“即时付款通知”,然后点击“更新”
  6. 启用并设置网址。您的WooCommerce Paypal支付标准网关网址是:http://yoursite.com/?wc-api=WC_Gateway_Paypal(在WooCommerce的Paypal标准文档中有注明)。
  7. 保存您的设置

现在,当付款完成时,您的WooCommerce安装将从Paypal收到通知。哦,顺便提一下,请确保:

  • 您在Paypal设置中的“接收方电子邮件”是正确的
  • fsockopen在您的服务器上已启用(您可以在WooCommerce设置的“系统状态”中检查此项)

现在让我们开始钩子的工作吧

选项1:自动完成已支付的订单并钩入woocommerce_order_status_completed以进行特殊操作/功能

为了在验证付款后使您的产品自动完成,您可以简单地安装Mirko Grewing的出色的WooCommerce Autocomplete Order插件。请确保设置正确的设置(这将显示在您的WooCommerce设置的“Woo Extra Options”选项卡下)。

现在,当付款得到验证时,您的订单正在自动完成,您可以简单地钩入您的完成钩子`woocommerce_order_status_completed`,以获得您的特殊功能。

该方法的好处是,它允许您钩入任何已完成的订单-无论您是否手动完成它或它是自动完成的。换句话说,它非常灵活。

选项2:钩入woocommerce_payment_complete_order_status过滤器,表示成功付款。

我想那个很容易理解。这种方法的好处是,它基本上是整个过程的第一步,并且在上面的完成钩子之前发生(如果您的优先级设置正确)。

我不知道哪个比另一个更好,但它们似乎都能实现我的目标:在付款验证后执行操作。


Pete,你从这个钩子里获取到OrderID了吗?我没有得到任何数据。发布的内容是{"action":"woocommerce_payment_complete_order_status","arg":"processing"}。 - Pon Saravanan
3
@PonSaravanan说:woocommerce_payment_complete_order_status过滤器接受两个参数,第一个是订单状态,第二个是订单 ID。或者,您可以使用woocommerce_payment_complete操作,它只提供订单 ID。 - Matt van Andel
对Paypal的依赖意味着任何其他支付方式都不会生成许可证,这非常有限。此外,对另一个插件的依赖会导致额外的可能故障点。为什么不只使用基本的woocommerce hook woocommerce_payment_complete呢?这样,如果您需要手动批准付款(例如电汇或现金),您的系统仍将正常工作。请参见:https://dev59.com/flsX5IYBdhLWcg3wcPEF#33821379 - jeffmcneill
嗯...这与Paypal无关。 :-) 这只是查看订单何时接收到“完成”订单状态。这意味着它也适用于手动完成的订单(我的帖子中甚至有一行说:“该方法的好处是,如果允许您挂钩任何已完成的订单-无论您是否手动完成它或自动完成它”)。额外的自动完成插件只是消除了在收到付款时手动完成订单的步骤。 - Pete

20

woocommerce_payment_complete_order_status 当支付被取消时也会触发。我刚刚在Woocommerce 3.1.2上使用Paypal作为网关进行了测试。

woocommerce_payment_complete动作似乎只有在付款成功时才会触发。


1
这个已经确认了吗?还是只有在失败状态下才会触发? - DropHit

4

woocommerce_payment_complete钩子仅在具有以下状态之一的订单被激活时才会被触发:

  • on-hold(等待中)
  • pending(待处理中)
  • failed(失败)
  • canceled(取消)

HOOK: woocommerce_valid_order_statuses_for_payment_complete

如果你想在付款完成之前更改订单状态(例如,在订单创建后但尚未付款之前使用woocommerce_new_order钩子),则应通过woocommerce_valid_order_statuses_for_payment_complete钩子添加新的状态。

例如:

add_filter( 'woocommerce_valid_order_statuses_for_payment_complete', 'add_woocommerce_valid_order_statuses_for_payment_complete', 10, 2 );
function add_woocommerce_valid_order_statuses_for_payment_complete( $statuses, $order ) {
    $statuses[] = 'processing';
    return $statuses;
}

钩子: woocommerce_pre_payment_complete

另外,您可以使用woocommerce_pre_payment_complete钩子,在订单保存之前,当付款已经完成时激活该钩子(与在保存订单后激活的woocommerce_payment_complete不同)

woocommerce_pre_payment_complete钩子始终会在完成付款后激活,无论订单状态如何。


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