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.

To ensure that the checkout is processed in the correct currency, both the Subscriptions plugin and the payment plugin(s) have be updated, so that they take the context (normal order, renewal, resubscription) into account.

Fix for the Subscriptions plugin
The issue of resubscriptions being processed in the wrong currency has been logged with the plugin's authors (issue #1040). We sent them a patch that shows how to address the issue. As soon as they will integrate the patch in the main plugin, you will receive it with the next update.

Fix for payment plugins

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();

You can purchase the Currency Switcher from our online shop.