【问题标题】:Issue with Woocommerce wc_create_refundWoocommerce wc_create_refund 的问题
【发布时间】:2018-11-19 00:51:30
【问题描述】:

我们想通过 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();
    }

}

但正如您从下面的截图中看到的那样,退款价值似乎是原来的三倍,但不知道为什么

谁能解释一下为什么会发生这种情况。

请求以带有唯一密钥标识符的 post http 请求的形式出现。例如

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

【问题讨论】:

  • 您是通过 WooCommerce 挂钩还是直接调用它?
  • @OutsourceWordPress 我通过外部发布请求直接调用它
  • 做一件事-尝试在init钩子中调用相同的脚本并确认它是否工作正常?我没有发现你的代码有什么问题。如果您需要完整的代码,请告诉我。
  • @OutsourceWordPress 正在测试
  • @OutsourceWordPress 问题仍然存在

标签: wordpress woocommerce stripe-payments


【解决方案1】:

尝试在 init 钩子中调用函数(添加到主题的“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();
        }       
    }
}

【讨论】:

  • 因不断的帮助而获奖
  • 感谢@Outsource Wordpress
【解决方案2】:

检查条件并获得最大退款金额。并确保您的代码使用静态变量只运行一次。

static $result;

$order = wc_get_order($order_id);

$max_refund = wc_format_decimal($order->get_total() - $order->get_total_refunded());
    if (!$max_refund) {
      return;
    }

if($result == null){
// Create the refund object
$refund = wc_create_refund(array('amount' => $max_refund, 'reason' => __('Order Fully Refunded', 'woocommerce'), 'order_id' => $order_id, 'line_items' => array()));
wc_delete_shop_order_transients($order_id);

} 
$result = 'code-already-run';

希望对你有帮助。

【讨论】:

  • 今天我会测试一下,让你知道
  • 我已经对此进行了测试,但它不起作用。退款本身只有一次,但退款金额仍显示三倍
猜你喜欢
  • 2018-08-02
  • 2019-10-17
  • 2019-09-03
  • 2020-07-31
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2020-03-21
相关资源
最近更新 更多