Ingenico-ePayments / connect-extension-magento2

Ingenico Connect based Shopping Cart Extension for Magento 2.x
https://epayments.developer-ingenico.com/documentation/ecommerce-extensions/magento-2/
MIT License
4 stars 4 forks source link

2.7.1 not working with native magento 2.4.4 & 2.4.5 under php 8.1 #27

Open Sh3yn3 opened 1 year ago

Sh3yn3 commented 1 year ago

Hello, we got some issues with the version 2.7.1 of the module, and magento 2.4.4, 2.4.5 and php 8.1 We tested the version 2.7.1 of the ingénico module on our customized php 8.1 magento 2.4.5, and a php 8.1 native magento 2.4.4. We encoutered the same problems in both versions, meaning this module has problems with a native magento 2 from 2.4.4 and above on php 8.1.

We also tested the 2.7.1 version of the ingenico module under a native magento 2.4.2 php 7.4, and under this specific version it seems to work fine. So the problems doesn't come from our configurations wich was the same on every tests and all magento versions. But from whether php 8.1 or the magento versions 2.4.4 and above.

All tests were made on a registered client checkout, with France country and euro currency. All default available payment methods were tested.

Here are the steps we went through : We installed the version 2.7.1 of the module via composer require as said in the readme, entered our credentials in magento 2 backoffice and using the test button confirmed that the API connexion was successful. So the credentials are working in the sandox section. We also had "Enable old Ingenico payment method" -> true "Checkout label" -> "Test Checkout" And "Payment steps" -> Hosted Checkout

With those configurations we saved in the backoffice and proceed as it (on a native magento with the samples data) to the checkout with an item in the cart. There are then several errors occurring.

1'rst Error

First, entering in the checkout the page crash because of json_decode ligne 152 in Ingenico\Connect\Model\Config.php. It is solved by adding "?:'');" at the end of the json_decode, because the configuration return null instead of an empty string, which shouldn't happens under php 8.1

2'rd Error

Secondly, once the first issue fixed, we access the checkout. IF there is a native checkout agreement activated in the magento backoffice, every single method, and also the ones not from Ingenico stop working, because of Ingenico\Connect\Observer\AdditionalDataAssignObserver that put an object inside the setAdditionalInformation. The error message on front is : The payment disallows storing objects And here is the object stored by the observer : [_data:protected] => Array ( [agreement_ids] => Array ( [0] => 2 ) )

3'rd Error

If we deactivate the native agreement, or if we override the Ingenico\Connect\Observer\AdditionalDataAssignObserver to prevent the agreement object to be put inside the additionnalInformation, every other paiement methods that are not from Ingenico work again. All from ingenico keep bugging. The next error in line at the selection of an ingenico payment method is :

CRITICAL: Exception: Deprecated Functionality: DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /var/www/project/magento/vendor/magento/framework/Intl/DateTimeFactory.php on line 19 in /var/www/project/magento/vendor/magento/framework/App/ErrorHandler.php:62
Stack trace:
#0 [internal function]: Magento\Framework\App\ErrorHandler->handler(8192, 'DateTime::__con...', '/var/www/projec...', 19)
#1 /var/www/project/magento/vendor/magento/framework/Intl/DateTimeFactory.php(19): DateTime->__construct(NULL, NULL)
#2 /var/www/project/magento/vendor/ingenico-epayments/connect-extension-magento2/Model/Ingenico/RequestBuilder/Common/Order/AdditionalInputBuilder.php(54): Magento\Framework\Intl\DateTimeFactory->create(NULL)

In fact, looking at the object order created in AdditionalInputBuilder.php from ingenico module, a lot of informations are lacking, there Are no order ID nor CreatedAt information, so the order->getCreatedAt() feed to the datetime construct in AdditionalInputBuilder crash because of the null value send by the order still in construction.

4'rd Error

If we fix that by feeding the AdditionalInputBuilder.php datetime construct a fake getCreatedAt value, we then get another error from the Ingenico module:

Error: Attempt to assign property "paymentProduct730SpecificInput" on null in /var/www/project/magento/vendor/ingenico-epayments/connect-extension-magento2/Model/Ingenico/RequestBuilder/ProductSpecificInput/Product730Decorator.php:41
Stack trace:
#0 /var/www/project/magento/generated/code/Ingenico/Connect/Model/Ingenico/RequestBuilder/ProductSpecificInput/Product730Decorator/Proxy.php(95): Ingenico\Connect\Model\Ingenico\RequestBuilder\ProductSpecificInput\Product730Decorator->decorate(Object(Ingenico\Connect\Sdk\Domain\Hostedcheckout\CreateHostedCheckoutRequest), Object(Magento\Sales\Model\Order\Interceptor))
#1 /var/www/project/magento/vendor/ingenico-epayments/connect-extension-magento2/Model/Ingenico/RequestBuilder/ProductDecoratorPool.php(59): Ingenico\Connect\Model\Ingenico\RequestBuilder\ProductSpecificInput\Product730Decorator\Proxy->decorate(Object(Ingenico\Connect\Sdk\Domain\Hostedcheckout\CreateHostedCheckoutRequest), Object(Magento\Sales\Model\Order\Interceptor))
#2 /var/www/project/magento/vendor/ingenico-epayments/connect-extension-magento2/Model/Ingenico/RequestBuilder/Common/RequestBuilder.php(97): Ingenico\Connect\Model\Ingenico\RequestBuilder\ProductDecoratorPool->decorate(Object(Ingenico\Connect\Sdk\Domain\Hostedcheckout\CreateHostedCheckoutRequest), Object(Magento\Sales\Model\Order\Interceptor))
#3 /var/www/project/magento/vendor/ingenico-epayments/connect-extension-magento2/Model/Ingenico/RequestBuilder/CreateHostedCheckout/RequestBuilder.php(95): Ingenico\Connect\Model\Ingenico\RequestBuilder\Common\RequestBuilder->create(Object(Ingenico\Connect\Sdk\Domain\Hostedcheckout\CreateHostedCheckoutRequest), Object(Magento\Sales\Model\Order\Interceptor))
#4 /var/www/project/magento/vendor/ingenico-epayments/connect-extension-magento2/Model/Ingenico/Action/CreateHostedCheckout.php(101): Ingenico\Connect\Model\Ingenico\RequestBuilder\CreateHostedCheckout\RequestBuilder->create(Object(Magento\Sales\Model\Order\Interceptor))
#5 /var/www/project/magento/vendor/ingenico-epayments/connect-extension-magento2/Gateway/Command/Initialize.php(51): Ingenico\Connect\Model\Ingenico\Action\CreateHostedCheckout->create(Object(Magento\Sales\Model\Order\Interceptor))
#6 /var/www/project/magento/vendor/magento/module-payment/Model/Method/Adapter.php(549): Ingenico\Connect\Gateway\Command\Initialize->execute(Array)
#7 /var/www/project/magento/vendor/magento/module-payment/Model/Method/Adapter.php(655): Magento\Payment\Model\Method\Adapter->executeCommand('initialize', Array)
#8 /var/www/project/magento/generated/code/Magento/Payment/Model/Method/Adapter/Interceptor.php(392): Magento\Payment\Model\Method\Adapter->initialize('authorize', Object(Magento\Framework\DataObject))
#9 /var/www/project/magento/vendor/magento/module-sales/Model/Order/Payment.php(377): Magento\Payment\Model\Method\Adapter\Interceptor->initialize('authorize', Object(Magento\Framework\DataObject))
#10 /var/www/project/magento/generated/code/Magento/Sales/Model/Order/Payment/Interceptor.php(122): Magento\Sales\Model\Order\Payment->place()
#11 /var/www/project/magento/vendor/magento/module-sales/Model/Order.php(1002): Magento\Sales\Model\Order\Payment\Interceptor->place()
#12 /var/www/project/magento/vendor/magento/module-sales/Model/Order.php(1228): Magento\Sales\Model\Order->_placePayment()
#13 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Sales\Model\Order->place()
#14 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Sales\Model\Order\Interceptor->___callParent('place', Array)
#15 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Sales\Model\Order\Interceptor->Magento\Framework\Interception\{closure}()
#16 /var/www/project/magento/generated/code/Magento/Sales/Model/Order/Interceptor.php(356): Magento\Sales\Model\Order\Interceptor->___callPlugins('place', Array, Array)
#17 /var/www/project/magento/vendor/magento/module-sales/Model/Service/OrderService.php(207): Magento\Sales\Model\Order\Interceptor->place()
#18 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Sales\Model\Service\OrderService->place(Object(Magento\Sales\Model\Order\Interceptor))
#19 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(138): Dnd\Sales\Model\Service\OrderService\Interceptor->___callParent('place', Array)
#20 /var/www/project/magento/vendor/magento/module-inventory-sales/Plugin/Sales/OrderManagement/AppendReservationsAfterOrderPlacementPlugin.php(195): Dnd\Sales\Model\Service\OrderService\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Sales\Model\Order\Interceptor))
#21 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(135): Magento\InventorySales\Plugin\Sales\OrderManagement\AppendReservationsAfterOrderPlacementPlugin->aroundPlace(Object(Dnd\Sales\Model\Service\OrderService\Interceptor), Object(Closure), Object(Magento\Sales\Model\Order\Interceptor))
#22 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(153): Dnd\Sales\Model\Service\OrderService\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Sales\Model\Order\Interceptor))
#23 /var/www/project/magento/generated/code/Dnd/Sales/Model/Service/OrderService/Interceptor.php(95): Dnd\Sales\Model\Service\OrderService\Interceptor->___callPlugins('place', Array, Array)
#24 /var/www/project/magento/vendor/magento/module-quote/Model/QuoteManagement.php(603): Dnd\Sales\Model\Service\OrderService\Interceptor->place(Object(Magento\Sales\Model\Order\Interceptor))
#25 /var/www/project/magento/vendor/magento/module-quote/Model/QuoteManagement.php(483): Magento\Quote\Model\QuoteManagement->submitQuote(Object(Magento\Quote\Model\Quote\Interceptor), Array)
#26 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Quote\Model\QuoteManagement->submit(Object(Magento\Quote\Model\Quote\Interceptor), Array)
#27 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Quote\Model\QuoteManagement\Interceptor->___callParent('submit', Array)
#28 /var/www/project/magento/vendor/magento/module-sales-rule/Plugin/CouponUsagesIncrement.php(54): Magento\Quote\Model\QuoteManagement\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Quote\Model\Quote\Interceptor), Array)
#29 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(135): Magento\SalesRule\Plugin\CouponUsagesIncrement->aroundSubmit(Object(Magento\Quote\Model\QuoteManagement\Interceptor), Object(Closure), Object(Magento\Quote\Model\Quote\Interceptor))
#30 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Quote\Model\QuoteManagement\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Quote\Model\Quote\Interceptor))
#31 /var/www/project/magento/generated/code/Magento/Quote/Model/QuoteManagement/Interceptor.php(68): Magento\Quote\Model\QuoteManagement\Interceptor->___callPlugins('submit', Array, NULL)
#32 /var/www/project/magento/vendor/magento/module-quote/Model/QuoteManagement.php(441): Magento\Quote\Model\QuoteManagement\Interceptor->submit(Object(Magento\Quote\Model\Quote\Interceptor))
#33 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Quote\Model\QuoteManagement->placeOrder('220587', NULL)
#34 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Quote\Model\QuoteManagement\Interceptor->___callParent('placeOrder', Array)
#35 /var/www/project/magento/vendor/paypal/module-braintree-core/Plugin/OrderCancellation.php(63): Magento\Quote\Model\QuoteManagement\Interceptor->Magento\Framework\Interception\{closure}('220587', NULL)
#36 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(135): PayPal\Braintree\Plugin\OrderCancellation->aroundPlaceOrder(Object(Magento\Quote\Model\QuoteManagement\Interceptor), Object(Closure), '220587')
#37 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Quote\Model\QuoteManagement\Interceptor->Magento\Framework\Interception\{closure}('220587')
#38 /var/www/project/magento/generated/code/Magento/Quote/Model/QuoteManagement/Interceptor.php(50): Magento\Quote\Model\QuoteManagement\Interceptor->___callPlugins('placeOrder', Array, Array)
#39 /var/www/project/magento/vendor/magento/module-checkout/Model/PaymentInformationManagement.php(125): Magento\Quote\Model\QuoteManagement\Interceptor->placeOrder('220587')
#40 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Checkout\Model\PaymentInformationManagement->savePaymentInformationAndPlaceOrder('220587', Object(Magento\Quote\Model\Quote\Payment), Object(Magento\Quote\Model\Quote\Address\Interceptor))
#41 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Checkout\Model\PaymentInformationManagement\Interceptor->___callParent('savePaymentInfo...', Array)
#42 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Checkout\Model\PaymentInformationManagement\Interceptor->Magento\Framework\Interception\{closure}('220587', Object(Magento\Quote\Model\Quote\Payment), Object(Magento\Quote\Model\Quote\Address\Interceptor))
#43 /var/www/project/magento/generated/code/Magento/Checkout/Model/PaymentInformationManagement/Interceptor.php(23): Magento\Checkout\Model\PaymentInformationManagement\Interceptor->___callPlugins('savePaymentInfo...', Array, Array)
#44 /var/www/project/magento/vendor/magento/module-async-order/Model/AsyncPaymentInformationCustomerPublisher.php(120): Magento\Checkout\Model\PaymentInformationManagement\Interceptor->savePaymentInformationAndPlaceOrder('220587', Object(Magento\Quote\Model\Quote\Payment), Object(Magento\Quote\Model\Quote\Address\Interceptor))
#45 [internal function]: Magento\AsyncOrder\Model\AsyncPaymentInformationCustomerPublisher->savePaymentInformationAndPlaceOrder('220587', Object(Magento\Quote\Model\Quote\Payment), Object(Magento\Quote\Model\Quote\Address\Interceptor))
#46 /var/www/project/magento/vendor/magento/module-webapi/Controller/Rest/SynchronousRequestProcessor.php(95): call_user_func_array(Array, Array)
#47 /var/www/project/magento/vendor/magento/module-webapi/Controller/Rest.php(195): Magento\Webapi\Controller\Rest\SynchronousRequestProcessor->process(Object(Magento\Framework\Webapi\Rest\Request\Proxy))
#48 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Webapi\Controller\Rest->dispatch(Object(Magento\Framework\App\Request\Http))
#49 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Webapi\Controller\Rest\Interceptor->___callParent('dispatch', Array)
#50 /var/www/project/magento/vendor/fastly/magento2/Model/FrontControllerPlugin.php(128): Magento\Webapi\Controller\Rest\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#51 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(135): Fastly\Cdn\Model\FrontControllerPlugin->aroundDispatch(Object(Magento\Webapi\Controller\Rest\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#52 /var/www/project/magento/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Webapi\Controller\Rest\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#53 /var/www/project/magento/generated/code/Magento/Webapi/Controller/Rest/Interceptor.php(23): Magento\Webapi\Controller\Rest\Interceptor->___callPlugins('dispatch', Array, Array)
#54 /var/www/project/magento/vendor/magento/framework/App/Http.php(116): Magento\Webapi\Controller\Rest\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#55 /var/www/project/magento/generated/code/Magento/Framework/App/Http/Interceptor.php(23): Magento\Framework\App\Http->launch()
#56 /var/www/project/magento/vendor/magento/framework/App/Bootstrap.php(264): Magento\Framework\App\Http\Interceptor->launch()
#57 /var/www/project/magento/pub/index.php(30): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http\Interceptor))
#58 {main}

5'rd Error

If we patch this by not feeding to the decorator the content of input, because the object doesn't seem to exist for some reason, we then get another error and the checkout give us a HTTP 400, without much further information {"message":"A server error stopped your order from being placed. Please try to place your order again.","trace":"#0 \/var\/www\/project\/magento\/vendor\/magento\/framework\/Interception\/Interceptor.php(58): Magento\\Checkout\\Model\\PaymentInformationManagement->savePaymentInformationAndPlaceOrder('3', Object(Magento\\Quote\\Model\\Quote\\Payment), Object(Magento\\Quote\\Model\\Quote\\Address\\Interceptor))\n#1 \/var\/www\/project\/magento\/vendor\/magento\/framework\/Interception\/Interceptor.php(138): Magento\\Checkout\\Model\\PaymentInformationManagement\\Interceptor->___callParent('savePaymentInfo...', Array)\n#2 \/var\/www\/project\/magento\/vendor\/magento\/framework\/Interception\/Interceptor.php(153): Magento\\Checkout\\Model\\PaymentInformationManagement\\Interceptor->Magento\\Framework\\Interception\\{closure}('3', Object(Magento\\Quote\\Model\\Quote\\Payment), Object(Magento\\Quote\\Model\\Quote\\Address\\Interceptor))\n#3 \/var\/www\/project\/magento\/generated\/code\/Magento\/Checkout\/Model\/PaymentInformationManagement\/Interceptor.php(23): Magento\\Checkout\\Model\\PaymentInformationManagement\\Interceptor->___callPlugins('savePaymentInfo...', Array, Array)\n#4 \/var\/www\/project\/magento\/vendor\/magento\/module-async-order\/Model\/AsyncPaymentInformationCustomerPublisher.php(120): Magento\\Checkout\\Model\\PaymentInformationManagement\\Interceptor->savePaymentInformationAndPlaceOrder('3', Object(Magento\\Quote\\Model\\Quote\\Payment), Object(Magento\\Quote\\Model\\Quote\\Address\\Interceptor))\n#5 [internal function]: Magento\\AsyncOrder\\Model\\AsyncPaymentInformationCustomerPublisher->savePaymentInformationAndPlaceOrder('3', Object(Magento\\Quote\\Model\\Quote\\Payment), Object(Magento\\Quote\\Model\\Quote\\Address\\Interceptor))\n#6 \/var\/www\/project\/magento\/vendor\/magento\/module-webapi\/Controller\/Rest\/SynchronousRequestProcessor.php(95): call_user_func_array(Array, Array)\n#7 \/var\/www\/project\/magento\/vendor\/magento\/module-webapi\/Controller\/Rest.php(195): Magento\\Webapi\\Controller\\Rest\\SynchronousRequestProcessor->process(Object(Magento\\Framework\\Webapi\\Rest\\Request\\Proxy))\n#8 \/var\/www\/project\/magento\/vendor\/magento\/framework\/Interception\/Interceptor.php(58): Magento\\Webapi\\Controller\\Rest->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n#9 \/var\/www\/project\/magento\/vendor\/magento\/framework\/Interception\/Interceptor.php(138): Magento\\Webapi\\Controller\\Rest\\Interceptor->___callParent('dispatch', Array)\n#10 \/var\/www\/project\/magento\/vendor\/magento\/framework\/Interception\/Interceptor.php(153): Magento\\Webapi\\Controller\\Rest\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n#11 \/var\/www\/project\/magento\/generated\/code\/Magento\/Webapi\/Controller\/Rest\/Interceptor.php(23): Magento\\Webapi\\Controller\\Rest\\Interceptor->___callPlugins('dispatch', Array, Array)\n#12 \/var\/www\/project\/magento\/vendor\/magento\/framework\/App\/Http.php(116): Magento\\Webapi\\Controller\\Rest\\Interceptor->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n#13 \/var\/www\/project\/magento\/generated\/code\/Magento\/Framework\/App\/Http\/Interceptor.php(23): Magento\\Framework\\App\\Http->launch()\n#14 \/var\/www\/project\/magento\/vendor\/magento\/framework\/App\/Bootstrap.php(264): Magento\\Framework\\App\\Http\\Interceptor->launch()\n#15 \/var\/www\/project\/magento\/pub\/index.php(30): Magento\\Framework\\App\\Bootstrap->run(Object(Magento\\Framework\\App\\Http\\Interceptor))\n#16 {main}"

Conclusion

So as you seen, the last version of this module (2.7.1) isn't out of the box compatible with a php 8.1 magento 2.4.4+ native version. There are at least several issues happening. Everything is fine on a php 7.4 and magento 2.4.2 version, so the problem doesn't come from our configurations but seem to come from the Ingenico module. The version 2.4.5 being now the only one officially supported by magento, could you please look into that so we can use your module on magento 2 ?

Thank you

bertterheide commented 1 year ago

@Sh3yn3 we currently working hard on a new version of this module which will resolve the issues you've described.

bertterheide commented 1 year ago

@Sh3yn3 we've released version 3.0.0 of this module. Could you check if that resolves your issues?