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.
 
 
 
 
 

214 lines
6.0 KiB

<?php
use WCML\Multicurrency\Transient\Hooks as TransientHooks;
/**
* Class WCML_Currencies_Payment_Gateways
*/
class WCML_Currencies_Payment_Gateways {
const OPTION_KEY = 'wcml_custom_payment_gateways_for_currencies';
/** @var WCML_Payment_Gateway[] */
private $payment_gateways;
/** @var array */
private $available_gateways;
/** @var array */
private $supported_gateways;
/** @var woocommerce_wpml */
private $woocommerce_wpml;
/** @var WPML_WP_API */
private $wp_api;
/**
* @param woocommerce_wpml $woocommerce_wpml
* @param WPML_WP_API $wp_api
*/
public function __construct( woocommerce_wpml $woocommerce_wpml, WPML_WP_API $wp_api ) {
$this->woocommerce_wpml = $woocommerce_wpml;
$this->wp_api = $wp_api;
}
public function add_hooks() {
add_action( 'wp_loaded', [ $this, 'init_gateways' ] );
add_filter( 'woocommerce_gateway_description', [ $this, 'filter_gateway_description' ], 10, 2 );
add_filter( 'option_woocommerce_stripe_settings', [ 'WCML_Payment_Gateway_Stripe', 'filter_stripe_settings' ] );
add_filter( 'option_woocommerce-ppcp-settings', [ 'WCML_Payment_Gateway_PayPal_V2', 'filter_ppcp_args' ] );
TransientHooks::addHooks( WCML_Payment_Gateway_PayPal_V2::BEARER_TOKEN_TRANSIENT );
if ( ! is_admin() && wcml_is_multi_currency_on() ) {
add_filter(
'woocommerce_paypal_supported_currencies',
[ 'WCML_Payment_Gateway_PayPal', 'filter_supported_currencies' ]
);
}
}
/**
* @param string $currency
*
* @return bool
*/
public function is_enabled( $currency ) {
$gateway_enabled_settings = $this->get_settings();
if ( isset( $gateway_enabled_settings[ $currency ] ) ) {
return $gateway_enabled_settings[ $currency ];
}
return false;
}
/**
* @param string $currency
* @param bool $value
*/
public function set_enabled( $currency, $value ) {
$gateway_enabled_settings = $this->get_settings();
$gateway_enabled_settings[ $currency ] = $value;
update_option( self::OPTION_KEY, $gateway_enabled_settings );
}
/**
* @return array
*/
private function get_settings() {
return get_option( self::OPTION_KEY, [] );
}
public function init_gateways() {
if ( null !== $this->payment_gateways ) {
return;
}
$this->payment_gateways = [];
$this->available_gateways = [];
$this->supported_gateways = [];
do_action( 'wcml_before_init_currency_payment_gateways' );
$this->available_gateways = $this->get_available_payment_gateways();
$this->supported_gateways = [
'bacs' => 'WCML_Payment_Gateway_Bacs',
'paypal' => 'WCML_Payment_Gateway_PayPal',
'ppcp-gateway' => 'WCML_Payment_Gateway_PayPal_V2',
'stripe' => 'WCML_Payment_Gateway_Stripe',
];
$this->supported_gateways = apply_filters( 'wcml_supported_currency_payment_gateways', $this->supported_gateways );
$this->store_supported_gateways();
$this->store_non_supported_gateways();
}
/**
* @return array
*/
public function get_gateways() {
$this->init_gateways();
return $this->payment_gateways;
}
/**
* @return array
*/
public function get_supported_gateways() {
$this->init_gateways();
return $this->supported_gateways;
}
/**
* @param string $description
* @param string $id
*
* @return string
*/
public function filter_gateway_description( $description, $id ) {
$this->init_gateways();
if ( in_array( $id, array_keys( $this->supported_gateways ), true ) ) {
$client_currency = $this->woocommerce_wpml->multi_currency->get_client_currency();
$default_currency = wcml_get_woocommerce_currency_option();
if ( $client_currency === $default_currency ) {
return $description;
}
$gateway_setting = $this->payment_gateways[ $id ]->get_setting( $client_currency );
$active_currencies = $this->woocommerce_wpml->multi_currency->get_currency_codes();
if (
$this->is_enabled( $client_currency ) &&
$gateway_setting &&
$client_currency !== $gateway_setting['currency'] &&
in_array( $gateway_setting['currency'], $active_currencies, true )
) {
$cart_total = $this->woocommerce_wpml->cart->format_converted_cart_total_in_currency( $gateway_setting['currency'] );
$description .= '<p>';
$description .= sprintf(
// translators: 1: Currency, 2: Cart total.
__( 'Please note that the payment will be made in %1$s. Your total will be approximately %2$s, depending on the current exchange rate.', 'woocommerce-multilingual' ),
$gateway_setting['currency'],
$cart_total
);
$description .= '</p>';
}
}
return $description;
}
/**
* @param string $id
* @param object $supported_gateway
*
* @return bool
*/
private function is_a_valid_gateway( $id, $supported_gateway ) {
return is_subclass_of( $supported_gateway, 'WCML_Payment_Gateway' ) && array_key_exists( $id, $this->available_gateways );
}
private function store_supported_gateways() {
if ( is_array( $this->supported_gateways ) ) {
$client_currency = $this->woocommerce_wpml->multi_currency->get_client_currency();
foreach ( $this->supported_gateways as $id => $supported_gateway ) {
if ( $this->is_a_valid_gateway( $id, $supported_gateway ) ) {
$this->payment_gateways[ $id ] = new $supported_gateway(
$this->available_gateways[ $id ],
$this->woocommerce_wpml
);
if ( $this->is_enabled( $client_currency ) ) {
$this->payment_gateways[ $id ]->add_hooks();
}
}
}
}
}
private function store_non_supported_gateways() {
$non_supported_gateways = array_diff( array_keys( $this->available_gateways ), array_keys( $this->payment_gateways ) );
/** @var int $non_supported_gateway */
foreach ( $non_supported_gateways as $non_supported_gateway ) {
$this->payment_gateways[ $non_supported_gateway ] = new WCML_Not_Supported_Payment_Gateway( $this->available_gateways[ $non_supported_gateway ], $this->woocommerce_wpml );
}
}
/**
* @return array
*/
private function get_available_payment_gateways() {
return WC()->payment_gateways()->get_available_payment_gateways();
}
}