Subscription renewals and resubscriptions require a precise logic to be processed correctly. To be more specific, the checkout for a renewal and a resubscription must be completed in the currency in which the original subscription was placed. Since the Currency Switcher is not aware that a checkout is referring to a renewal or a resubscription, it cannot retrieve the original subscription's currency, and it always serves the active currency associated to the customer. When such currency doesn't match the original subscription's currency, then the checkout is processed with the wrong values.
This behaviour is to be expected, as our Currency Switcher has no elements to determine if the checkout should be performed in a specific currency required by a 3rd party plugin.
How to fix the issue
There are two entities that are aware of the fact that a checkout is referring to a renewal or a resubscription:
- The Subscriptions plugin itself, which is the one starting the checkout.
- The payment plugin used to pay for the renewal or resubscription, which integrates with the Subscriptions plugin.
When a renewal payment is processed in the wrong currency, it means the payment plugin that is creating the renewal order takes the currency active at that moment, or the shop's base currency, instead of the currency in which the original order was placed. To fix the issue, the affected payment plugin has to be updated by its author, so that it takes the correct currency. You would have to contact the plugin author, explaining the issue, and he should be able to address it fairly quickly.
Below you can find some details illustrating the issue, and how to fix it, to speed things up.
Technical information for payment plugins' authors
When a renewal order is created, the currency must be retrieved from the original order by calling WC_Order::get_order_currency(). The code below shows the incorrect calls, and the correct one:
// Incorrect // Takes the currency active when the renewal request is processed. // Such currency could be any, depending on the context $renewal_currency = get_woocommerce_currency(); // Incorrect // Takes shop's base currency $renewal_currency = get_option('woocommerce_currency'); // Correct // Takes original order's currency. Any of the previous calls must be // replaced with this one throughout the payment plugin $renewal_currency = $order->get_order_currency();