mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-06 18:16:38 +08:00
Add card payment token for free trial subscriptions (WIP)
This commit is contained in:
parent
112b98875b
commit
efbd36025d
5 changed files with 134 additions and 6 deletions
|
@ -7,6 +7,7 @@ import Renderer from './modules/Renderer/Renderer';
|
||||||
import ErrorHandler from './modules/ErrorHandler';
|
import ErrorHandler from './modules/ErrorHandler';
|
||||||
import HostedFieldsRenderer from './modules/Renderer/HostedFieldsRenderer';
|
import HostedFieldsRenderer from './modules/Renderer/HostedFieldsRenderer';
|
||||||
import CardFieldsRenderer from './modules/Renderer/CardFieldsRenderer';
|
import CardFieldsRenderer from './modules/Renderer/CardFieldsRenderer';
|
||||||
|
import CardFieldsFreeTrialRenderer from './modules/Renderer/CardFieldsFreeTrialRenderer';
|
||||||
import MessageRenderer from './modules/Renderer/MessageRenderer';
|
import MessageRenderer from './modules/Renderer/MessageRenderer';
|
||||||
import Spinner from './modules/Helper/Spinner';
|
import Spinner from './modules/Helper/Spinner';
|
||||||
import {
|
import {
|
||||||
|
@ -215,6 +216,13 @@ const bootstrap = () => {
|
||||||
spinner
|
spinner
|
||||||
);
|
);
|
||||||
if ( typeof paypal.CardFields !== 'undefined' ) {
|
if ( typeof paypal.CardFields !== 'undefined' ) {
|
||||||
|
if ( PayPalCommerceGateway.is_free_trial_cart ) {
|
||||||
|
creditCardRenderer = new CardFieldsFreeTrialRenderer(
|
||||||
|
PayPalCommerceGateway,
|
||||||
|
errorHandler,
|
||||||
|
spinner
|
||||||
|
);
|
||||||
|
} else {
|
||||||
creditCardRenderer = new CardFieldsRenderer(
|
creditCardRenderer = new CardFieldsRenderer(
|
||||||
PayPalCommerceGateway,
|
PayPalCommerceGateway,
|
||||||
errorHandler,
|
errorHandler,
|
||||||
|
@ -222,6 +230,7 @@ const bootstrap = () => {
|
||||||
onCardFieldsBeforeSubmit
|
onCardFieldsBeforeSubmit
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const renderer = new Renderer(
|
const renderer = new Renderer(
|
||||||
creditCardRenderer,
|
creditCardRenderer,
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
import { show } from '../Helper/Hiding';
|
||||||
|
import ErrorHandler from '../ErrorHandler';
|
||||||
|
import RenderCardFields from '../../../../../ppcp-save-payment-methods/resources/js/RenderCardFields';
|
||||||
|
import Configuration from '../../../../../ppcp-save-payment-methods/resources/js/Configuration';
|
||||||
|
|
||||||
|
class CardFieldsFreeTrialRenderer {
|
||||||
|
constructor( defaultConfig, errorHandler, spinner ) {
|
||||||
|
this.defaultConfig = defaultConfig;
|
||||||
|
this.errorHandler = errorHandler;
|
||||||
|
this.spinner = spinner;
|
||||||
|
}
|
||||||
|
|
||||||
|
render( wrapper, contextConfig ) {
|
||||||
|
if (
|
||||||
|
( this.defaultConfig.context !== 'checkout' &&
|
||||||
|
this.defaultConfig.context !== 'pay-now' ) ||
|
||||||
|
wrapper === null ||
|
||||||
|
document.querySelector( wrapper ) === null
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const buttonSelector = wrapper + ' button';
|
||||||
|
|
||||||
|
const gateWayBox = document.querySelector(
|
||||||
|
'.payment_box.payment_method_ppcp-credit-card-gateway'
|
||||||
|
);
|
||||||
|
if ( ! gateWayBox ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const oldDisplayStyle = gateWayBox.style.display;
|
||||||
|
gateWayBox.style.display = 'block';
|
||||||
|
|
||||||
|
const hideDccGateway = document.querySelector( '#ppcp-hide-dcc' );
|
||||||
|
if ( hideDccGateway ) {
|
||||||
|
hideDccGateway.parentNode.removeChild( hideDccGateway );
|
||||||
|
}
|
||||||
|
|
||||||
|
const errorHandler = new ErrorHandler(
|
||||||
|
this.defaultConfig.labels.error.generic,
|
||||||
|
document.querySelector( '.woocommerce-notices-wrapper' )
|
||||||
|
);
|
||||||
|
errorHandler.clear();
|
||||||
|
|
||||||
|
const configuration = new Configuration(
|
||||||
|
this.defaultConfig,
|
||||||
|
errorHandler
|
||||||
|
);
|
||||||
|
|
||||||
|
const cardFields = paypal.CardFields(
|
||||||
|
configuration.cardFieldsConfiguration()
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( cardFields.isEligible() ) {
|
||||||
|
const renderCardFields = new RenderCardFields( cardFields );
|
||||||
|
renderCardFields.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
gateWayBox.style.display = oldDisplayStyle;
|
||||||
|
|
||||||
|
show( buttonSelector );
|
||||||
|
|
||||||
|
if ( this.defaultConfig.cart_contains_subscription ) {
|
||||||
|
const saveToAccount = document.querySelector(
|
||||||
|
'#wc-ppcp-credit-card-gateway-new-payment-method'
|
||||||
|
);
|
||||||
|
if ( saveToAccount ) {
|
||||||
|
saveToAccount.checked = true;
|
||||||
|
saveToAccount.disabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document
|
||||||
|
.querySelector( buttonSelector )
|
||||||
|
?.addEventListener( 'click', ( event ) => {
|
||||||
|
event.preventDefault();
|
||||||
|
this.spinner.block();
|
||||||
|
this.errorHandler.clear();
|
||||||
|
|
||||||
|
cardFields.submit().catch( ( error ) => {
|
||||||
|
console.error( error );
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
disableFields() {}
|
||||||
|
enableFields() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CardFieldsFreeTrialRenderer;
|
|
@ -108,6 +108,8 @@ class Configuration {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onApprove: async ( { vaultSetupToken } ) => {
|
onApprove: async ( { vaultSetupToken } ) => {
|
||||||
|
const isFreeTrialCart =
|
||||||
|
this.ppcp_add_payment_method?.is_free_trial_cart ?? false;
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
this.ppcp_add_payment_method.ajax.create_payment_token
|
this.ppcp_add_payment_method.ajax.create_payment_token
|
||||||
.endpoint,
|
.endpoint,
|
||||||
|
@ -122,12 +124,19 @@ class Configuration {
|
||||||
.create_payment_token.nonce,
|
.create_payment_token.nonce,
|
||||||
vault_setup_token: vaultSetupToken,
|
vault_setup_token: vaultSetupToken,
|
||||||
payment_method: PaymentMethods.CARDS,
|
payment_method: PaymentMethods.CARDS,
|
||||||
|
is_free_trial_cart: isFreeTrialCart,
|
||||||
} ),
|
} ),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const result = await response.json();
|
const result = await response.json();
|
||||||
if ( result.success === true ) {
|
if ( result.success === true ) {
|
||||||
|
const context = this.ppcp_add_payment_method?.context ?? '';
|
||||||
|
if ( context === 'checkout' ) {
|
||||||
|
document.querySelector( '#place_order' ).click();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
this.ppcp_add_payment_method
|
this.ppcp_add_payment_method
|
||||||
.is_subscription_change_payment_page
|
.is_subscription_change_payment_page
|
||||||
|
|
|
@ -115,6 +115,11 @@ class CreatePaymentToken implements EndpointInterface {
|
||||||
|
|
||||||
if ( isset( $result->payment_source->card ) ) {
|
if ( isset( $result->payment_source->card ) ) {
|
||||||
$wc_token_id = $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 );
|
||||||
|
|
||||||
|
$is_free_trial_cart = $data['is_free_trial_cart'] ?? '';
|
||||||
|
if($is_free_trial_cart === '1') {
|
||||||
|
WC()->session->set( 'ppcp_card_payment_token_for_free_trial', $wc_token_id );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -426,12 +426,26 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
|
||||||
public function process_payment( $order_id ) {
|
public function process_payment( $order_id ) {
|
||||||
$wc_order = wc_get_order( $order_id );
|
$wc_order = wc_get_order( $order_id );
|
||||||
if ( ! is_a( $wc_order, WC_Order::class ) ) {
|
if ( ! is_a( $wc_order, WC_Order::class ) ) {
|
||||||
|
WC()->session->set( 'ppcp_card_payment_token_for_free_trial', null );
|
||||||
|
|
||||||
return $this->handle_payment_failure(
|
return $this->handle_payment_failure(
|
||||||
null,
|
null,
|
||||||
new GatewayGenericException( new Exception( 'WC order was not found.' ) )
|
new GatewayGenericException( new Exception( 'WC order was not found.' ) )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$card_payment_token_for_free_trial = WC()->session->get( 'ppcp_card_payment_token_for_free_trial') ?? null;
|
||||||
|
WC()->session->set( 'ppcp_card_payment_token_for_free_trial', null );
|
||||||
|
if($card_payment_token_for_free_trial) {
|
||||||
|
$tokens = WC_Payment_Tokens::get_customer_tokens( get_current_user_id() );
|
||||||
|
foreach ( $tokens as $token ) {
|
||||||
|
if ( $token->get_id() === (int) $card_payment_token_for_free_trial ) {
|
||||||
|
$wc_order->payment_complete();
|
||||||
|
return $this->handle_payment_success( $wc_order );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// phpcs:ignore WordPress.Security.NonceVerification.Missing
|
// phpcs:ignore WordPress.Security.NonceVerification.Missing
|
||||||
$card_payment_token_id = wc_clean( wp_unslash( $_POST['wc-ppcp-credit-card-gateway-payment-token'] ?? '' ) );
|
$card_payment_token_id = wc_clean( wp_unslash( $_POST['wc-ppcp-credit-card-gateway-payment-token'] ?? '' ) );
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue