diff --git a/changelog/poc-google-pay-as-payment-method b/changelog/poc-google-pay-as-payment-method new file mode 100644 index 00000000000..5cc941b4c74 --- /dev/null +++ b/changelog/poc-google-pay-as-payment-method @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +POC: Google Pay as a payment method diff --git a/client/checkout/blocks/index.js b/client/checkout/blocks/index.js index 418c5c1852c..ba4cdb0c412 100644 --- a/client/checkout/blocks/index.js +++ b/client/checkout/blocks/index.js @@ -21,6 +21,7 @@ import enqueueFraudScripts from 'fraud-scripts'; import { expressCheckoutElementApplePay, expressCheckoutElementGooglePay, + paymentMethodGooglePay, } from 'wcpay/express-checkout/blocks'; import { getDeferredIntentCreationUPEFields } from './payment-elements'; @@ -111,6 +112,8 @@ const addCheckoutTracking = () => { } }; +registerPaymentMethod( paymentMethodGooglePay( api ) ); + // Call handleWooPayEmailInput if woopay is enabled and this is the checkout page. if ( getUPEConfig( 'isWooPayEnabled' ) ) { if ( diff --git a/client/express-checkout/blocks/components/express-checkout-component.js b/client/express-checkout/blocks/components/express-checkout-component.js index 88fcc160166..e8dbe196ddf 100644 --- a/client/express-checkout/blocks/components/express-checkout-component.js +++ b/client/express-checkout/blocks/components/express-checkout-component.js @@ -81,6 +81,7 @@ const ExpressCheckoutComponent = ( { expressPaymentMethod = '', buttonAttributes, isPreview = false, + eventRegistration, } ) => { const { buttonOptions, @@ -96,6 +97,7 @@ const ExpressCheckoutComponent = ( { onClick, onClose, setExpressPaymentError, + eventRegistration, } ); const onClickHandler = ! isPreview ? onButtonClick : () => {}; const onShippingAddressChange = ( event ) => diff --git a/client/express-checkout/blocks/hooks/use-express-checkout.js b/client/express-checkout/blocks/hooks/use-express-checkout.js index a3f28340342..bd4fb5801bf 100644 --- a/client/express-checkout/blocks/hooks/use-express-checkout.js +++ b/client/express-checkout/blocks/hooks/use-express-checkout.js @@ -31,6 +31,7 @@ export const useExpressCheckout = ( { onClick, onClose, setExpressPaymentError, + eventRegistration, } ) => { const stripe = useStripe(); const elements = useElements(); @@ -39,7 +40,7 @@ export const useExpressCheckout = ( { const onCancel = () => { onCancelHandler(); - onClose(); + onClose?.(); }; const completePayment = ( redirectUrl ) => { @@ -54,13 +55,23 @@ export const useExpressCheckout = ( { const onButtonClick = useCallback( ( event ) => { + if ( eventRegistration?.onPlaceOrderButtonValidation ) { + const validationResult = eventRegistration.onPlaceOrderButtonValidation(); + console.log( '### vr', validationResult ); + if ( ! validationResult ) { + return; + } + } + // If login is required for checkout, display redirect confirmation dialog. if ( getExpressCheckoutData( 'login_confirmation' ) ) { displayLoginConfirmation( event.expressPaymentType ); return; } - const shippingAddressRequired = shippingData?.needsShipping; + const shippingAddressRequired = eventRegistration?.onPlaceOrderButtonValidation + ? false + : shippingData?.needsShipping; let shippingRates; if ( shippingAddressRequired ) { @@ -122,7 +133,7 @@ export const useExpressCheckout = ( { }; // Click event from WC Blocks. - onClick(); + onClick?.(); // Global click event handler from WooPayments to ECE. onClickHandler( event ); event.resolve( options ); @@ -133,6 +144,7 @@ export const useExpressCheckout = ( { billing.cartTotal.value, shippingData.needsShipping, shippingData.shippingRates, + eventRegistration, ] ); diff --git a/client/express-checkout/blocks/index.js b/client/express-checkout/blocks/index.js index 5968b3ca04a..54d3df51008 100644 --- a/client/express-checkout/blocks/index.js +++ b/client/express-checkout/blocks/index.js @@ -77,3 +77,36 @@ export const expressCheckoutElementGooglePay = ( api ) => ( { return checkPaymentMethodIsAvailable( 'googlePay', cart, api ); }, } ); + +const CustomWrapper = ( { children } ) =>
{ children }
; +export const paymentMethodGooglePay = ( api ) => { + return { + name: 'woocommerce_payments_googlePay', + edit: , + content: , + paymentMethodId: 'woocommerce_payments_googlePay', + placeOrderButton: ( props ) => { + return ( + + ); + }, + label: 'Google Pay - WooPayments', + ariaLabel: 'Google Pay - WooPayments', + supports: { + showSavedCards: false, + showSaveOption: false, + features: getConfig( 'features' ), + }, + canMakePayment: ( { cart } ) => { + if ( typeof wcpayExpressCheckoutParams === 'undefined' ) { + return false; + } + + return checkPaymentMethodIsAvailable( 'googlePay', cart ); + }, + }; +}; diff --git a/includes/class-wc-gateway-google-pay.php b/includes/class-wc-gateway-google-pay.php new file mode 100644 index 00000000000..9ccff6fb631 --- /dev/null +++ b/includes/class-wc-gateway-google-pay.php @@ -0,0 +1,43 @@ +id = 'woocommerce_payments_googlePay'; + $this->method_title = __( 'Google Pay', 'woocommerce-payments' ); + $this->title = __( 'Google Pay', 'woocommerce-payments' ); + $this->has_fields = false; + $this->enabled = true; + $this->description = ''; + $this->supports = [ + 'products', + 'refunds', + ]; + } + + /** + * Make this gateway always available. + * + * @return bool + */ + public function is_available() { + return true; + } +} diff --git a/includes/class-wc-payments.php b/includes/class-wc-payments.php index a551054e662..c71cbb7a56e 100644 --- a/includes/class-wc-payments.php +++ b/includes/class-wc-payments.php @@ -881,6 +881,9 @@ public static function register_gateway( $gateways ) { $gateways[] = self::get_payment_gateway_by_id( $payment_method_id ); } + require_once WCPAY_ABSPATH . '/includes/class-wc-gateway-google-pay.php'; + $gateways[] = 'WC_Gateway_Google_Pay'; + return $gateways; }