En Woocommerce se tiene la funcionalidad de comisiones o costos adicionales, y de descuentos.

Se usan lo que llaman Fees, y si el valor es positivo (mayor a cero) es un costo adicional. Si el valor es negativo (menor a cero) entonces se toma como un descuento.
Por ejemplo podemos agregar un costo dependiendo del método de pago:

function udev_paypal_fee($cart){
 $order = new WC_Order( $order_id );
 // $order->get_payment_method_title() devuelve el titulo que el admin define en la configuración
 $payment_title = $order->get_payment_method_title();
 if ('PayPal' === $payment_title){
  $perc = 0.05; // 5%
  $fee = ( $cart->cart_contents_total + $cart->shipping_total ) * $perc;
  $cart->add_fee( 'Comisión adicional PayPal', $fee, true, '' );
 }
 if ('Transferencia bancaria directa' === $payment_title){
  $perc = 0.05; // 5%
  $fee = ( $cart->cart_contents_total + $cart->shipping_total ) * $perc;
  $cart->add_fee( 'Descuento Pago en efectivo', $fee*-1, true, '' );
 }
}
add_action ('woocommerce_cart_calculate_fees', 'udev_paypal_fee');

Ahora, si hay un cambio en la forma de pago, la página no se recarga, por lo que no cambiaría la comisión /descuento. Para eso debemos agregar jquery.

 add_action( 'wp_footer', 'udev_wc_add_cart_fees_by_payment_gateway_script' );
   
    function udev_wc_add_cart_fees_by_payment_gateway_script() {
        ?>
        <script>
        jQuery( function() {
            jQuery( 'body' ).on( 'change', 'input[name="payment_method"]', function() {
                jQuery( 'body' ).trigger( 'update_checkout' );
            } );
        } );
        </script>
        <?php
    }

También se tienen los cupones, es otra forma de dar descuentos, pero esa es otra historia.