From 0a81b27f41fb018ce81f5763d40b43a8d0a12467 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 21 Oct 2021 14:41:44 +0200 Subject: [PATCH 1/6] Enforce vault if contains subscription --- .../resources/js/modules/Renderer/CreditCardRenderer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js index 33da3ab45..f8e3b503f 100644 --- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js +++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js @@ -182,8 +182,11 @@ class CreditCardRenderer { if (this.formValid && this.cardValid) { const save_card = this.defaultConfig.save_card ? true : false; - const vault = document.getElementById('ppcp-credit-card-vault') ? + let vault = document.getElementById('ppcp-credit-card-vault') ? document.getElementById('ppcp-credit-card-vault').checked : save_card; + if(this.defaultConfig.enforce_vault) { + vault = true; + } const contingency = this.defaultConfig.hosted_fields.contingency; const hostedFieldsData = { vault: vault From 1782c4fe16451752887b53a85bb26fcc0fb6ea13 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Fri, 22 Oct 2021 12:49:04 +0200 Subject: [PATCH 2/6] Display PayPal buttons when not logged in and subscription in the cart --- modules/ppcp-button/services.php | 4 +++- modules/ppcp-button/src/Assets/SmartButton.php | 9 +-------- .../src/Endpoint/CreateOrderEndpoint.php | 13 ++++++++++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/modules/ppcp-button/services.php b/modules/ppcp-button/services.php index fa14e181e..89f138adc 100644 --- a/modules/ppcp-button/services.php +++ b/modules/ppcp-button/services.php @@ -117,6 +117,7 @@ return array( $early_order_handler = $container->get( 'button.helper.early-order-handler' ); $registration_needed = $container->get( 'button.current-user-must-register' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); + $subscription_helper = $container->get( 'subscription.helper' ); return new CreateOrderEndpoint( $request_data, $cart_repository, @@ -127,7 +128,8 @@ return array( $settings, $early_order_handler, $registration_needed, - $logger + $logger, + $subscription_helper ); }, 'button.helper.early-order-handler' => static function ( ContainerInterface $container ) : EarlyOrderHandler { diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index ac4126f5b..23dad7e96 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -167,10 +167,6 @@ class SmartButton implements SmartButtonInterface { */ public function render_wrapper(): bool { - if ( ! $this->can_save_vault_token() && $this->has_subscriptions() ) { - return false; - } - if ( $this->settings->has( 'enabled' ) && $this->settings->get( 'enabled' ) ) { $this->render_button_wrapper_registrar(); $this->render_message_wrapper_registrar(); @@ -377,9 +373,6 @@ class SmartButton implements SmartButtonInterface { if ( ! is_checkout() && ! $buttons_enabled ) { return false; } - if ( ! $this->can_save_vault_token() && $this->has_subscriptions() ) { - return false; - } $load_script = false; if ( is_checkout() && $this->settings->has( 'dcc_enabled' ) && $this->settings->get( 'dcc_enabled' ) ) { @@ -583,7 +576,7 @@ class SmartButton implements SmartButtonInterface { return false; } - return is_user_logged_in(); + return true; } /** diff --git a/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php index d8c473bfa..ae924c5e1 100644 --- a/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php @@ -23,6 +23,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory; use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository; use WooCommerce\PayPalCommerce\Button\Helper\EarlyOrderHandler; use WooCommerce\PayPalCommerce\Session\SessionHandler; +use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper; use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; @@ -31,7 +32,6 @@ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; */ class CreateOrderEndpoint implements EndpointInterface { - const ENDPOINT = 'ppc-create-order'; /** @@ -118,6 +118,11 @@ class CreateOrderEndpoint implements EndpointInterface { */ protected $logger; + /** + * @var SubscriptionHelper + */ + protected $subscription_helper; + /** * CreateOrderEndpoint constructor. * @@ -142,7 +147,8 @@ class CreateOrderEndpoint implements EndpointInterface { Settings $settings, EarlyOrderHandler $early_order_handler, bool $registration_needed, - LoggerInterface $logger + LoggerInterface $logger, + SubscriptionHelper $subscription_helper ) { $this->request_data = $request_data; @@ -155,6 +161,7 @@ class CreateOrderEndpoint implements EndpointInterface { $this->early_order_handler = $early_order_handler; $this->registration_needed = $registration_needed; $this->logger = $logger; + $this->subscription_helper = $subscription_helper; } /** @@ -196,7 +203,7 @@ class CreateOrderEndpoint implements EndpointInterface { $this->set_bn_code( $data ); if ( 'checkout' === $data['context'] ) { - if ( $this->registration_needed || ( isset( $data['createaccount'] ) && '1' === $data['createaccount'] ) ) { + if ( $this->registration_needed || $this->subscription_helper->cart_contains_subscription() || ( isset( $data['createaccount'] ) && '1' === $data['createaccount'] ) ) { $this->process_checkout_form_when_creating_account( $data['form'], $wc_order ); } From 3c237b63159a3cb012eae2ba2d072c6a71f36fd1 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Mon, 25 Oct 2021 16:27:05 +0200 Subject: [PATCH 3/6] Do not display gateways if subscription in cart and user is not logged in --- composer.lock | 22 +++++++++---------- modules/ppcp-button/services.php | 4 +--- .../ppcp-button/src/Assets/SmartButton.php | 9 +++++++- .../src/Endpoint/CreateOrderEndpoint.php | 12 ++-------- modules/ppcp-wc-gateway/services.php | 3 ++- .../src/Checkout/DisableGateways.php | 22 +++++++++++++++---- 6 files changed, 42 insertions(+), 30 deletions(-) diff --git a/composer.lock b/composer.lock index 367c86ed7..4e3fa6b9b 100644 --- a/composer.lock +++ b/composer.lock @@ -556,16 +556,16 @@ }, { "name": "antecedent/patchwork", - "version": "2.1.15", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/antecedent/patchwork.git", - "reference": "0430ceaac7f447f1778c199ec19d7e4362a6f961" + "reference": "df5aba175a44c2996ced4edf8ec9f9081b5348c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antecedent/patchwork/zipball/0430ceaac7f447f1778c199ec19d7e4362a6f961", - "reference": "0430ceaac7f447f1778c199ec19d7e4362a6f961", + "url": "https://api.github.com/repos/antecedent/patchwork/zipball/df5aba175a44c2996ced4edf8ec9f9081b5348c0", + "reference": "df5aba175a44c2996ced4edf8ec9f9081b5348c0", "shasum": "" }, "require": { @@ -596,7 +596,7 @@ "runkit", "testing" ], - "time": "2021-08-22T08:00:13+00:00" + "time": "2021-10-21T14:22:43+00:00" }, { "name": "brain/monkey", @@ -3532,16 +3532,16 @@ }, { "name": "vimeo/psalm", - "version": "4.10.0", + "version": "4.11.1", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "916b098b008f6de4543892b1e0651c1c3b92cbfa" + "reference": "e33492398bd4e5e2ab60e331d445979bd83feecd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/916b098b008f6de4543892b1e0651c1c3b92cbfa", - "reference": "916b098b008f6de4543892b1e0651c1c3b92cbfa", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/e33492398bd4e5e2ab60e331d445979bd83feecd", + "reference": "e33492398bd4e5e2ab60e331d445979bd83feecd", "shasum": "" }, "require": { @@ -3561,7 +3561,7 @@ "felixfbecker/advanced-json-rpc": "^3.0.3", "felixfbecker/language-server-protocol": "^1.5", "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.12", + "nikic/php-parser": "^4.13", "openlss/lib-array2xml": "^1.0", "php": "^7.1|^8", "sebastian/diff": "^3.0 || ^4.0", @@ -3629,7 +3629,7 @@ "inspection", "php" ], - "time": "2021-09-04T21:00:09+00:00" + "time": "2021-10-24T12:29:22+00:00" }, { "name": "webmozart/assert", diff --git a/modules/ppcp-button/services.php b/modules/ppcp-button/services.php index 89f138adc..fa14e181e 100644 --- a/modules/ppcp-button/services.php +++ b/modules/ppcp-button/services.php @@ -117,7 +117,6 @@ return array( $early_order_handler = $container->get( 'button.helper.early-order-handler' ); $registration_needed = $container->get( 'button.current-user-must-register' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); - $subscription_helper = $container->get( 'subscription.helper' ); return new CreateOrderEndpoint( $request_data, $cart_repository, @@ -128,8 +127,7 @@ return array( $settings, $early_order_handler, $registration_needed, - $logger, - $subscription_helper + $logger ); }, 'button.helper.early-order-handler' => static function ( ContainerInterface $container ) : EarlyOrderHandler { diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index 23dad7e96..ac4126f5b 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -167,6 +167,10 @@ class SmartButton implements SmartButtonInterface { */ public function render_wrapper(): bool { + if ( ! $this->can_save_vault_token() && $this->has_subscriptions() ) { + return false; + } + if ( $this->settings->has( 'enabled' ) && $this->settings->get( 'enabled' ) ) { $this->render_button_wrapper_registrar(); $this->render_message_wrapper_registrar(); @@ -373,6 +377,9 @@ class SmartButton implements SmartButtonInterface { if ( ! is_checkout() && ! $buttons_enabled ) { return false; } + if ( ! $this->can_save_vault_token() && $this->has_subscriptions() ) { + return false; + } $load_script = false; if ( is_checkout() && $this->settings->has( 'dcc_enabled' ) && $this->settings->get( 'dcc_enabled' ) ) { @@ -576,7 +583,7 @@ class SmartButton implements SmartButtonInterface { return false; } - return true; + return is_user_logged_in(); } /** diff --git a/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php index ae924c5e1..092954426 100644 --- a/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php @@ -23,7 +23,6 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory; use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository; use WooCommerce\PayPalCommerce\Button\Helper\EarlyOrderHandler; use WooCommerce\PayPalCommerce\Session\SessionHandler; -use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper; use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; @@ -118,11 +117,6 @@ class CreateOrderEndpoint implements EndpointInterface { */ protected $logger; - /** - * @var SubscriptionHelper - */ - protected $subscription_helper; - /** * CreateOrderEndpoint constructor. * @@ -147,8 +141,7 @@ class CreateOrderEndpoint implements EndpointInterface { Settings $settings, EarlyOrderHandler $early_order_handler, bool $registration_needed, - LoggerInterface $logger, - SubscriptionHelper $subscription_helper + LoggerInterface $logger ) { $this->request_data = $request_data; @@ -161,7 +154,6 @@ class CreateOrderEndpoint implements EndpointInterface { $this->early_order_handler = $early_order_handler; $this->registration_needed = $registration_needed; $this->logger = $logger; - $this->subscription_helper = $subscription_helper; } /** @@ -203,7 +195,7 @@ class CreateOrderEndpoint implements EndpointInterface { $this->set_bn_code( $data ); if ( 'checkout' === $data['context'] ) { - if ( $this->registration_needed || $this->subscription_helper->cart_contains_subscription() || ( isset( $data['createaccount'] ) && '1' === $data['createaccount'] ) ) { + if ( $this->registration_needed || ( isset( $data['createaccount'] ) && '1' === $data['createaccount'] ) ) { $this->process_checkout_form_when_creating_account( $data['form'], $wc_order ); } diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index cb7d39f2c..c806c76e5 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -117,7 +117,8 @@ return array( 'wcgateway.disabler' => static function ( ContainerInterface $container ): DisableGateways { $session_handler = $container->get( 'session.handler' ); $settings = $container->get( 'wcgateway.settings' ); - return new DisableGateways( $session_handler, $settings ); + $subscription_helper = $container->get( 'subscription.helper' ); + return new DisableGateways( $session_handler, $settings, $subscription_helper ); }, 'wcgateway.is-wc-payments-page' => static function ( ContainerInterface $container ): bool { $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; diff --git a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php index a29c11674..cf4a7291d 100644 --- a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php +++ b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php @@ -10,6 +10,7 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\WcGateway\Checkout; use WooCommerce\PayPalCommerce\Session\SessionHandler; +use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper; use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway; use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway; use Psr\Container\ContainerInterface; @@ -19,7 +20,6 @@ use Psr\Container\ContainerInterface; */ class DisableGateways { - /** * The Session Handler. * @@ -34,19 +34,29 @@ class DisableGateways { */ private $settings; + /** + * The subscription helper + * + * @var SubscriptionHelper + */ + private $subscription_helper; + /** * DisableGateways constructor. * * @param SessionHandler $session_handler The Session Handler. * @param ContainerInterface $settings The Settings. + * @param SubscriptionHelper $subscription_helper The subscription helper. */ public function __construct( SessionHandler $session_handler, - ContainerInterface $settings + ContainerInterface $settings, + SubscriptionHelper $subscription_helper ) { - $this->session_handler = $session_handler; - $this->settings = $settings; + $this->session_handler = $session_handler; + $this->settings = $settings; + $this->subscription_helper = $subscription_helper; } /** @@ -100,6 +110,10 @@ class DisableGateways { return true; } + if ( $this->subscription_helper->cart_contains_subscription() && ! is_user_logged_in() ) { + return true; + } + return false; } From 990c9f946e6501648b5caaa1934570b8d607cf4e Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 28 Oct 2021 12:43:02 +0200 Subject: [PATCH 4/6] Add user needs to be logged in message when subscription in the cart --- composer.lock | 21 +++++++++---------- .../src/Checkout/DisableGateways.php | 7 +++++++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/composer.lock b/composer.lock index 4e3fa6b9b..1c8ca84eb 100644 --- a/composer.lock +++ b/composer.lock @@ -735,16 +735,16 @@ }, { "name": "composer/semver", - "version": "3.2.5", + "version": "3.2.6", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" + "reference": "83e511e247de329283478496f7a1e114c9517506" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", + "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506", + "reference": "83e511e247de329283478496f7a1e114c9517506", "shasum": "" }, "require": { @@ -807,7 +807,7 @@ "type": "tidelift" } ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2021-10-25T11:34:17+00:00" }, { "name": "composer/xdebug-handler", @@ -2921,7 +2921,6 @@ "type": "github" } ], - "abandoned": true, "time": "2020-11-30T07:30:19+00:00" }, { @@ -3532,16 +3531,16 @@ }, { "name": "vimeo/psalm", - "version": "4.11.1", + "version": "4.11.2", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "e33492398bd4e5e2ab60e331d445979bd83feecd" + "reference": "6fba5eb554f9507b72932f9c75533d8af593688d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/e33492398bd4e5e2ab60e331d445979bd83feecd", - "reference": "e33492398bd4e5e2ab60e331d445979bd83feecd", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/6fba5eb554f9507b72932f9c75533d8af593688d", + "reference": "6fba5eb554f9507b72932f9c75533d8af593688d", "shasum": "" }, "require": { @@ -3629,7 +3628,7 @@ "inspection", "php" ], - "time": "2021-10-24T12:29:22+00:00" + "time": "2021-10-26T17:28:17+00:00" }, { "name": "webmozart/assert", diff --git a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php index cf4a7291d..20dab3d97 100644 --- a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php +++ b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php @@ -111,6 +111,13 @@ class DisableGateways { } if ( $this->subscription_helper->cart_contains_subscription() && ! is_user_logged_in() ) { + add_filter( + 'woocommerce_no_available_payment_methods_message', + function( $message ) { + return $message . '

' . esc_html__( 'PayPal payments needs you logged in to save the payment.', 'woocommerce-paypal-payments' ); + } + ); + return true; } From 4593f060ec9756dcc25ce5632153d9eeb2f48bd7 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Tue, 2 Nov 2021 12:01:29 +0100 Subject: [PATCH 5/6] Do not add message under subscriptions no available gateways notice --- modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php index 20dab3d97..cf4a7291d 100644 --- a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php +++ b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php @@ -111,13 +111,6 @@ class DisableGateways { } if ( $this->subscription_helper->cart_contains_subscription() && ! is_user_logged_in() ) { - add_filter( - 'woocommerce_no_available_payment_methods_message', - function( $message ) { - return $message . '

' . esc_html__( 'PayPal payments needs you logged in to save the payment.', 'woocommerce-paypal-payments' ); - } - ); - return true; } From 85b8179307b413e0ca72e193c312ee1c63b82164 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 4 Nov 2021 15:48:19 +0100 Subject: [PATCH 6/6] Add space after if --- .../resources/js/modules/Renderer/CreditCardRenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js index f8e3b503f..72206247a 100644 --- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js +++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js @@ -184,7 +184,7 @@ class CreditCardRenderer { const save_card = this.defaultConfig.save_card ? true : false; let vault = document.getElementById('ppcp-credit-card-vault') ? document.getElementById('ppcp-credit-card-vault').checked : save_card; - if(this.defaultConfig.enforce_vault) { + if (this.defaultConfig.enforce_vault) { vault = true; } const contingency = this.defaultConfig.hosted_fields.contingency;