From ce5749791e6950fc11e0082d57491ddec665bbcd Mon Sep 17 00:00:00 2001 From: inpsyde-maticluznar Date: Mon, 21 Oct 2024 11:57:45 +0200 Subject: [PATCH 1/2] Prevent plugin use for send only countries --- modules/ppcp-onboarding/services.php | 8 +- .../OnboardingSendOnlyNoticeRenderer.php | 41 +++++++ modules/ppcp-wc-gateway/services.php | 108 ++++++++++++++++++ .../src/Notice/SendOnlyCountryNotice.php | 107 +++++++++++++++++ .../Settings/Fields/connection-tab-fields.php | 35 ++++-- .../ppcp-wc-gateway/src/WCGatewayModule.php | 1 + 6 files changed, 291 insertions(+), 9 deletions(-) create mode 100644 modules/ppcp-onboarding/src/Render/OnboardingSendOnlyNoticeRenderer.php create mode 100644 modules/ppcp-wc-gateway/src/Notice/SendOnlyCountryNotice.php diff --git a/modules/ppcp-onboarding/services.php b/modules/ppcp-onboarding/services.php index e7f493999..369e82824 100644 --- a/modules/ppcp-onboarding/services.php +++ b/modules/ppcp-onboarding/services.php @@ -9,6 +9,7 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\Onboarding; +use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingOptionsRenderer; use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer; use WooCommerce\PayPalCommerce\ApiClient\Authentication\ConnectBearer; @@ -19,7 +20,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; use WooCommerce\PayPalCommerce\Onboarding\Assets\OnboardingAssets; use WooCommerce\PayPalCommerce\Onboarding\Endpoint\LoginSellerEndpoint; use WooCommerce\PayPalCommerce\Onboarding\Endpoint\UpdateSignupLinksEndpoint; -use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingOptionsRenderer; +use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingSendOnlyNoticeRenderer; use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingRenderer; use WooCommerce\PayPalCommerce\Onboarding\OnboardingRESTController; @@ -239,6 +240,11 @@ return array( 'sandbox-express_checkout', ); }, + 'onboarding.render-send-only-notice' => static function( ContainerInterface $container ) { + return new OnboardingSendOnlyNoticeRenderer( + $container->get( 'wcgateway.send-only-message' ) + ); + }, 'onboarding.render' => static function ( ContainerInterface $container ) : OnboardingRenderer { $partner_referrals = $container->get( 'api.endpoint.partner-referrals-production' ); $partner_referrals_sandbox = $container->get( 'api.endpoint.partner-referrals-sandbox' ); diff --git a/modules/ppcp-onboarding/src/Render/OnboardingSendOnlyNoticeRenderer.php b/modules/ppcp-onboarding/src/Render/OnboardingSendOnlyNoticeRenderer.php new file mode 100644 index 000000000..a610b0634 --- /dev/null +++ b/modules/ppcp-onboarding/src/Render/OnboardingSendOnlyNoticeRenderer.php @@ -0,0 +1,41 @@ +message = $message; + } + + /** + * Renders the notice. + * + * @return string + */ + public function render(): string { + return '

' . $this->message . '

'; + } +} diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 9ed1a83a8..ba587ae95 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -29,6 +29,7 @@ use WooCommerce\PayPalCommerce\WcGateway\Endpoint\CaptureCardPayment; use WooCommerce\PayPalCommerce\WcGateway\Endpoint\RefreshFeatureStatusEndpoint; use WooCommerce\PayPalCommerce\WcGateway\Helper\CartCheckoutDetector; use WooCommerce\PayPalCommerce\WcGateway\Helper\FeesUpdater; +use WooCommerce\PayPalCommerce\WcGateway\Notice\SendOnlyCountryNotice; use WooCommerce\PayPalCommerce\WcGateway\Settings\WcTasks\Factory\SimpleRedirectTaskFactory; use WooCommerce\PayPalCommerce\WcGateway\Settings\WcTasks\Factory\SimpleRedirectTaskFactoryInterface; use WooCommerce\PayPalCommerce\WcGateway\Settings\WcTasks\Registrar\TaskRegistrar; @@ -374,6 +375,113 @@ return array( $container->get( 'wcgateway.settings.status' ) ); }, + 'wcgateway.store-country' => static function(): string { + $location = wc_get_base_location(); + return $location['country']; + }, + 'wcgateway.send-only-message' => static function() { + return __( "Important: Your current WooCommerce store location is in a \"send-only\" country, according to PayPal's policies. Sellers in these countries are unable to receive payments via PayPal. Since receiving payments is essential for using the PayPal Payments extension, you will not be able to connect your PayPal account while operating from a \"send-only\" country. To activate PayPal, please update your WooCommerce store location to a supported region and connect a PayPal account eligible for receiving payments.", 'woocommerce-paypal-payments' ); + }, + 'wcgateway.send-only-countries' => static function() { + return array( + 'AO', + 'AI', + 'AM', + 'AW', + 'AZ', + 'BY', + 'BJ', + 'BT', + 'BO', + 'VG', + 'BN', + 'BF', + 'BI', + 'CI', + 'KH', + 'CM', + 'CV', + 'TD', + 'KM', + 'CG', + 'CK', + 'DJ', + 'ER', + 'ET', + 'FK', + 'GA', + 'GM', + 'GN', + 'GW', + 'GY', + 'KI', + 'KG', + 'LA', + 'MK', + 'MG', + 'MV', + 'ML', + 'MH', + 'MR', + 'YT', + 'FM', + 'MN', + 'ME', + 'MS', + 'NA', + 'NR', + 'NP', + 'NE', + 'NG', + 'NU', + 'NF', + 'PG', + 'PY', + 'PN', + 'RW', + 'ST', + 'WS', + 'SL', + 'SB', + 'SO', + 'SH', + 'PM', + 'VC', + 'SR', + 'SJ', + 'TJ', + 'TZ', + 'TG', + 'TO', + 'TN', + 'TM', + 'TV', + 'UG', + 'UA', + 'VA', + 'WF', + 'YE', + 'ZM', + 'ZW', + ); + }, + 'wcgateway.is-send-only-country' => static function( ContainerInterface $container ) { + $store_country = $container->get( 'wcgateway.store-country' ); + $send_only_countries = $container->get( 'wcgateway.send-only-countries' ); + return in_array( $store_country, $send_only_countries, true ); + }, + 'wcgateway.notice.send-only-country' => static function ( ContainerInterface $container ) { + $onboarding_state = $container->get( 'onboarding.state' ); + assert( $onboarding_state instanceof State ); + return new SendOnlyCountryNotice( + $container->get( 'wcgateway.send-only-message' ), + $container->get( 'wcgateway.is-send-only-country' ), + $container->get( 'wcgateway.is-ppcp-settings-page' ), + $container->get( 'wcgateway.is-wc-gateways-list-page' ), + $onboarding_state->current_state() + ); + }, + 'wcgateway.notice.authorize-order-action' => static function ( ContainerInterface $container ): AuthorizeOrderActionNotice { return new AuthorizeOrderActionNotice(); diff --git a/modules/ppcp-wc-gateway/src/Notice/SendOnlyCountryNotice.php b/modules/ppcp-wc-gateway/src/Notice/SendOnlyCountryNotice.php new file mode 100644 index 000000000..f855e923c --- /dev/null +++ b/modules/ppcp-wc-gateway/src/Notice/SendOnlyCountryNotice.php @@ -0,0 +1,107 @@ +message_text = $message_text; + $this->is_send_only_country = $is_send_only_country; + $this->is_ppcp_settings_page = $is_ppcp_settings_page; + $this->is_wc_gateways_list_page = $is_wc_gateways_list_page; + $this->onboarding_state = $onboarding_state; + } + + /** + * Returns the message. + * + * @return Message|null + */ + public function message(): ?Message { + + if ( ! $this->is_send_only_country || + ! $this->is_ppcp_page() || + $this->onboarding_state === State::STATE_START + ) { + return null; + } + + return new Message( + $this->message_text, + 'warning', + true, + 'ppcp-notice-wrapper' + ); + } + + /** + * Checks if current page is ppcp page + * + * @return bool + */ + protected function is_ppcp_page():bool { + return $this->is_ppcp_settings_page || $this->is_wc_gateways_list_page; + } +} diff --git a/modules/ppcp-wc-gateway/src/Settings/Fields/connection-tab-fields.php b/modules/ppcp-wc-gateway/src/Settings/Fields/connection-tab-fields.php index 7a468d5c9..6e005babc 100644 --- a/modules/ppcp-wc-gateway/src/Settings/Fields/connection-tab-fields.php +++ b/modules/ppcp-wc-gateway/src/Settings/Fields/connection-tab-fields.php @@ -12,10 +12,11 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\WcGateway\Settings; use WooCommerce\PayPalCommerce\ApiClient\Helper\PurchaseUnitSanitizer; +use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingOptionsRenderer; use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; use WooCommerce\PayPalCommerce\Onboarding\Environment; -use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingOptionsRenderer; +use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingSendOnlyNoticeRenderer; use WooCommerce\PayPalCommerce\Onboarding\State; use WooCommerce\PayPalCommerce\WcGateway\Helper\DisplayManager; @@ -43,6 +44,13 @@ return function ( ContainerInterface $container, array $fields ): array { $display_manager = $container->get( 'wcgateway.display-manager' ); assert( $display_manager instanceof DisplayManager ); + $onboarding_send_only_notice_renderer = $container->get( 'onboarding.render-send-only-notice' ); + assert( $onboarding_send_only_notice_renderer instanceof OnboardingSendOnlyNoticeRenderer ); + + $is_send_only_country = $container->get( 'wcgateway.is-send-only-country' ); + $onboarding_elements_class = $is_send_only_country ? 'hide' : 'ppcp-onboarding-element'; + $send_only_country_notice_class = $is_send_only_country ? 'ppcp-onboarding-element' : 'hide'; + $connection_fields = array( 'ppcp_onboarading_header' => array( 'type' => 'ppcp-text', @@ -101,10 +109,21 @@ return function ( ContainerInterface $container, array $fields ): array { 'gateway' => Settings::CONNECTION_TAB_ID, 'description' => __( 'Your account is connected to sandbox, no real charging takes place. To accept live payments, turn off sandbox mode and connect your live PayPal account.', 'woocommerce-paypal-payments' ), ), - + 'ppcp_send_only_countries_notice' => array( + 'type' => 'ppcp-text', + 'classes' => array( $send_only_country_notice_class ), + 'text' => $onboarding_send_only_notice_renderer->render(), + 'raw' => true, + 'screens' => array( + State::STATE_START, + State::STATE_ONBOARDED, + ), + 'requirements' => array(), + 'gateway' => Settings::CONNECTION_TAB_ID, + ), 'ppcp_onboarading_options' => array( 'type' => 'ppcp-text', - 'classes' => array( 'ppcp-onboarding-element' ), + 'classes' => array( $onboarding_elements_class ), 'text' => $onboarding_options_renderer->render( $is_shop_supports_dcc, $container->get( 'api.shop.country' ) === 'CN' @@ -123,7 +142,7 @@ return function ( ContainerInterface $container, array $fields ): array { // is to have the buttons before loading the script. 'ppcp_onboarding_production_ppcp' => array( 'type' => 'ppcp_onboarding', - 'classes' => array( 'ppcp-onboarding-element' ), + 'classes' => array( $onboarding_elements_class ), 'screens' => array( State::STATE_START, ), @@ -135,7 +154,7 @@ return function ( ContainerInterface $container, array $fields ): array { ), 'ppcp_onboarding_production_express' => array( 'type' => 'ppcp_onboarding', - 'classes' => array( 'ppcp-onboarding-element' ), + 'classes' => array( $onboarding_elements_class ), 'screens' => array( State::STATE_START, ), @@ -147,7 +166,7 @@ return function ( ContainerInterface $container, array $fields ): array { ), 'ppcp_onboarding_sandbox_ppcp' => array( 'type' => 'ppcp_onboarding', - 'classes' => array( 'ppcp-onboarding-element' ), + 'classes' => array( $onboarding_elements_class ), 'screens' => array( State::STATE_START, ), @@ -160,7 +179,7 @@ return function ( ContainerInterface $container, array $fields ): array { ), 'ppcp_onboarding_sandbox_express' => array( 'type' => 'ppcp_onboarding', - 'classes' => array( 'ppcp-onboarding-element' ), + 'classes' => array( $onboarding_elements_class ), 'screens' => array( State::STATE_START, ), @@ -214,7 +233,7 @@ return function ( ContainerInterface $container, array $fields ): array { esc_html__( 'Further information on manual credential input:', 'woocommerce-paypal-payments' ), esc_html__( 'documentation', 'woocommerce-paypal-payments' ) ), - 'classes' => array( 'ppcp-onboarding-element' ), + 'classes' => array( $onboarding_elements_class ), 'screens' => array( State::STATE_START, State::STATE_ONBOARDED, diff --git a/modules/ppcp-wc-gateway/src/WCGatewayModule.php b/modules/ppcp-wc-gateway/src/WCGatewayModule.php index 2471af4e7..830cdf31e 100644 --- a/modules/ppcp-wc-gateway/src/WCGatewayModule.php +++ b/modules/ppcp-wc-gateway/src/WCGatewayModule.php @@ -224,6 +224,7 @@ class WCGatewayModule implements ServiceModule, ExtendingModule, ExecutableModul foreach ( array( $c->get( 'wcgateway.notice.dcc-without-paypal' ), $c->get( 'wcgateway.notice.card-button-without-paypal' ), + $c->get( 'wcgateway.notice.send-only-country' ), ) as $gateway_without_paypal_notice ) { assert( $gateway_without_paypal_notice instanceof GatewayWithoutPayPalAdminNotice ); $message = $gateway_without_paypal_notice->message(); From 47b7c66f53d17682c9f5a11670ce95af606aae15 Mon Sep 17 00:00:00 2001 From: inpsyde-maticluznar Date: Wed, 30 Oct 2024 06:24:40 +0100 Subject: [PATCH 2/2] Add SendOnlyCountryNotice to notice array separately --- modules/ppcp-wc-gateway/src/WCGatewayModule.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/src/WCGatewayModule.php b/modules/ppcp-wc-gateway/src/WCGatewayModule.php index 830cdf31e..fa2f9d58f 100644 --- a/modules/ppcp-wc-gateway/src/WCGatewayModule.php +++ b/modules/ppcp-wc-gateway/src/WCGatewayModule.php @@ -22,6 +22,7 @@ use WooCommerce\PayPalCommerce\Vendor\Inpsyde\Modularity\Module\ExtendingModule; use WooCommerce\PayPalCommerce\Vendor\Inpsyde\Modularity\Module\ModuleClassNameIdTrait; use WooCommerce\PayPalCommerce\Vendor\Inpsyde\Modularity\Module\ServiceModule; use WooCommerce\PayPalCommerce\WcGateway\Endpoint\RefreshFeatureStatusEndpoint; +use WooCommerce\PayPalCommerce\WcGateway\Notice\SendOnlyCountryNotice; use WooCommerce\PayPalCommerce\WcGateway\Processor\CreditCardOrderInfoHandlingTrait; use WC_Order; use WooCommerce\PayPalCommerce\AdminNotices\Repository\Repository; @@ -224,7 +225,6 @@ class WCGatewayModule implements ServiceModule, ExtendingModule, ExecutableModul foreach ( array( $c->get( 'wcgateway.notice.dcc-without-paypal' ), $c->get( 'wcgateway.notice.card-button-without-paypal' ), - $c->get( 'wcgateway.notice.send-only-country' ), ) as $gateway_without_paypal_notice ) { assert( $gateway_without_paypal_notice instanceof GatewayWithoutPayPalAdminNotice ); $message = $gateway_without_paypal_notice->message(); @@ -233,6 +233,13 @@ class WCGatewayModule implements ServiceModule, ExtendingModule, ExecutableModul } } + $send_only_country_notice = $c->get( 'wcgateway.notice.send-only-country' ); + assert( $send_only_country_notice instanceof SendOnlyCountryNotice ); + $message = $send_only_country_notice->message(); + if ( $message ) { + $notices[] = $message; + } + $authorize_order_action = $c->get( 'wcgateway.notice.authorize-order-action' ); $authorized_message = $authorize_order_action->message(); if ( $authorized_message ) {