如何设置Woocommerce中MercadoPago附加费不可退款且自动更新订单状态
实现方案
你当前的附加费添加逻辑可正常运行,只需追加退款拦截的钩子代码即可实现需求,以下代码直接添加到主题functions.php文件即可生效:
// 拦截MercadoPago订单退款逻辑,排除附加费 add_filter( 'woocommerce_refund_amount', 'exclude_mp_surcharge_from_refund', 10, 3 ); function exclude_mp_surcharge_from_refund( $refund_amount, $order, $max_refund ) { // 仅处理MercadoPago支付的订单 if ( $order->get_payment_method() !== 'woo-mercado-pago-basic' ) { return $refund_amount; } // 查找订单中的Tasa de Emisión附加费 $surcharge_amount = 0; foreach( $order->get_fees() as $fee ) { if ( $fee->get_name() === 'Tasa de Emisión' ) { $surcharge_amount = $fee->get_total(); break; } } // 如果是全额退款请求,扣除附加费金额 if ( $refund_amount == $max_refund && $surcharge_amount > 0 ) { $refund_amount = $refund_amount - $surcharge_amount; } return $refund_amount; } // 退款完成后自动将订单状态设置为已退款 add_action( 'woocommerce_refund_created', 'set_mp_order_refunded_status', 10, 2 ); function set_mp_order_refunded_status( $refund_id, $refund ) { $order = $refund->get_order(); if ( $order->get_payment_method() !== 'woo-mercado-pago-basic' ) { return; } // 检查剩余未退款金额是否等于附加费金额,如果是直接标记为全额退款 $surcharge_amount = 0; $fee_name = ''; foreach( $order->get_fees() as $fee ) { if ( $fee->get_name() === 'Tasa de Emisión' ) { $surcharge_amount = $fee->get_total(); $fee_name = $fee->get_name(); break; } } if ( $order->get_remaining_refund_amount() == $surcharge_amount ) { $order->set_status( 'refunded' ); $order->save(); // 添加订单备注说明附加费未退款,方便对账 $order->add_order_note( sprintf( '已自动处理全额退款,%s附加费%s未纳入退款金额', $fee_name, wc_price($surcharge_amount) ) ); } }
逻辑说明
- 自动识别使用MercadoPago支付的订单,不会影响其他支付渠道的退款规则
- 触发全额退款时自动扣除「Tasa de Emisión」附加费金额,仅退还商品及运费等其他费用
- 退款完成后自动将订单状态更新为
REFUNDED(已退款),同时自动添加订单备注说明附加费未退款 - 附加费金额直接从订单数据中读取,不需要手动写死固定数值,后续你调整附加费金额也不需要修改这段代码
测试建议
上线前建议先走测试流程验证逻辑:
- 选择MercadoPago渠道下单,确认订单中存在对应附加费
- 发起全额退款,确认退款金额为订单总额减去附加费,订单状态自动变为已退款
- 切换其他支付方式下单退款,确认规则不受影响
内容的提问来源于stack exchange,提问作者Goku SSJ
相关产品推荐
相关产品推荐

