I have this error in woocommerce “Gateway Disabled

2019-07-19 15:07发布

I have this error in my woocommerce web site:

Gateway Disabled: PayPal does not support your store currency.

Any one have specific solution for this?

I am using currency Saudi Riyaal(SAR) and american Dollars($).

1条回答
趁早两清
2楼-- · 2019-07-19 15:35

I have been working on this problem for few days and here are the solutions I found. In my case I need BGN, so the codes are for that currency (they can be easily adapted for other currencies).

=== Solution 1 ===

The code in this solution is for a plugin file called paypal-bgn-to-euro.php (saved as UTF-8 without BOM for the Bulgarian words) that is in a folder called paypal-bgn-to-euro. The plugin tells PayPal to support BGN. Then after the user leaves the order page and goes to the PayPal site, it converts the currency (and amount) to EUR (an actual PayPal supported currency). The exchange rate is updated automatically twice daily from a free API. The user pays in EUR but the created order in WooCommerce is still in BGN. WooCommerce detects an error (or sometimes two) in the validation because the currencies (and amounts) do not match and it puts the order on hold. The plugin then changes the status to processing for any order with an order note saying something about PayPal currencies or amounts not matching. Read the comments in the code for more info.

<?php

/*
Plugin Name: Paypal BGN support
Description: Plugin description here.
Author: Nikolay Nikolov
Version: 1.0.0
*/

/////////////////////BEGIN segment 1
//this segment I got from here and changed it a little: http://devseon.com/en/wordpress-tutorials/woocommerce-add-a-paypal-unsupported-currency
//it lies to PayPal that the BGN currency is supported, and converts it to EUR when the payment is made
//it does not change the currency in the WooCommerce order, it remains the same, and WooCommerce detects an error and it puts the order on hold
//but we fix that in segment 3

add_filter( 'woocommerce_paypal_supported_currencies', 'pbte_add_bgn_paypal_valid_currency' );

function pbte_add_bgn_paypal_valid_currency( $currencies )
{
    array_push ( $currencies , 'BGN' );
    return $currencies;
}

add_filter('woocommerce_paypal_args', 'pbte_convert_bgn_to_eur');

function pbte_convert_bgn_to_eur($paypal_args)
{
    if ( $paypal_args['currency_code'] == 'BGN')
    {
        $convert_rate = get_option('pbte_eur_to_bgn_rate'); //set the converting rate
        $paypal_args['currency_code'] = 'EUR'; //change BGN to EUR
        $i = 1;

        while (isset($paypal_args['amount_' . $i]))
        {
            $paypal_args['amount_' . $i] = round( $paypal_args['amount_' . $i] / $convert_rate, 2);
            ++$i;
        }
    }
    return $paypal_args;
}

/////////////////////END segment 1


/////////////////////BEGIN segment 2
//I made this segment so the exchange rate is updated automatically with a wordpress cron job twice daily

//runs on plugin activation
register_activation_hook( plugin_dir_path( __FILE__ )."paypal-bgn-to-euro.php", 'pbte_activate_plugin' );

//runs on plugin deactivation
register_deactivation_hook( plugin_dir_path( __FILE__ )."paypal-bgn-to-euro.php", 'pbte_deactivate_plugin' );

//when the cron job runs, we call a function to update the exchange rate option value
add_action('pbte_twicedaily_check_eur_event', 'pbte_update_eur_rate_option');

//runs on plugin activation
function pbte_activate_plugin()
{
    pbte_update_eur_rate_option();  //we update the exchange rate option

    if (!wp_next_scheduled('pbte_twicedaily_check_eur_event'))  //adds an cron job (if it is not already added) to udpate the exchange rate twice daily
        wp_schedule_event(time(), 'twicedaily', 'pbte_twicedaily_check_eur_event');
}

//runs on plugin deactivation
function pbte_deactivate_plugin()
{
    wp_clear_scheduled_hook('pbte_twicedaily_check_eur_event'); //removes the cron job we added
}

//gets the exchange rate from a free api and updates our option
function pbte_update_eur_rate_option()
{
    $data = json_decode(file_get_contents("http://api.fixer.io/latest?symbols=BGN&base=EUR")); //gets the exchange rate from a free api
    if(!empty($data->rates->BGN))
    {
        if(get_option('pbte_eur_to_bgn_rate'))
            update_option('pbte_eur_to_bgn_rate', floatval($data->rates->BGN));
        else
            add_option('pbte_eur_to_bgn_rate', floatval($data->rates->BGN)); //if the option does not exist for some reason, we create it
    }
    else //something went wrong while getting the data from the api so we will email the admin
    {
        $message = "This is a message from ".get_site_url()
        .". There is a problem getting the API data in the plugin PayPal BGN support.";
        $subject = "Problem with Paypal BGN support";
        $to_email = get_bloginfo('admin_email');
        $headers[] = 'Content-Type: text/html; charset=UTF-8';
        wp_mail($to_email, $subject, $message, $headers);
    }
}

/////////////////////END segment 2


/////////////////////BEGIN segment 3
//Since the currencies do not match, WooCommerce puts the order on hold. We fix this with this segment.

//this runs when a new note is added to the order
add_filter( 'woocommerce_new_order_note_data', 'pbte_fix_order_status', 10, 2 );

//if the note says that the PayPal currencies or amounts do not match, then we will change the status to processing
function pbte_fix_order_status($a_note, $a_order)
{
    //the check is done in two languages
    if ( strpos($a_note['comment_content'],'PayPal валутите не съвпадат') !== false
    || strpos($a_note['comment_content'],'PayPal currencies do not match') !== false
    || strpos($a_note['comment_content'],'PayPal наличността не отговаря') !== false
    || strpos($a_note['comment_content'],'PayPal amounts do not match') !== false )
    {
        //we create the order var
        $order = new WC_Order($a_order['order_id']);
        //if the current status is on-hold - we change it to processing and add an optional note
        if($order->status == 'on-hold')
            $order->update_status('processing', 'The PayPal BGN support plugin did this note.');
    }

    return $a_note;
}

/////////////////////END segment 3

?>

=== Solution 2 ===

--- Step 1 ---

You need to add this code with a small plugin or in your functions.php:

add_filter( 'woocommerce_paypal_supported_currencies', 'add_my_own_paypal_currency' );

function add_my_own_paypal_currency( $currencies )
{
    array_push ( $currencies , 'BGN' );
    return $currencies;
}

--- Step 2 ---

We convert the currency (and amount) to a supported one while the user is on the order page in our site, as he chooses the PayPal method.

So we need a different currency for different WooCommerce gateways. Which is exactly one of the features of a free plugin called Booster for WooCommerce (it has a paid version too). This feature is called Payment Gateways Currency.

When we activate the plugin and the selected feature we can choose a different currency only for PayPal and we enter there a conversion rate (for some reason it wants a comma for a separator and not a point). The paid version though is said to support automatic updates of the conversion rates (I haven't tested it).

After the payment is made, the order in WooCommerce is with the new currency now (not like Solution 1). Which might affect other plugins that you are using if they assume all orders are in the WooCommerce store currency.

=== Solution 3 ===

I haven't tested this one, but I found this paid plugin called "PAYPAL CURRENCY CONVERTER PRO FOR WOOCOMMERCE" and the author claims that it solves the problem.

查看更多
登录 后发表回答