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

Posted

技术标签:

【中文标题】带有账户资金支付挂钩的 WooCommerce 订阅【英文标题】:WooCommerce Subscriptions with Account Funds payment hook 【发布时间】:2015-10-23 23:30:50 【问题描述】:

我正在运行带有订阅和帐户资金插件的 WooCommerce。

每次处理订阅付款时,我都需要向用户的个人资料中添加资金。

WooCommerce 订阅有 processed_subscription_payment 可以挂钩的操作。

Account Funds 会创建一个名为 account_funds 的用户元字段。

这是我到目前为止提出的代码,但它似乎不起作用。我正在使用 PayPal Sandbox 对其进行测试,但我认为他们现在遇到了问题。要么是那个,要么是我的代码不好。

add_action('processed_subscription_payment', 'custom_process_order', 10, 1);

function custom_process_order($order_id) 

    global $woocommerce;
    $order = new WC_Order( $order_id );

    $myuser_id = (int)$order->user_id;

    $amount = $order->get_order_total();
    $funds = get_user_meta( $myuser_id, 'account_funds', true );
    $funds = $funds ? $funds : 0;
    $funds += floatval( $amount );
    update_user_meta( $myuser_id, 'account_funds', $funds );


我正在尝试从每笔已处理的订阅付款中提取用户 ID,然后将资金添加到他们的帐户中。

这是我引用的用于帮助创建函数的 Account Funds 文件:http://pastebin.com/Teq8AXz8

这是我引用的订阅文档:http://docs.woothemes.com/document/subscriptions/develop/action-reference/

我似乎做错了什么?

【问题讨论】:

根据订阅文档$order_if 不是传递给处理钩子的两个参数之一。 哦,呵呵!它已经通过$user_id,所以我不需要通过$ordfer_id 获取用户ID。我会看看这是否有效。 @helgatheviking 我有点工作。当 $amount 设置为整数时,它将将该金额添加到 account_funds 元字段。这是一个示例:pastebin.com/u7dpk4Ct。但是,任何时候我尝试提取订单信息(我需要获取订单总额),我都会得到Fatal error: Call to a member function get_total() on a non-object。我正在尝试调用wc_get_order() 来获取订单ID,然后从中获取总数,但是它一直在拍摄该错误。我接近了吗?这是代码:pastebin.com/vHD0DWyT 请编辑您的问题,而不是链接到 pastebin。该错误意味着$order 不是对象,因此您无法在其上运行get_total()。您尝试运行wc_get_order($order_id) 但您没有订单ID。 您需要添加完整订单的总价还是订阅的价格? 【参考方案1】:

$subscription_key 是一个唯一标识符,由订阅的产品 ID 和订阅购买订单的 ID 组成。因此,您可以将该字符串拆分为 2 个有用的变量。未经测试,但请尝试以下操作:

add_action( 'processed_subscription_payment', 'custom_process_order', 10, 2 );

function custom_process_order( $user_id, $subscription_key ) 

    if( class_exists( 'WC_Account_Funds' ) )

        // split subscription key into order and product IDs
        $pieces = explode( '_', $subscription_key);
        $order_id = $pieces[0];
        $product_id = $pieces[1];

        // get order total
        $order = wc_get_order( $order_id );
        $amount = floatval( $order->get_total() );

        // alternatively get product price
        // $product = wc_get_product( $product_id );
        // $amount = $product->get_price();

        // add account funds
        WC_Account_Funds::add_funds( $user_id, $amount );
    


【讨论】:

【参考方案2】:

@helgatheviking 帮助我非常接近。唯一不起作用的是get_order_total()WC_Account_Funds::add_funds($customer_id, $amount)

这就是最终对我有用的东西:

add_action('processed_subscription_payment', 'custom_process_order', 10, 2);

function custom_process_order($user_id, $subscription_key) 

    // split subscription key into order and product IDs
    $pieces = explode( '_', $subscription_key);
    $order_id = $pieces[0];
    $product_id = $pieces[1];

    // get order total
    $order = wc_get_order( $order_id );
    $amount = $order->get_total();

    // get current user's funds
    $funds = get_user_meta( $user_id, 'account_funds', true );
    $funds = $funds ? $funds : 0;
    $funds += floatval( $amount );

    // add funds to user
    update_user_meta( $user_id, 'account_funds', $funds );


感谢@helgatheviking!

【讨论】:

如果我更好地复制和粘贴并传递正确的用户 ID,您能否测试 add_funds 是否有效?将在一分钟内编辑。 你好,我有一个非常相似的案例。上面这段代码必须放在主题的functions.php文件中吗?很难对此进行测试,因为它仅在订阅续订时触发。 @user57513 这是否适用于初始购买以及续订或仅续订。我正在尝试为初始购买和续订做这件事

以上是关于带有账户资金支付挂钩的 WooCommerce 订阅的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce 支付完成挂钩

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

Woocommerce 订单 API 订单项 ID 在更新时更改

带有 WooCommerce 扩展的 WP Webhooks Pro 不发送订单项

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

Woocommerce 订阅挂钩案例