Add save card payment for changing subscription payment method (WIP)

This commit is contained in:
Emili Castells Guasch 2024-01-08 17:47:52 +01:00
parent f081fc2392
commit 0262c28580
7 changed files with 149 additions and 19 deletions

View file

@ -128,6 +128,33 @@ document.addEventListener(
const result = await response.json();
if(result.success === true) {
if(ppcp_add_payment_method.is_subscription_change_payment_page) {
const subscriptionId = ppcp_add_payment_method.subscription_id_to_change_payment;
if(subscriptionId && result.data) {
const req = await fetch(ppcp_add_payment_method.ajax.subscription_change_payment_method.endpoint, {
method: "POST",
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
nonce: ppcp_add_payment_method.ajax.subscription_change_payment_method.nonce,
subscription_id: subscriptionId,
payment_method: getCurrentPaymentMethod(),
wc_payment_token_id: result.data
})
});
const res = await req.json();
if (res.success === true) {
window.location.href = `${ppcp_add_payment_method.view_subscriptions_page}/${subscriptionId}`;
return;
}
}
return;
}
window.location.href = ppcp_add_payment_method.payment_methods_page;
return;
}

View file

@ -80,7 +80,8 @@ class CreatePaymentToken implements EndpointInterface {
*/
public function handle_request(): bool {
try {
$data = $this->request_data->read_request( $this->nonce() );
$data = $this->request_data->read_request( $this->nonce() );
$wc_token_id = 0;
/**
* Suppress ArgumentTypeCoercion
@ -107,7 +108,7 @@ class CreatePaymentToken implements EndpointInterface {
$email = $result->payment_source->paypal->email_address;
}
$this->wc_payment_tokens->create_payment_token_paypal(
$wc_token_id = $this->wc_payment_tokens->create_payment_token_paypal(
$current_user_id,
$result->id,
$email
@ -115,11 +116,11 @@ class CreatePaymentToken implements EndpointInterface {
}
if ( isset( $result->payment_source->card ) ) {
$this->wc_payment_tokens->create_payment_token_card( $current_user_id, $result );
$wc_token_id = $this->wc_payment_tokens->create_payment_token_card( $current_user_id, $result );
}
}
wp_send_json_success( $result );
wp_send_json_success( $wc_token_id );
return true;
} catch ( Exception $exception ) {
wp_send_json_error();

View file

@ -28,6 +28,7 @@ use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
use WooCommerce\PayPalCommerce\WcSubscriptions\Endpoint\SubscriptionChangePaymentMethod;
/**
* Class SavePaymentMethodsModule
@ -211,13 +212,16 @@ class SavePaymentMethodsModule implements ModuleInterface {
'ppcp-add-payment-method',
'ppcp_add_payment_method',
array(
'client_id' => $c->get( 'button.client_id' ),
'merchant_id' => $c->get( 'api.merchant_id' ),
'id_token' => $id_token,
'payment_methods_page' => wc_get_account_endpoint_url( 'payment-methods' ),
'error_message' => __( 'Could not save payment method.', 'woocommerce-paypal-payments' ),
'verification_method' => $verification_method,
'ajax' => array(
'client_id' => $c->get( 'button.client_id' ),
'merchant_id' => $c->get( 'api.merchant_id' ),
'id_token' => $id_token,
'payment_methods_page' => wc_get_account_endpoint_url( 'payment-methods' ),
'view_subscriptions_page' => wc_get_account_endpoint_url( 'view-subscription' ),
'is_subscription_change_payment_page' => $this->is_subscription_change_payment_method_page(),
'subscription_id_to_change_payment' => $this->is_subscription_change_payment_method_page() ? (int) $_GET['change_payment_method'] : 0,
'error_message' => __( 'Could not save payment method.', 'woocommerce-paypal-payments' ),
'verification_method' => $verification_method,
'ajax' => array(
'create_setup_token' => array(
'endpoint' => \WC_AJAX::get_endpoint( CreateSetupToken::ENDPOINT ),
'nonce' => wp_create_nonce( CreateSetupToken::nonce() ),
@ -226,6 +230,10 @@ class SavePaymentMethodsModule implements ModuleInterface {
'endpoint' => \WC_AJAX::get_endpoint( CreatePaymentToken::ENDPOINT ),
'nonce' => wp_create_nonce( CreatePaymentToken::nonce() ),
),
'subscription_change_payment_method' => array(
'endpoint' => \WC_AJAX::get_endpoint( SubscriptionChangePaymentMethod::ENDPOINT ),
'nonce' => wp_create_nonce( SubscriptionChangePaymentMethod::nonce() ),
),
),
)
);

View file

@ -70,17 +70,17 @@ class WooCommercePaymentTokens {
* @param string $token The PayPal payment token.
* @param string $email The PayPal customer email.
*
* @return void
* @return int
*/
public function create_payment_token_paypal(
int $customer_id,
string $token,
string $email
): void {
): int {
$wc_tokens = WC_Payment_Tokens::get_customer_tokens( $customer_id, PayPalGateway::ID );
if ( $this->payment_token_helper->token_exist( $wc_tokens, $token ) ) {
return;
return 0;
}
$payment_token_paypal = $this->payment_token_factory->create( 'paypal' );
@ -101,6 +101,8 @@ class WooCommercePaymentTokens {
"Could not create WC payment token PayPal for customer {$customer_id}. " . $exception->getMessage()
);
}
return $payment_token_paypal->get_id();
}
/**
@ -109,12 +111,12 @@ class WooCommercePaymentTokens {
* @param int $customer_id The WC customer ID.
* @param stdClass $payment_token The Credit Card payment token.
*
* @return void
* @return int
*/
public function create_payment_token_card( int $customer_id, stdClass $payment_token ): void {
public function create_payment_token_card( int $customer_id, stdClass $payment_token ): int {
$wc_tokens = WC_Payment_Tokens::get_customer_tokens( $customer_id, CreditCardGateway::ID );
if ( $this->payment_token_helper->token_exist( $wc_tokens, $payment_token->id ) ) {
return;
return 0;
}
$token = new WC_Payment_Token_CC();
@ -139,6 +141,8 @@ class WooCommercePaymentTokens {
"Could not create WC payment token card for customer {$customer_id}. " . $exception->getMessage()
);
}
$token->save();
return $token->get_id();
}
}