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 '
';
+ }
+}
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();