我在 woocommerce 中遇到此错误“网关已禁用:PayPal 不支持您的商店货币”

Ume*_*kat 2 wordpress paypal woocommerce

我的 woocommerce 网站中出现此错误:

网关已禁用:PayPal 不支持您的商店货币。

有人对此有具体的解决方案吗?

我使用货币沙特里亚尔 (SAR) 和美元 ($)。

小智 5

我已经研究这个问题几天了,这里是我找到的解决方案。就我而言,我需要 BGN,因此代码适用于该货币(它们可以轻松适应其他货币)。

=== 解决方案 1 ===

此解决方案中的代码用于名为paypal-bgn-to-euro.php的插件文件(保存为 UTF-8,没有保加利亚语单词的 BOM),该文件位于名为paypal-bgn-to-euro的文件夹中。该插件告诉 PayPal 支持 BGN。然后在用户离开订单页面并转到 PayPal 站点后,它将货币(和金额)转换为 EUR(PayPal 支持的实际货币)。汇率每天通过免费 API 自动更新两次。用户以欧元支付,但在 WooCommerce 中创建的订单仍在 BGN 中。WooCommerce 在验证中检测到错误(有时是两个错误),因为货币(和金额)不匹配,它会暂停订单。然后插件将状态更改为处理对于任何带有订单说明的订单,其中说明了有关 PayPal 货币或金额不匹配的内容。阅读代码中的注释以获取更多信息。

<?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

?>
Run Code Online (Sandbox Code Playgroud)

=== 解决方案 2 ===

- - 第1步 - -

您需要使用一个小插件或在您的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;
}
Run Code Online (Sandbox Code Playgroud)

- - 第2步 - -

当用户在我们网站的订单页面上时,我们将货币(和金额)转换为支持的货币,因为他选择了 PayPal 方法。

所以我们需要为不同的 WooCommerce 网关使用不同的货币。这正是名为Booster for WooCommerce的免费插件的功能之一(它也有付费版本)。此功能称为支付网关货币

当我们激活插件和选定的功能时,我们只能为 PayPal 选择不同的货币,并在那里输入转换率(出于某种原因,它需要逗号作为分隔符而不是点)。据说付费版本支持转换率的自动更新(我还没有测试过)。

付款后,WooCommerce 中的订单现在使用新货币(不像解决方案 1)。如果他们假设所有订单都是 WooCommerce 商店货币,这可能会影响您使用的其他插件。

=== 解决方案 3 ===

我没有测试过这个,但我发现了这个名为“ PAYPAL CURRENCY CONVERTER PRO FOR WOOCOMMERCE ”的付费插件,作者声称它解决了这个问题。