Yes, sadly you can't do negative Additional Fees out of the box. Even
Payment Director does not handle this currently, but I will look into in for a future release.
Also, it's not just PaymentService - GetAdditionalHandlingFee that prevents negative fee:
if (result < decimal.Zero)
result = decimal.Zero;
So does the CheckoutController - it only shows the fee if greater than zero:
\Presentation\Nop.Web\Controllers\CheckoutController.cs
PreparePaymentMethodModel()
...
if (rate > decimal.Zero)
pmModel.Fee = _priceFormatter.FormatPaymentMethodAdditionalFee(rate, true);
Ideally this should change to
if (rate != decimal.Zero)
Also...
Currency amounts are formatted. They can be overridden with a custom format:
Admin > Currency - Custom formatting: $0.00
But, the default formatting for en-US, unless you use custom, is that negatives are in parenthesis; and since the additional fee is also displayed wrapped in parens it would look funny: e.g. Cash On Delivery (COD) ( ($2.34) )
Ideally, the parens "( )" around the fee would change to (maybe) brackets " [ ] " so there would be no confusion with the parens for negative numbers.
Payment Director does allow for calculation of the payment Name shown to customers - i.e. it could show the % as part of that name - (and currently it will also show the amount - which personally I think should always show - more friendly for the customer)
e.g. Cash On Delivery (COD)
2.5% Fee ( $2.34 )
I think you need to use an Action Filter if you want to implement this yourself.