From 00d9cf52a48baa28f55d02924183b375fae711da Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Fri, 27 Oct 2023 15:28:01 +0200 Subject: [PATCH] Fix psalm --- .../src/Factory/OrderFactory.php | 19 ++++++++++++------- .../src/Endpoint/ApproveOrderEndpoint.php | 8 ++++++-- .../ppcp-button/src/Helper/ThreeDSecure.php | 19 +++++++++++-------- .../src/Endpoint/CreatePaymentToken.php | 5 +++++ .../src/Endpoint/CreateSetupToken.php | 5 +++++ .../src/SavePaymentMethodsModule.php | 14 +++++++------- .../src/Processor/OrderProcessor.php | 9 ++++++++- 7 files changed, 54 insertions(+), 25 deletions(-) diff --git a/modules/ppcp-api-client/src/Factory/OrderFactory.php b/modules/ppcp-api-client/src/Factory/OrderFactory.php index d748efe11..0b8876594 100644 --- a/modules/ppcp-api-client/src/Factory/OrderFactory.php +++ b/modules/ppcp-api-client/src/Factory/OrderFactory.php @@ -146,13 +146,18 @@ class OrderFactory { $payment_source = null; if ( isset( $order_data->payment_source ) ) { - $payment_source_as_array = json_decode( json_encode( $order_data->payment_source ), true ); - if ( $payment_source_as_array ) { - $name = array_key_first( $payment_source_as_array ); - $payment_source = new PaymentSource( - array_key_first( $payment_source_as_array ), - $order_data->payment_source->$name - ); + $json_encoded_payment_source = wp_json_encode( $order_data->payment_source ); + if ( $json_encoded_payment_source ) { + $payment_source_as_array = json_decode( $json_encoded_payment_source, true ); + if ( $payment_source_as_array ) { + $name = array_key_first( $payment_source_as_array ); + if ( $name ) { + $payment_source = new PaymentSource( + $name, + $order_data->payment_source->$name + ); + } + } } } diff --git a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php index 11aae733a..662a470cf 100644 --- a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php @@ -14,6 +14,7 @@ use Exception; use Psr\Log\LoggerInterface; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; +use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentSource; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; @@ -144,10 +145,13 @@ class ApproveOrderEndpoint implements EndpointInterface { $order = $this->api_endpoint->order( $data['order_id'] ); - if ( $order->payment_source() && $order->payment_source()->name() === 'card' ) { + $payment_source = $order->payment_source(); + assert( $payment_source instanceof PaymentSource ); + + if ( $payment_source->name() === 'card' ) { if ( $this->settings->has( 'disable_cards' ) ) { $disabled_cards = (array) $this->settings->get( 'disable_cards' ); - $card = strtolower( $order->payment_source()->properties()->brand ?? '' ); + $card = strtolower( $payment_source->properties()->brand ?? '' ); if ( 'master_card' === $card ) { $card = 'mastercard'; } diff --git a/modules/ppcp-button/src/Helper/ThreeDSecure.php b/modules/ppcp-button/src/Helper/ThreeDSecure.php index 7f7339b6e..ffde79d51 100644 --- a/modules/ppcp-button/src/Helper/ThreeDSecure.php +++ b/modules/ppcp-button/src/Helper/ThreeDSecure.php @@ -12,6 +12,7 @@ namespace WooCommerce\PayPalCommerce\Button\Helper; use Psr\Log\LoggerInterface; use WooCommerce\PayPalCommerce\ApiClient\Entity\CardAuthenticationResult as AuthResult; use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; +use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentSource; /** * Class ThreeDSecure @@ -49,17 +50,19 @@ class ThreeDSecure { * @return int */ public function proceed_with_order( Order $order ): int { - if ( ! $order->payment_source() ) { - return self::NO_DECISION; - } - if ( ! $order->payment_source()->properties()->brand ?? '' ) { - return self::NO_DECISION; - } - if ( ! $order->payment_source()->properties()->authentication_result ?? '' ) { + $payment_source = $order->payment_source(); + if ( ! $payment_source ) { return self::NO_DECISION; } - $result = $order->payment_source()->properties()->authentication_result; + if ( ! $payment_source->properties()->brand ?? '' ) { + return self::NO_DECISION; + } + if ( ! $payment_source->properties()->authentication_result ?? '' ) { + return self::NO_DECISION; + } + + $result = $payment_source->properties()->authentication_result; $this->logger->info( '3DS authentication result: ' . wc_print_r( $result->to_array(), true ) ); if ( $result->liability_shift() === AuthResult::LIABILITY_SHIFT_POSSIBLE ) { diff --git a/modules/ppcp-save-payment-methods/src/Endpoint/CreatePaymentToken.php b/modules/ppcp-save-payment-methods/src/Endpoint/CreatePaymentToken.php index 104eebf70..151c9741c 100644 --- a/modules/ppcp-save-payment-methods/src/Endpoint/CreatePaymentToken.php +++ b/modules/ppcp-save-payment-methods/src/Endpoint/CreatePaymentToken.php @@ -80,6 +80,11 @@ class CreatePaymentToken implements EndpointInterface { try { $data = $this->request_data->read_request( $this->nonce() ); + /** + * Suppress ArgumentTypeCoercion + * + * @psalm-suppress ArgumentTypeCoercion + */ $payment_source = new PaymentSource( 'token', (object) array( diff --git a/modules/ppcp-save-payment-methods/src/Endpoint/CreateSetupToken.php b/modules/ppcp-save-payment-methods/src/Endpoint/CreateSetupToken.php index 77c68e3ba..1490e61b6 100644 --- a/modules/ppcp-save-payment-methods/src/Endpoint/CreateSetupToken.php +++ b/modules/ppcp-save-payment-methods/src/Endpoint/CreateSetupToken.php @@ -69,6 +69,11 @@ class CreateSetupToken implements EndpointInterface { try { $this->request_data->read_request( $this->nonce() ); + /** + * Suppress ArgumentTypeCoercion + * + * @psalm-suppress ArgumentTypeCoercion + */ $payment_source = new PaymentSource( 'paypal', (object) array( diff --git a/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php b/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php index 80b5890db..e7defbe7f 100644 --- a/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php +++ b/modules/ppcp-save-payment-methods/src/SavePaymentMethodsModule.php @@ -9,20 +9,17 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\SavePaymentMethods; -use Exception; use Psr\Log\LoggerInterface; -use stdClass; use WC_Order; -use WC_Payment_Tokens; use WooCommerce\PayPalCommerce\ApiClient\Authentication\UserIdToken; use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; +use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentSource; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException; use WooCommerce\PayPalCommerce\SavePaymentMethods\Endpoint\CreatePaymentToken; use WooCommerce\PayPalCommerce\SavePaymentMethods\Endpoint\CreateSetupToken; use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenFactory; use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenHelper; -use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenPayPal; use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider; use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface; use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface; @@ -91,7 +88,7 @@ class SavePaymentMethodsModule implements ModuleInterface { // Adds attributes needed to save payment method. add_filter( 'ppcp_create_order_request_body_data', - function( $data ) { + function( array $data ): array { $data['payment_source'] = array( 'paypal' => array( 'attributes' => array( @@ -110,7 +107,10 @@ class SavePaymentMethodsModule implements ModuleInterface { add_action( 'woocommerce_paypal_payments_after_order_processor', function( WC_Order $wc_order, Order $order ) use ( $c ) { - $payment_vault_attributes = $order->payment_source()->properties()->attributes->vault ?? null; + $payment_source = $order->payment_source(); + assert( $payment_source instanceof PaymentSource ); + + $payment_vault_attributes = $payment_source->properties()->attributes->vault ?? null; if ( $payment_vault_attributes ) { update_user_meta( $wc_order->get_customer_id(), '_ppcp_target_customer_id', $payment_vault_attributes->customer->id ); @@ -129,7 +129,7 @@ class SavePaymentMethodsModule implements ModuleInterface { $wc_payment_tokens->create_payment_token_paypal( $wc_order->get_customer_id(), $payment_vault_attributes->id, - $order->payment_source()->properties()->email_address ?? '' + $payment_source->properties()->email_address ?? '' ); } }, diff --git a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php index 93774f845..8e25919e5 100644 --- a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php +++ b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php @@ -14,6 +14,7 @@ use WC_Order; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; +use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentSource; use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException; use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory; use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; @@ -324,7 +325,13 @@ class OrderProcessor { return true; } - if ( ! $order->payment_source() || $order->payment_source()->name() !== 'card' ) { + $payment_source = $order->payment_source(); + if ( ! $payment_source ) { + return false; + } + + assert( $payment_source instanceof PaymentSource ); + if ( $payment_source->name() !== 'card' ) { return false; }