You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.6 KiB
173 lines
4.6 KiB
<?php
|
|
|
|
/**
|
|
* Class WCML_Payment_Gateway_PayPal
|
|
*/
|
|
class WCML_Payment_Gateway_PayPal extends WCML_Payment_Gateway {
|
|
|
|
const ID = 'paypal';
|
|
const SUPPORTED_CURRENCIES = [
|
|
'AUD',
|
|
'BRL',
|
|
'CAD',
|
|
'MXN',
|
|
'NZD',
|
|
'HKD',
|
|
'SGD',
|
|
'USD',
|
|
'EUR',
|
|
'JPY',
|
|
'TRY',
|
|
'NOK',
|
|
'CZK',
|
|
'DKK',
|
|
'HUF',
|
|
'ILS',
|
|
'MYR',
|
|
'PHP',
|
|
'PLN',
|
|
'SEK',
|
|
'CHF',
|
|
'TWD',
|
|
'THB',
|
|
'GBP',
|
|
'RMB',
|
|
'RUB',
|
|
'INR',
|
|
];
|
|
|
|
public function get_output_model() {
|
|
return [
|
|
'id' => $this->get_id(),
|
|
'title' => $this->get_title(),
|
|
'isSupported' => true,
|
|
'settings' => $this->get_currencies_details(),
|
|
'tooltip' => '',
|
|
'strings' => [
|
|
'labelCurrency' => __( 'Currency', 'woocommerce-multilingual' ),
|
|
'labelPayPalEmail' => __( 'PayPal Email', 'woocommerce-multilingual' ),
|
|
// translators: %s is currency code.
|
|
'tooltipNotSupported' => __( 'This gateway does not support %s. To show this gateway please select another currency.', 'woocommerce-multilingual' ),
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @param string $currency
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_valid_for_use( $currency ) {
|
|
|
|
$filter_removed = remove_filter( 'woocommerce_paypal_supported_currencies', [ 'WCML_Payment_Gateway_PayPal', 'filter_supported_currencies' ] );
|
|
|
|
$is_valid = in_array(
|
|
$currency,
|
|
apply_filters(
|
|
'woocommerce_paypal_supported_currencies',
|
|
self::SUPPORTED_CURRENCIES
|
|
),
|
|
true
|
|
);
|
|
|
|
if ( $filter_removed ) {
|
|
add_filter( 'woocommerce_paypal_supported_currencies', [ 'WCML_Payment_Gateway_PayPal', 'filter_supported_currencies' ] );
|
|
}
|
|
|
|
return $is_valid;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function get_currencies_details() {
|
|
|
|
$currencies_details = [];
|
|
$default_currency = wcml_get_woocommerce_currency_option();
|
|
$woocommerce_currencies = get_woocommerce_currencies();
|
|
|
|
foreach ( $woocommerce_currencies as $code => $currency ) {
|
|
|
|
if ( $default_currency === $code ) {
|
|
$currencies_details[ $code ]['value'] = isset( $this->get_gateway()->settings['email'] ) ? $this->get_gateway()->settings['email'] : '';
|
|
$currencies_details[ $code ]['currency'] = $code;
|
|
$currencies_details[ $code ]['isValid'] = $this->is_valid_for_use( $default_currency );
|
|
} else {
|
|
$currency_gateway_setting = $this->get_setting( $code );
|
|
$currencies_details[ $code ]['value'] = $currency_gateway_setting ? $currency_gateway_setting['value'] : '';
|
|
$currencies_details[ $code ]['currency'] = $currency_gateway_setting ? $currency_gateway_setting['currency'] : $code;
|
|
$currencies_details[ $code ]['isValid'] = $this->is_valid_for_use( $code );
|
|
}
|
|
}
|
|
|
|
return $currencies_details;
|
|
|
|
}
|
|
|
|
public function add_hooks() {
|
|
add_filter( 'woocommerce_paypal_args', [ $this, 'filter_paypal_args' ], 10, 2 );
|
|
}
|
|
|
|
/**
|
|
* @param array $args
|
|
* @param WC_Order $order
|
|
*
|
|
* @return array
|
|
*/
|
|
public function filter_paypal_args( $args, $order ) {
|
|
|
|
$order_data = $order->get_data();
|
|
$client_currency = $order_data['currency'];
|
|
$gateway_setting = $this->get_setting( $client_currency );
|
|
|
|
if ( $gateway_setting ) {
|
|
|
|
if ( $gateway_setting['value'] ) {
|
|
$args['business'] = $gateway_setting['value'];
|
|
}
|
|
|
|
if ( $client_currency !== $gateway_setting['currency'] ) {
|
|
$args['currency_code'] = $gateway_setting['currency'];
|
|
$cart_items = WC()->cart->get_cart_contents();
|
|
$item_id = 1;
|
|
|
|
foreach ( $cart_items as $item ) {
|
|
$item_product_id = $item['variation_id'] ?: $item['product_id'];
|
|
$args[ 'amount_' . $item_id ] = $this->woocommerce_wpml->multi_currency->prices->get_product_price_in_currency( $item_product_id, $gateway_setting['currency'] );
|
|
$item_id ++;
|
|
}
|
|
|
|
$args['shipping_1'] = $this->woocommerce_wpml->cart->convert_cart_shipping_to_currency( $gateway_setting['currency'] );
|
|
}
|
|
}
|
|
|
|
return $args;
|
|
}
|
|
|
|
/**
|
|
* Filter PayPal supported currencies before WC initialized it
|
|
*
|
|
* @param array $supported_currencies
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function filter_supported_currencies( $supported_currencies ) {
|
|
global $woocommerce_wpml;
|
|
|
|
$client_currency = $woocommerce_wpml->multi_currency->get_client_currency();
|
|
|
|
if ( ! in_array( $client_currency, self::SUPPORTED_CURRENCIES, true ) ) {
|
|
$gateway_settings = get_option( self::OPTION_KEY . self::ID, [] );
|
|
|
|
if ( $gateway_settings && isset( $gateway_settings[ $client_currency ] ) ) {
|
|
|
|
if ( in_array( $gateway_settings[ $client_currency ]['currency'], self::SUPPORTED_CURRENCIES, true ) ) {
|
|
$supported_currencies[] = $client_currency;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $supported_currencies;
|
|
}
|
|
|
|
}
|
|
|