From dc9ad87b3e6796e85d1883dd6abb03cb42894a20 Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Mon, 8 Jan 2024 12:40:56 +0100 Subject: [PATCH] Allow create payment when changing subscription payment method (WIP) --- .../ppcp-button/src/Helper/ContextTrait.php | 13 +++ .../resources/js/add-payment-method.js | 87 ++++++++++--------- .../src/SavePaymentMethodsModule.php | 2 +- 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/modules/ppcp-button/src/Helper/ContextTrait.php b/modules/ppcp-button/src/Helper/ContextTrait.php index a02a79709..9b5874bfa 100644 --- a/modules/ppcp-button/src/Helper/ContextTrait.php +++ b/modules/ppcp-button/src/Helper/ContextTrait.php @@ -212,6 +212,19 @@ trait ContextTrait { return $page_id && is_page( $page_id ) && isset( $wp->query_vars['add-payment-method'] ); } + /** + * Checks whether this user is changing the payment method for a subscription. + * + * @return bool + */ + private function is_subscription_change_payment_method_page(): bool { + if ( isset( $_GET['change_payment_method'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + return wcs_is_subscription( wc_clean( wp_unslash( $_GET['change_payment_method'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + + return false; + } + /** * Checks if it is the block editor page. */ diff --git a/modules/ppcp-save-payment-methods/resources/js/add-payment-method.js b/modules/ppcp-save-payment-methods/resources/js/add-payment-method.js index d861421e4..6be53940c 100644 --- a/modules/ppcp-save-payment-methods/resources/js/add-payment-method.js +++ b/modules/ppcp-save-payment-methods/resources/js/add-payment-method.js @@ -38,54 +38,57 @@ document.addEventListener( .then((paypal) => { errorHandler.clear(); - paypal.Buttons( - { - createVaultSetupToken: async () => { - const response = await fetch(ppcp_add_payment_method.ajax.create_setup_token.endpoint, { - method: "POST", - credentials: 'same-origin', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - nonce: ppcp_add_payment_method.ajax.create_setup_token.nonce, + const paypalButtonContainer = document.querySelector(`#ppc-button-${PaymentMethods.PAYPAL}-save-payment-method`); + if(paypalButtonContainer) { + paypal.Buttons( + { + createVaultSetupToken: async () => { + const response = await fetch(ppcp_add_payment_method.ajax.create_setup_token.endpoint, { + method: "POST", + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + nonce: ppcp_add_payment_method.ajax.create_setup_token.nonce, + }) }) - }) - const result = await response.json() - if (result.data.id) { - return result.data.id - } + const result = await response.json() + if (result.data.id) { + return result.data.id + } - errorHandler.message(ppcp_add_payment_method.error_message); - }, - onApprove: async ({vaultSetupToken}) => { - const response = await fetch(ppcp_add_payment_method.ajax.create_payment_token.endpoint, { - method: "POST", - credentials: 'same-origin', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - nonce: ppcp_add_payment_method.ajax.create_payment_token.nonce, - vault_setup_token: vaultSetupToken, + errorHandler.message(ppcp_add_payment_method.error_message); + }, + onApprove: async ({vaultSetupToken}) => { + const response = await fetch(ppcp_add_payment_method.ajax.create_payment_token.endpoint, { + method: "POST", + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + nonce: ppcp_add_payment_method.ajax.create_payment_token.nonce, + vault_setup_token: vaultSetupToken, + }) }) - }) - const result = await response.json(); - if(result.success === true) { - window.location.href = ppcp_add_payment_method.payment_methods_page; - return; + const result = await response.json(); + if(result.success === true) { + window.location.href = ppcp_add_payment_method.payment_methods_page; + return; + } + + errorHandler.message(ppcp_add_payment_method.error_message); + }, + onError: (error) => { + console.error(error) + errorHandler.message(ppcp_add_payment_method.error_message); } - - errorHandler.message(ppcp_add_payment_method.error_message); }, - onError: (error) => { - console.error(error) - errorHandler.message(ppcp_add_payment_method.error_message); - } - }, - ).render(`#ppc-button-${PaymentMethods.PAYPAL}-save-payment-method`); + ).render(`#ppc-button-${PaymentMethods.PAYPAL}-save-payment-method`); + } const cardField = paypal.CardFields({ createVaultSetupToken: async () => { @@ -167,7 +170,7 @@ document.addEventListener( } } - document.querySelector('#place_order').addEventListener("click", (event) => { + document.querySelector('#place_order')?.addEventListener("click", (event) => { event.preventDefault(); cardField.submit() diff --git a/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php b/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php index 3501d71aa..9b055b415 100644 --- a/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php +++ b/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php @@ -176,7 +176,7 @@ class SavePaymentMethodsModule implements ModuleInterface { add_action( 'wp_enqueue_scripts', function() use ( $c ) { - if ( ! is_user_logged_in() || ! $this->is_add_payment_method_page() ) { + if ( ! is_user_logged_in() || ! ( $this->is_add_payment_method_page() || $this->is_subscription_change_payment_method_page() ) ) { return; }