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 ”的付费插件,作者声称它解决了这个问题。
归档时间: |
|
查看次数: |
8288 次 |
最近记录: |