From 076a124ec725a4f0454ad9dd73c09fea3961d467 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Tue, 15 Jun 2021 12:48:01 +0200 Subject: [PATCH] Validate checkout form before creating PayPal order when creating account on checkout --- .../ActionHandler/CheckoutActionHandler.js | 5 +++- .../Endpoint/class-createorderendpoint.php | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js b/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js index 03451c144..6f5c9e48a 100644 --- a/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js +++ b/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js @@ -21,6 +21,8 @@ class CheckoutActionHandler { const formSelector = this.config.context === 'checkout' ? 'form.checkout' : 'form#order_review'; const formValues = jQuery(formSelector).serialize(); + const createaccount = jQuery('#createaccount').is(":checked") ? true : false; + return fetch(this.config.ajax.create_order.endpoint, { method: 'POST', body: JSON.stringify({ @@ -29,7 +31,8 @@ class CheckoutActionHandler { bn_code:bnCode, context:this.config.context, order_id:this.config.order_id, - form:formValues + form:formValues, + createaccount: createaccount }) }).then(function (res) { return res.json(); diff --git a/modules/ppcp-button/src/Endpoint/class-createorderendpoint.php b/modules/ppcp-button/src/Endpoint/class-createorderendpoint.php index 79e9a4185..932ca01a7 100644 --- a/modules/ppcp-button/src/Endpoint/class-createorderendpoint.php +++ b/modules/ppcp-button/src/Endpoint/class-createorderendpoint.php @@ -174,6 +174,36 @@ class CreateOrderEndpoint implements EndpointInterface { $this->set_bn_code( $data ); if ( 'checkout' === $data['context'] ) { + if ( '1' === $data['createaccount'] ) { + $form_values = explode( '&', $data['form'] ); + $parsed_values = array(); + foreach ( $form_values as $field ) { + $field = explode( '=', $field ); + + if ( count( $field ) !== 2 ) { + continue; + } + $parsed_values[ $field[0] ] = $field[1]; + } + $_POST = $parsed_values; + $_REQUEST = $parsed_values; + + add_action( + 'woocommerce_after_checkout_validation', + function( array $data, \WP_Error $errors ) use ( $wc_order ) { + if ( ! $errors->errors ) { + $order = $this->create_paypal_order( $wc_order ); + wp_send_json_success( $order->to_array() ); + return true; + } + }, + 10, + 2 + ); + + $checkout = \WC()->checkout(); + $checkout->process_checkout(); + } $this->process_checkout_form( $data['form'] ); } if ( 'pay-now' === $data['context'] && get_option( 'woocommerce_terms_page_id', '' ) !== '' ) {