wordpress - Woocommerce wc_create_refund 问题

标签 wordpress woocommerce stripe-payments

我们想从 webhook 创建退款,但退款金额似乎是退款金额的三倍。

下面是我们的代码,它只触发一次。

$order_id = (isset($_REQUEST["order_id"]) && strlen($_REQUEST["order_id"]) > 0) ? intval($_REQUEST["order_id"]) : false;
$amount = (isset($_REQUEST["amount"]) && strlen($_REQUEST["amount"]) > 0) ? floatval($_REQUEST["amount"]) : false;
$reason = (isset($_REQUEST["reason"]) && strlen($_REQUEST["reason"]) > 0) ? $_REQUEST["reason"] : false;
if ($order_id) {
    $order = wc_get_order($order_id);
    if ($order->get_remaining_refund_amount() >= $amount) {
        $refund = wc_create_refund(array(
            'amount' => $amount,
            'reason' => $reason,
            'order_id' => $order_id,
            'refund_payment' => true
        ));
        if (is_wp_error($refund)) {
            if ($refund->get_error_message() == 'Invalid refund amount.') {

                echo 'Refund requested exceeds remaining order balance of ' . $order->get_formatted_order_total();
            } else {
                echo $refund->get_error_message();
            }
        } else {
            echo $refund->get_id();
        }
    } else {
        echo 'Refund requested exceeds remaining order balance of ' . $order->get_formatted_order_total();
    }

}

但正如您从下面的屏幕截图中看到的那样,退款金额似乎增加了三倍,但不确定原因

enter image description here

谁能阐明为什么会发生这种情况。

请求作为带有唯一 key 标识符的 post http 请求传入。例如

https://example.com/process-refunds/?key=ff5f61b5a9d6ff2a5d7fb9fc815113d4&order_id=1234&amount=100&reason=Testing

最佳答案

尝试调用 init 钩子(Hook)中的函数(添加到主题的“functions.php”),这对我来说效果很好。

add_action( 'init', 'wc_manual_refund' );

function wc_manual_refund()
{
    $order_id = (isset($_REQUEST["order_id"]) && strlen($_REQUEST["order_id"]) > 0) ? intval($_REQUEST["order_id"]) : false;
    $amount = (isset($_REQUEST["amount"]) && strlen($_REQUEST["amount"]) > 0) ? floatval($_REQUEST["amount"]) : false;
    $reason = (isset($_REQUEST["reason"]) && strlen($_REQUEST["reason"]) > 0) ? $_REQUEST["reason"] : false;

    if ($order_id) {
        $order = wc_get_order($order_id);

        if ($order->get_remaining_refund_amount() >= $amount) {
            $refund = wc_create_refund(array(
                'amount' => $amount,
                'reason' => $reason,
                'order_id' => $order_id,
                'refund_payment' => true
            ));
            if (is_wp_error($refund)) {
                if ($refund->get_error_message() == 'Invalid refund amount.') {
                    echo 'Refund requested exceeds remaining order balance of ' . $order->get_formatted_order_total();
                } else {
                    echo $refund->get_error_message();
                }
            } else {
                echo $refund->get_id();
            }
        } else {
            echo 'Refund requested exceeds remaining order balance of ' . $order->get_formatted_order_total();
        }       
    }
}

关于wordpress - Woocommerce wc_create_refund 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50769467/

相关文章:

php - 避免在 WooCommerce 结账时进行计费电话验证

php - 向 woocommerce_email_customer_details 或电子邮件的任何其他部分添加一个新字段

javascript - 编辑 woocommerce Assets 的正确方法是什么?

javascript - Stripe 元素 : how can I validate a card element is not blank client-side?

javascript - Stripe/node.js : how retrieve stripe subscription safely + increment 1

ruby-on-rails - 用于 rails 4 的 Stripe webhooks

javascript - 如何在移动版wordpress上启用swf文件自动播放

php - NGINX + Wordpress 给出 ERR_TOO_MANY_REDIRECTS

WordPress 在 Azure 上运行缓慢

php - 通过 WooCommerce 结账中的单选按钮添加额外的包装选项