From b9cdc56ad6aea1f71f37cc1f682781e57949af06 Mon Sep 17 00:00:00 2001 From: Narek Zakarian Date: Tue, 24 May 2022 18:35:39 +0400 Subject: [PATCH 01/17] Convert the "," separator into "." before checking the price amount. --- .../js/modules/ContextBootstrap/SingleProductBootstap.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/SingleProductBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/SingleProductBootstap.js index 8192be38f..3212cbdcc 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/SingleProductBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/SingleProductBootstap.js @@ -51,6 +51,8 @@ class SingleProductBootstap { else if (document.querySelector('.product .woocommerce-Price-amount')) { priceText = document.querySelector('.product .woocommerce-Price-amount').innerText; } + + priceText = priceText.replace(/,/g, '.'); const amount = parseFloat(priceText.replace(/([^\d,\.\s]*)/g, '')); return amount === 0; From f54451f39c8378570f8ba2d9d3a8d651e3947f57 Mon Sep 17 00:00:00 2001 From: Alex P Date: Mon, 30 May 2022 15:09:41 +0300 Subject: [PATCH 02/17] Fix disable-funding when free trial but dcc disabled was sending array values instead of keys --- modules/ppcp-button/src/Assets/SmartButton.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index f15b8c800..c63002c17 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -922,9 +922,9 @@ class SmartButton implements SmartButtonInterface { } if ( $this->is_free_trial_cart() ) { - $all_sources = $this->all_funding_sources; + $all_sources = array_keys( $this->all_funding_sources ); if ( $is_dcc_enabled ) { - $all_sources = array_keys( array_diff_key( $all_sources, array( 'card' => '' ) ) ); + $all_sources = array_diff( $all_sources, array( 'card' ) ); } $disable_funding = $all_sources; } From 8a51994db894340df6de881398e3bba9cb1bc990 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 2 Jun 2022 11:33:07 +0200 Subject: [PATCH 03/17] Do not throw but set empty string when no country code is received --- modules/ppcp-api-client/src/Factory/AddressFactory.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/ppcp-api-client/src/Factory/AddressFactory.php b/modules/ppcp-api-client/src/Factory/AddressFactory.php index a996b9ce7..d610c56ad 100644 --- a/modules/ppcp-api-client/src/Factory/AddressFactory.php +++ b/modules/ppcp-api-client/src/Factory/AddressFactory.php @@ -69,13 +69,8 @@ class AddressFactory { * @throws RuntimeException When JSON object is malformed. */ public function from_paypal_response( \stdClass $data ): Address { - if ( ! isset( $data->country_code ) ) { - throw new RuntimeException( - __( 'No country given for address.', 'woocommerce-paypal-payments' ) - ); - } return new Address( - $data->country_code, + ( isset( $data->country_code ) ) ? $data->country_code : '', ( isset( $data->address_line_1 ) ) ? $data->address_line_1 : '', ( isset( $data->address_line_2 ) ) ? $data->address_line_2 : '', ( isset( $data->admin_area_1 ) ) ? $data->admin_area_1 : '', From 062c08f19fa40a0d0ea5066e32914d62ec00311f Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 2 Jun 2022 11:37:53 +0200 Subject: [PATCH 04/17] Remove unit test --- .../ApiClient/Factory/AddressFactoryTest.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/tests/PHPUnit/ApiClient/Factory/AddressFactoryTest.php b/tests/PHPUnit/ApiClient/Factory/AddressFactoryTest.php index 81f8146fd..a47ec7d13 100644 --- a/tests/PHPUnit/ApiClient/Factory/AddressFactoryTest.php +++ b/tests/PHPUnit/ApiClient/Factory/AddressFactoryTest.php @@ -127,21 +127,6 @@ class AddressFactoryTest extends TestCase $this->assertEquals($expectedPostalCode, $result->postal_code()); } - public function testFromPayPalRequestThrowsError() - { - $testee = new AddressFactory(); - - $data = (object) [ - 'address_line_1' => 'shipping_address_1', - 'address_line_2' => 'shipping_address_2', - 'admin_area_1' => 'shipping_admin_area_1', - 'admin_area_2' => 'shipping_admin_area_2', - 'postal_code' => 'shipping_postcode', - ]; - $this->expectException(RuntimeException::class); - $testee->from_paypal_response($data); - } - public function dataFromPayPalRequest() : array { return [ From 0a993f854df58b7eeb8d8a1e11a2267b8ab5e44f Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 2 Jun 2022 15:11:01 +0200 Subject: [PATCH 05/17] Do not check order approved status if it does not contains physical goods --- modules/ppcp-api-client/services.php | 4 +++ .../src/Helper/OrderHelper.php | 34 +++++++++++++++++++ modules/ppcp-button/services.php | 2 ++ .../src/Endpoint/ApproveOrderEndpoint.php | 14 ++++++-- modules/ppcp-wc-gateway/services.php | 4 ++- .../src/Processor/OrderProcessor.php | 15 ++++++-- .../Processor/OrderProcessorTest.php | 23 +++++++++++-- 7 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 modules/ppcp-api-client/src/Helper/OrderHelper.php diff --git a/modules/ppcp-api-client/services.php b/modules/ppcp-api-client/services.php index 24bcd1a21..6be5355be 100644 --- a/modules/ppcp-api-client/services.php +++ b/modules/ppcp-api-client/services.php @@ -47,6 +47,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory; use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory; use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository; use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository; use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository; @@ -671,4 +672,7 @@ return array( 'SE', ); }, + 'api.order-helper' => static function( ContainerInterface $container ): OrderHelper { + return new OrderHelper(); + }, ); diff --git a/modules/ppcp-api-client/src/Helper/OrderHelper.php b/modules/ppcp-api-client/src/Helper/OrderHelper.php new file mode 100644 index 000000000..79a5d78c0 --- /dev/null +++ b/modules/ppcp-api-client/src/Helper/OrderHelper.php @@ -0,0 +1,34 @@ +purchase_units() as $unit ) { + if ( $unit->contains_physical_goods() ) { + return true; + } + } + + return false; + } +} diff --git a/modules/ppcp-button/services.php b/modules/ppcp-button/services.php index 227dc2fb5..f8b6c415e 100644 --- a/modules/ppcp-button/services.php +++ b/modules/ppcp-button/services.php @@ -151,6 +151,7 @@ return array( $three_d_secure = $container->get( 'button.helper.three-d-secure' ); $settings = $container->get( 'wcgateway.settings' ); $dcc_applies = $container->get( 'api.helpers.dccapplies' ); + $order_helper = $container->get( 'api.order-helper' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); return new ApproveOrderEndpoint( $request_data, @@ -159,6 +160,7 @@ return array( $three_d_secure, $settings, $dcc_applies, + $order_helper, $logger ); }, diff --git a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php index bfbde9923..f9966aea6 100644 --- a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php @@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Session\SessionHandler; @@ -26,7 +27,6 @@ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; */ class ApproveOrderEndpoint implements EndpointInterface { - const ENDPOINT = 'ppc-approve-order'; /** @@ -71,6 +71,13 @@ class ApproveOrderEndpoint implements EndpointInterface { */ private $dcc_applies; + /** + * The order helper. + * + * @var OrderHelper + */ + protected $order_helper; + /** * The logger. * @@ -87,6 +94,7 @@ class ApproveOrderEndpoint implements EndpointInterface { * @param ThreeDSecure $three_d_secure The 3d secure helper object. * @param Settings $settings The settings. * @param DccApplies $dcc_applies The DCC applies object. + * @param OrderHelper $order_helper The order helper. * @param LoggerInterface $logger The logger. */ public function __construct( @@ -96,6 +104,7 @@ class ApproveOrderEndpoint implements EndpointInterface { ThreeDSecure $three_d_secure, Settings $settings, DccApplies $dcc_applies, + OrderHelper $order_helper, LoggerInterface $logger ) { @@ -105,6 +114,7 @@ class ApproveOrderEndpoint implements EndpointInterface { $this->threed_secure = $three_d_secure; $this->settings = $settings; $this->dcc_applies = $dcc_applies; + $this->order_helper = $order_helper; $this->logger = $logger; } @@ -173,7 +183,7 @@ class ApproveOrderEndpoint implements EndpointInterface { wp_send_json_success( $order ); } - if ( ! $order->status()->is( OrderStatus::APPROVED ) ) { + if ( $this->order_helper->contains_physical_goods( $order ) && ! $order->status()->is( OrderStatus::APPROVED ) ) { $message = sprintf( // translators: %s is the id of the order. __( 'Order %s is not approved yet.', 'woocommerce-paypal-payments' ), diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index afef63285..5a477efa1 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -218,6 +218,7 @@ return array( $environment = $container->get( 'onboarding.environment' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); $subscription_helper = $container->get( 'subscription.helper' ); + $order_helper = $container->get('api.order-helper'); return new OrderProcessor( $session_handler, $order_endpoint, @@ -227,7 +228,8 @@ return array( $settings, $logger, $environment, - $subscription_helper + $subscription_helper, + $order_helper ); }, 'wcgateway.processor.refunds' => static function ( ContainerInterface $container ): RefundProcessor { diff --git a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php index b1d3358bd..7c5de5c88 100644 --- a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php +++ b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php @@ -14,6 +14,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Session\SessionHandler; @@ -106,6 +107,13 @@ class OrderProcessor { */ private $subscription_helper; + /** + * The order helper. + * + * @var OrderHelper + */ + private $order_helper; + /** * OrderProcessor constructor. * @@ -118,6 +126,7 @@ class OrderProcessor { * @param LoggerInterface $logger A logger service. * @param Environment $environment The environment. * @param SubscriptionHelper $subscription_helper The subscription helper. + * @param OrderHelper $order_helper The order helper. */ public function __construct( SessionHandler $session_handler, @@ -128,7 +137,8 @@ class OrderProcessor { Settings $settings, LoggerInterface $logger, Environment $environment, - SubscriptionHelper $subscription_helper + SubscriptionHelper $subscription_helper, + OrderHelper $order_helper ) { $this->session_handler = $session_handler; @@ -140,6 +150,7 @@ class OrderProcessor { $this->environment = $environment; $this->logger = $logger; $this->subscription_helper = $subscription_helper; + $this->order_helper = $order_helper; } /** @@ -160,7 +171,7 @@ class OrderProcessor { $this->add_paypal_meta( $wc_order, $order, $this->environment ); $error_message = null; - if ( ! $this->order_is_approved( $order ) ) { + if ( $this->order_helper->contains_physical_goods( $order ) && ! $this->order_is_approved( $order ) ) { $error_message = __( 'The payment has not been approved yet.', 'woocommerce-paypal-payments' diff --git a/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php b/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php index ae051a68c..55badb305 100644 --- a/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php +++ b/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php @@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Entity\Payments; use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit; use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Session\SessionHandler; @@ -129,6 +130,8 @@ class OrderProcessorTest extends TestCase $subscription_helper = Mockery::mock(SubscriptionHelper::class); $subscription_helper->shouldReceive('has_subscription'); + $order_helper = Mockery::mock(OrderHelper::class); + $testee = new OrderProcessor( $sessionHandler, $orderEndpoint, @@ -138,7 +141,8 @@ class OrderProcessorTest extends TestCase $settings, $logger, $this->environment, - $subscription_helper + $subscription_helper, + $order_helper ); $wcOrder @@ -165,6 +169,8 @@ class OrderProcessorTest extends TestCase $wcOrder->expects('set_transaction_id') ->with($transactionId); + $order_helper->shouldReceive('contains_physical_goods')->andReturn(true); + $this->assertTrue($testee->process($wcOrder)); } @@ -247,6 +253,8 @@ class OrderProcessorTest extends TestCase $logger = Mockery::mock(LoggerInterface::class); $subscription_helper = Mockery::mock(SubscriptionHelper::class); + $order_helper = Mockery::mock(OrderHelper::class); + $testee = new OrderProcessor( $sessionHandler, $orderEndpoint, @@ -256,7 +264,8 @@ class OrderProcessorTest extends TestCase $settings, $logger, $this->environment, - $subscription_helper + $subscription_helper, + $order_helper ); $wcOrder @@ -277,6 +286,9 @@ class OrderProcessorTest extends TestCase ->with($transactionId); $wcOrder ->expects('payment_complete'); + + $order_helper->shouldReceive('contains_physical_goods')->andReturn(true); + $this->assertTrue($testee->process($wcOrder)); } @@ -343,6 +355,8 @@ class OrderProcessorTest extends TestCase $logger = Mockery::mock(LoggerInterface::class); $subscription_helper = Mockery::mock(SubscriptionHelper::class); + $order_helper = Mockery::mock(OrderHelper::class); + $testee = new OrderProcessor( $sessionHandler, $orderEndpoint, @@ -352,7 +366,8 @@ class OrderProcessorTest extends TestCase $settings, $logger, $this->environment, - $subscription_helper + $subscription_helper, + $order_helper ); $wcOrder @@ -368,6 +383,8 @@ class OrderProcessorTest extends TestCase $orderIntent ); + $order_helper->shouldReceive('contains_physical_goods')->andReturn(true); + $this->assertFalse($testee->process($wcOrder)); $this->assertNotEmpty($testee->last_error()); } From 297fb4b92ad69271714e708d6d0c9300dd6418ba Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 2 Jun 2022 15:39:02 +0200 Subject: [PATCH 06/17] Fix phpcs --- modules/ppcp-wc-gateway/services.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 5a477efa1..ed6d3699a 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -218,7 +218,7 @@ return array( $environment = $container->get( 'onboarding.environment' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); $subscription_helper = $container->get( 'subscription.helper' ); - $order_helper = $container->get('api.order-helper'); + $order_helper = $container->get( 'api.order-helper' ); return new OrderProcessor( $session_handler, $order_endpoint, From 616e343f57040afc526293040734cc6150c75324 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 2 Jun 2022 15:46:56 +0200 Subject: [PATCH 07/17] Update method description --- modules/ppcp-api-client/src/Helper/OrderHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-api-client/src/Helper/OrderHelper.php b/modules/ppcp-api-client/src/Helper/OrderHelper.php index 79a5d78c0..25e5124e2 100644 --- a/modules/ppcp-api-client/src/Helper/OrderHelper.php +++ b/modules/ppcp-api-client/src/Helper/OrderHelper.php @@ -17,7 +17,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; class OrderHelper { /** - * Checks if order contains virtual products. + * Checks if order contains physical goods. * * @param Order $order PayPal order. * @return bool From 993e109c49b7efaa7851725fe243230d049f2ce0 Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 3 Jun 2022 10:50:54 +0300 Subject: [PATCH 08/17] Add basic input validation before opening PayPal popup --- modules/ppcp-button/resources/js/button.js | 13 +++++++++++++ modules/ppcp-button/src/Assets/SmartButton.php | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/modules/ppcp-button/resources/js/button.js b/modules/ppcp-button/resources/js/button.js index 1ecda5a95..c416521a0 100644 --- a/modules/ppcp-button/resources/js/button.js +++ b/modules/ppcp-button/resources/js/button.js @@ -31,6 +31,19 @@ const bootstrap = () => { const onSmartButtonClick = (data, actions) => { window.ppcpFundingSource = data.fundingSource; + // TODO: quick fix to get the error about empty form before attempting PayPal order + // it should solve #513 for most of the users, but proper solution should be implemented later. + const requiredFields = jQuery('form.woocommerce-checkout .validate-required:visible :input'); + requiredFields.each((i, input) => { + jQuery(input).trigger('validate'); + }); + if (jQuery('form.woocommerce-checkout .woocommerce-invalid').length) { + errorHandler.clear(); + errorHandler.message(PayPalCommerceGateway.labels.error.js_validation); + + return actions.reject(); + } + const form = document.querySelector('form.woocommerce-checkout'); if (form) { jQuery('#ppcp-funding-source-form-input').remove(); diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index f15b8c800..d24ee70a2 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -843,6 +843,10 @@ class SmartButton implements SmartButtonInterface { 'Something went wrong. Please try again or choose another payment source.', 'woocommerce-paypal-payments' ), + 'js_validation' => __( + 'Required form fields are not filled or invalid.', + 'woocommerce-paypal-payments' + ), ), ), 'order_id' => 'pay-now' === $this->context() ? absint( $wp->query_vars['order-pay'] ) : 0, From 0c185fca0887cadbb1039f0c5f09b0c00774c09e Mon Sep 17 00:00:00 2001 From: Narek Zakarian Date: Mon, 6 Jun 2022 16:12:42 +0400 Subject: [PATCH 09/17] Fix the order status for virtual & downloadable products --- modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php index b1d3358bd..713ce7ec4 100644 --- a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php +++ b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php @@ -204,7 +204,7 @@ class OrderProcessor { __( 'Payment successfully captured.', 'woocommerce-paypal-payments' ) ); $wc_order->update_meta_data( AuthorizedPaymentsProcessor::CAPTURED_META_KEY, 'true' ); - $wc_order->update_status( 'processing' ); + $wc_order->update_status( 'completed' ); } $this->last_error = ''; return true; From 8a0b439e5fe62fab7f8d217979edd1572cb6f941 Mon Sep 17 00:00:00 2001 From: dinamiko Date: Tue, 7 Jun 2022 12:17:35 +0200 Subject: [PATCH 10/17] Add order status `CREATED` to order processor check --- .../src/Endpoint/ApproveOrderEndpoint.php | 4 ++-- .../src/Processor/OrderProcessor.php | 13 ++++++------- .../WcGateway/Processor/OrderProcessorTest.php | 4 ++++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php index bfbde9923..82a0c789e 100644 --- a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php @@ -173,10 +173,10 @@ class ApproveOrderEndpoint implements EndpointInterface { wp_send_json_success( $order ); } - if ( ! $order->status()->is( OrderStatus::APPROVED ) ) { + if ( ! $order->status()->is( OrderStatus::APPROVED ) && ! $order->status()->is( OrderStatus::CREATED ) ) { $message = sprintf( // translators: %s is the id of the order. - __( 'Order %s is not approved yet.', 'woocommerce-paypal-payments' ), + __( 'Order %s is not ready for processing yet.', 'woocommerce-paypal-payments' ), $data['order_id'] ); diff --git a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php index b1d3358bd..6ce0e068f 100644 --- a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php +++ b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php @@ -160,9 +160,9 @@ class OrderProcessor { $this->add_paypal_meta( $wc_order, $order, $this->environment ); $error_message = null; - if ( ! $this->order_is_approved( $order ) ) { + if ( ! $this->order_is_ready_for_process( $order ) ) { $error_message = __( - 'The payment has not been approved yet.', + 'The payment is not ready for processing yet.', 'woocommerce-paypal-payments' ); } @@ -269,15 +269,15 @@ class OrderProcessor { } /** - * Whether a given order is approved. + * Whether a given order is ready for processing. * * @param Order $order The order. * * @return bool */ - private function order_is_approved( Order $order ): bool { + private function order_is_ready_for_process( Order $order ): bool { - if ( $order->status()->is( OrderStatus::APPROVED ) ) { + if ( $order->status()->is( OrderStatus::APPROVED ) || $order->status()->is( OrderStatus::CREATED ) ) { return true; } @@ -285,7 +285,7 @@ class OrderProcessor { return false; } - $is_approved = in_array( + return in_array( $this->threed_secure->proceed_with_order( $order ), array( ThreeDSecure::NO_DECISION, @@ -293,6 +293,5 @@ class OrderProcessor { ), true ); - return $is_approved; } } diff --git a/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php b/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php index ae051a68c..6fd7f6c78 100644 --- a/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php +++ b/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php @@ -306,6 +306,10 @@ class OrderProcessorTest extends TestCase ->expects('is') ->with(OrderStatus::APPROVED) ->andReturn(false); + $orderStatus + ->expects('is') + ->with(OrderStatus::CREATED) + ->andReturn(false); $orderId = 'abc'; $orderIntent = 'CAPTURE'; $currentOrder = Mockery::mock(Order::class); From fdbbe6afb3f8de8cc7cf8908dc3a84fd6f7c01de Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 8 Jun 2022 15:53:30 +0300 Subject: [PATCH 11/17] Send form data as json object to fix decoding was decoded twice, in RequestData and by parse_str --- .../modules/ActionHandler/CheckoutActionHandler.js | 6 ++++-- .../ppcp-button/src/Endpoint/CreateOrderEndpoint.php | 4 ++-- modules/ppcp-button/src/Endpoint/RequestData.php | 12 +++--------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js b/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js index 625fd369b..bc7a90b4a 100644 --- a/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js +++ b/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js @@ -20,7 +20,9 @@ class CheckoutActionHandler { const errorHandler = this.errorHandler; const formSelector = this.config.context === 'checkout' ? 'form.checkout' : 'form#order_review'; - const formValues = jQuery(formSelector).serialize(); + const formData = new FormData(document.querySelector(formSelector)); + // will not handle fields with multiple values (checkboxes,