From cce8ee9d8d41abd437e858ac9d195aa3267f46f8 Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Thu, 2 Mar 2023 12:08:20 +0100 Subject: [PATCH 1/7] Remove calls to enpoints if not onboarded --- modules/ppcp-wc-gateway/services.php | 15 +++++++++++++++ modules/ppcp-webhooks/services.php | 8 +++++++- modules/ppcp-webhooks/src/WebhookModule.php | 5 +++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 1f3393337..3abe68006 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -242,6 +242,11 @@ return array( ); }, 'wcgateway.settings.sections' => static function ( ContainerInterface $container ): array { + $state = $container->get( 'onboarding.state' ); + if ( $state->current_state() < State::STATE_ONBOARDED ) { + return array(); + } + $sections = array( Settings::CONNECTION_TAB_ID => __( 'Connection', 'woocommerce-paypal-payments' ), PayPalGateway::ID => __( 'Standard Payments', 'woocommerce-paypal-payments' ), @@ -1246,6 +1251,11 @@ return array( return 'https://www.paypal.com/bizsignup/entry?country.x=DE&product=payment_methods&capabilities=PAY_UPON_INVOICE'; }, 'wcgateway.settings.connection.dcc-status-text' => static function ( ContainerInterface $container ): string { + $state = $container->get( 'onboarding.state' ); + if ( $state->current_state() < State::STATE_ONBOARDED ) { + return ''; + } + $dcc_product_status = $container->get( 'wcgateway.helper.dcc-product-status' ); assert( $dcc_product_status instanceof DCCProductStatus ); @@ -1279,6 +1289,11 @@ return array( ); }, 'wcgateway.settings.connection.pui-status-text' => static function ( ContainerInterface $container ): string { + $state = $container->get( 'onboarding.state' ); + if ( $state->current_state() < State::STATE_ONBOARDED ) { + return ''; + } + $pui_product_status = $container->get( 'wcgateway.pay-upon-invoice-product-status' ); assert( $pui_product_status instanceof PayUponInvoiceProductStatus ); diff --git a/modules/ppcp-webhooks/services.php b/modules/ppcp-webhooks/services.php index d7ed8013c..49b48778c 100644 --- a/modules/ppcp-webhooks/services.php +++ b/modules/ppcp-webhooks/services.php @@ -14,6 +14,7 @@ use Psr\Log\LoggerInterface; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\WebhookEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\Webhook; use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory; +use WooCommerce\PayPalCommerce\Onboarding\State; use WooCommerce\PayPalCommerce\Webhooks\Endpoint\ResubscribeEndpoint; use WooCommerce\PayPalCommerce\Webhooks\Endpoint\SimulateEndpoint; use WooCommerce\PayPalCommerce\Webhooks\Endpoint\SimulationStateEndpoint; @@ -113,7 +114,12 @@ return array( $endpoint = $container->get( 'api.endpoint.webhook' ); assert( $endpoint instanceof WebhookEndpoint ); - return $endpoint->list(); + $state = $container->get( 'onboarding.state' ); + if ( $state->current_state() >= State::STATE_ONBOARDED ) { + return $endpoint->list(); + } + + return array(); }, 'webhook.status.registered-webhooks-data' => function( ContainerInterface $container ) : array { diff --git a/modules/ppcp-webhooks/src/WebhookModule.php b/modules/ppcp-webhooks/src/WebhookModule.php index 6f8669a8b..35c865f5e 100644 --- a/modules/ppcp-webhooks/src/WebhookModule.php +++ b/modules/ppcp-webhooks/src/WebhookModule.php @@ -9,6 +9,7 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\Webhooks; +use WooCommerce\PayPalCommerce\Onboarding\State; use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider; use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface; use Exception; @@ -126,8 +127,8 @@ class WebhookModule implements ModuleInterface { try { $webhooks = $container->get( 'webhook.status.registered-webhooks' ); - - if ( empty( $webhooks ) ) { + $state = $container->get( 'onboarding.state' ); + if ( empty( $webhooks ) && $state->current_state() >= State::STATE_ONBOARDED ) { $registrar = $container->get( 'webhook.registrar' ); assert( $registrar instanceof WebhookRegistrar ); From 5a4a43e0468683b4ea4a0460b9fe86948a9ad4dc Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Thu, 2 Mar 2023 14:35:30 +0100 Subject: [PATCH 2/7] Fix phpcs --- modules/ppcp-webhooks/src/WebhookModule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-webhooks/src/WebhookModule.php b/modules/ppcp-webhooks/src/WebhookModule.php index 35c865f5e..fb2642266 100644 --- a/modules/ppcp-webhooks/src/WebhookModule.php +++ b/modules/ppcp-webhooks/src/WebhookModule.php @@ -127,7 +127,7 @@ class WebhookModule implements ModuleInterface { try { $webhooks = $container->get( 'webhook.status.registered-webhooks' ); - $state = $container->get( 'onboarding.state' ); + $state = $container->get( 'onboarding.state' ); if ( empty( $webhooks ) && $state->current_state() >= State::STATE_ONBOARDED ) { $registrar = $container->get( 'webhook.registrar' ); assert( $registrar instanceof WebhookRegistrar ); From 4b320f0f87ce91cfe84cf8fd15b4049b136e5032 Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Fri, 3 Mar 2023 16:23:55 +0100 Subject: [PATCH 3/7] Move webhook registration after checkout setting saved --- .../src/Settings/SettingsListener.php | 43 ++++++++++++++----- .../ppcp-wc-gateway/src/WCGatewayModule.php | 1 + 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php index 980b0db80..604021b0a 100644 --- a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php +++ b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php @@ -18,7 +18,6 @@ use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway; use WooCommerce\PayPalCommerce\WcGateway\Helper\DCCProductStatus; use WooCommerce\PayPalCommerce\WcGateway\Helper\PayUponInvoiceProductStatus; use WooCommerce\PayPalCommerce\Webhooks\WebhookRegistrar; -use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException; /** * Class SettingsListener @@ -322,16 +321,6 @@ class SettingsListener { } $this->settings->persist(); - if ( $credentials_change_status ) { - if ( in_array( - $credentials_change_status, - array( self::CREDENTIALS_ADDED, self::CREDENTIALS_CHANGED ), - true - ) ) { - $this->webhook_registrar->register(); - } - } - if ( $this->cache->has( PayPalBearer::CACHE_KEY ) ) { $this->cache->delete( PayPalBearer::CACHE_KEY ); } @@ -362,6 +351,38 @@ class SettingsListener { // phpcs:enable WordPress.Security.NonceVerification.Recommended } + /** + * Runs after checkout setting saved. + * + * @return void + */ + public function after_checkout_settings_saved():void { + if ( ! $this->is_valid_site_request() ) { + return; + } + + // phpcs:disable WordPress.Security.NonceVerification.Missing + // phpcs:disable WordPress.Security.NonceVerification.Recommended + $raw_data = ( isset( $_POST['ppcp'] ) ) ? (array) wp_unslash( $_POST['ppcp'] ) : array(); + // phpcs:enable WordPress.Security.NonceVerification.Missing + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $settings = $this->retrieve_settings_from_raw_data( $raw_data ); + $credentials_change_status = null; // Cannot detect on Card Processing page. + if ( Settings::CONNECTION_TAB_ID === $this->page_id ) { + $credentials_change_status = $this->determine_credentials_change_status( $settings ); + } + if ( in_array( + $credentials_change_status, + array( self::CREDENTIALS_REMOVED, self::CREDENTIALS_CHANGED ), + true + ) ) { + $this->webhook_registrar->unregister(); + $this->webhook_registrar->register(); + } + } + /** * Returns the URL opened at the end of onboarding. * diff --git a/modules/ppcp-wc-gateway/src/WCGatewayModule.php b/modules/ppcp-wc-gateway/src/WCGatewayModule.php index 289eb178c..ef898de75 100644 --- a/modules/ppcp-wc-gateway/src/WCGatewayModule.php +++ b/modules/ppcp-wc-gateway/src/WCGatewayModule.php @@ -461,6 +461,7 @@ class WCGatewayModule implements ModuleInterface { $listener->listen_for_merchant_id(); $listener->listen_for_vaulting_enabled(); $listener->listen_for_tracking_enabled(); + $listener->after_checkout_settings_saved(); } ); From 555169b651884a921e777117a7fe1f17da4c4de0 Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Fri, 3 Mar 2023 16:23:55 +0100 Subject: [PATCH 4/7] Revert "Move webhook registration after checkout setting saved" This reverts commit 4b320f0f87ce91cfe84cf8fd15b4049b136e5032. --- .../src/Settings/SettingsListener.php | 43 +++++-------------- .../ppcp-wc-gateway/src/WCGatewayModule.php | 1 - 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php index 604021b0a..980b0db80 100644 --- a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php +++ b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php @@ -18,6 +18,7 @@ use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway; use WooCommerce\PayPalCommerce\WcGateway\Helper\DCCProductStatus; use WooCommerce\PayPalCommerce\WcGateway\Helper\PayUponInvoiceProductStatus; use WooCommerce\PayPalCommerce\Webhooks\WebhookRegistrar; +use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException; /** * Class SettingsListener @@ -321,6 +322,16 @@ class SettingsListener { } $this->settings->persist(); + if ( $credentials_change_status ) { + if ( in_array( + $credentials_change_status, + array( self::CREDENTIALS_ADDED, self::CREDENTIALS_CHANGED ), + true + ) ) { + $this->webhook_registrar->register(); + } + } + if ( $this->cache->has( PayPalBearer::CACHE_KEY ) ) { $this->cache->delete( PayPalBearer::CACHE_KEY ); } @@ -351,38 +362,6 @@ class SettingsListener { // phpcs:enable WordPress.Security.NonceVerification.Recommended } - /** - * Runs after checkout setting saved. - * - * @return void - */ - public function after_checkout_settings_saved():void { - if ( ! $this->is_valid_site_request() ) { - return; - } - - // phpcs:disable WordPress.Security.NonceVerification.Missing - // phpcs:disable WordPress.Security.NonceVerification.Recommended - $raw_data = ( isset( $_POST['ppcp'] ) ) ? (array) wp_unslash( $_POST['ppcp'] ) : array(); - // phpcs:enable WordPress.Security.NonceVerification.Missing - // phpcs:enable WordPress.Security.NonceVerification.Recommended - - // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - $settings = $this->retrieve_settings_from_raw_data( $raw_data ); - $credentials_change_status = null; // Cannot detect on Card Processing page. - if ( Settings::CONNECTION_TAB_ID === $this->page_id ) { - $credentials_change_status = $this->determine_credentials_change_status( $settings ); - } - if ( in_array( - $credentials_change_status, - array( self::CREDENTIALS_REMOVED, self::CREDENTIALS_CHANGED ), - true - ) ) { - $this->webhook_registrar->unregister(); - $this->webhook_registrar->register(); - } - } - /** * Returns the URL opened at the end of onboarding. * diff --git a/modules/ppcp-wc-gateway/src/WCGatewayModule.php b/modules/ppcp-wc-gateway/src/WCGatewayModule.php index ef898de75..289eb178c 100644 --- a/modules/ppcp-wc-gateway/src/WCGatewayModule.php +++ b/modules/ppcp-wc-gateway/src/WCGatewayModule.php @@ -461,7 +461,6 @@ class WCGatewayModule implements ModuleInterface { $listener->listen_for_merchant_id(); $listener->listen_for_vaulting_enabled(); $listener->listen_for_tracking_enabled(); - $listener->after_checkout_settings_saved(); } ); From ac7d0c0cb32516f4d6be08e6fcda3bc39c7936b3 Mon Sep 17 00:00:00 2001 From: Alex P Date: Mon, 6 Mar 2023 10:02:01 +0200 Subject: [PATCH 5/7] Register webhooks later via wp cron --- modules/ppcp-wc-gateway/src/Settings/SettingsListener.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php index 980b0db80..bc2f8e9b1 100644 --- a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php +++ b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php @@ -328,7 +328,10 @@ class SettingsListener { array( self::CREDENTIALS_ADDED, self::CREDENTIALS_CHANGED ), true ) ) { - $this->webhook_registrar->register(); + wp_schedule_single_event( + time() + 5, + WebhookRegistrar::EVENT_HOOK + ); } } From 36cffad3697960ecb419d2458bb7fa09e052d202 Mon Sep 17 00:00:00 2001 From: Alex P Date: Mon, 6 Mar 2023 10:19:23 +0200 Subject: [PATCH 6/7] Fix formatting --- modules/ppcp-wc-gateway/services.php | 6 +++--- modules/ppcp-webhooks/services.php | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 3abe68006..e966a8adb 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -242,7 +242,7 @@ return array( ); }, 'wcgateway.settings.sections' => static function ( ContainerInterface $container ): array { - $state = $container->get( 'onboarding.state' ); + $state = $container->get( 'onboarding.state' ); if ( $state->current_state() < State::STATE_ONBOARDED ) { return array(); } @@ -1251,7 +1251,7 @@ return array( return 'https://www.paypal.com/bizsignup/entry?country.x=DE&product=payment_methods&capabilities=PAY_UPON_INVOICE'; }, 'wcgateway.settings.connection.dcc-status-text' => static function ( ContainerInterface $container ): string { - $state = $container->get( 'onboarding.state' ); + $state = $container->get( 'onboarding.state' ); if ( $state->current_state() < State::STATE_ONBOARDED ) { return ''; } @@ -1289,7 +1289,7 @@ return array( ); }, 'wcgateway.settings.connection.pui-status-text' => static function ( ContainerInterface $container ): string { - $state = $container->get( 'onboarding.state' ); + $state = $container->get( 'onboarding.state' ); if ( $state->current_state() < State::STATE_ONBOARDED ) { return ''; } diff --git a/modules/ppcp-webhooks/services.php b/modules/ppcp-webhooks/services.php index 49b48778c..9ef38d340 100644 --- a/modules/ppcp-webhooks/services.php +++ b/modules/ppcp-webhooks/services.php @@ -22,7 +22,6 @@ use WooCommerce\PayPalCommerce\Webhooks\Handler\CheckoutOrderApproved; use WooCommerce\PayPalCommerce\Webhooks\Handler\CheckoutOrderCompleted; use WooCommerce\PayPalCommerce\Webhooks\Handler\CheckoutPaymentApprovalReversed; use WooCommerce\PayPalCommerce\Webhooks\Handler\PaymentCaptureCompleted; -use WooCommerce\PayPalCommerce\Webhooks\Handler\PaymentCaptureDenied; use WooCommerce\PayPalCommerce\Webhooks\Handler\PaymentCapturePending; use WooCommerce\PayPalCommerce\Webhooks\Handler\PaymentCaptureRefunded; use WooCommerce\PayPalCommerce\Webhooks\Handler\PaymentCaptureReversed; @@ -114,7 +113,7 @@ return array( $endpoint = $container->get( 'api.endpoint.webhook' ); assert( $endpoint instanceof WebhookEndpoint ); - $state = $container->get( 'onboarding.state' ); + $state = $container->get( 'onboarding.state' ); if ( $state->current_state() >= State::STATE_ONBOARDED ) { return $endpoint->list(); } From 26d64139b93ed6ef17cf92b34ad315b4b71ebde0 Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 10 Mar 2023 14:50:21 +0200 Subject: [PATCH 7/7] Do not register webhooks during credentials change handling they will be registered later in the connection page handler --- .../src/Settings/SettingsListener.php | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php index bc2f8e9b1..e4ad9d3dd 100644 --- a/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php +++ b/modules/ppcp-wc-gateway/src/Settings/SettingsListener.php @@ -322,19 +322,6 @@ class SettingsListener { } $this->settings->persist(); - if ( $credentials_change_status ) { - if ( in_array( - $credentials_change_status, - array( self::CREDENTIALS_ADDED, self::CREDENTIALS_CHANGED ), - true - ) ) { - wp_schedule_single_event( - time() + 5, - WebhookRegistrar::EVENT_HOOK - ); - } - } - if ( $this->cache->has( PayPalBearer::CACHE_KEY ) ) { $this->cache->delete( PayPalBearer::CACHE_KEY ); }