diff --git a/app/code/Magento/Authorizenet/Model/Directpost.php b/app/code/Magento/Authorizenet/Model/Directpost.php index d755cc71cce2b932f471e5148639b6e2b355db58..c4261e9581b82c92fec3505aae4180a1fe30011f 100644 --- a/app/code/Magento/Authorizenet/Model/Directpost.php +++ b/app/code/Magento/Authorizenet/Model/Directpost.php @@ -119,6 +119,11 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra */ protected $transactionRepository; + /** + * @var \Psr\Log\LoggerInterface + */ + private $psrLogger; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -761,7 +766,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra { try { $transactionId = $this->getResponse()->getXTransId(); - $data = $payment->getMethodInstance()->getTransactionDetails($transactionId); + $data = $this->transactionService->getTransactionDetails($this, $transactionId); $transactionStatus = (string)$data->transaction->transactionStatus; $fdsFilterAction = (string)$data->transaction->FDSFilterAction; @@ -779,6 +784,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra $payment->getOrder()->addStatusHistoryComment($message); } } catch (\Exception $e) { + $this->getPsrLogger()->critical($e); //this request is optional } return $this; @@ -805,7 +811,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra $order->registerCancellation($message)->save(); } catch (\Exception $e) { //quiet decline - $this->logger->critical($e); + $this->getPsrLogger()->critical($e); } } @@ -973,4 +979,18 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra return $response; } + + /** + * @return \Psr\Log\LoggerInterface + * + * @deprecated + */ + private function getPsrLogger() + { + if (null === $this->psrLogger) { + $this->psrLogger = \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Psr\Log\LoggerInterface::class); + } + return $this->psrLogger; + } } diff --git a/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js b/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js index f88b11bf87a43e7b2feb4ec95fb3eafb6f69d056..2d142417ac099b023d2e715cbac026cfdada14e9 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js @@ -6,48 +6,31 @@ define( [ 'Magento_Checkout/js/model/quote', 'Magento_Checkout/js/model/url-builder', - 'mage/storage', - 'Magento_Checkout/js/model/error-processor', 'Magento_Customer/js/model/customer', - 'Magento_Checkout/js/model/full-screen-loader' + 'Magento_Checkout/js/model/place-order' ], - function (quote, urlBuilder, storage, errorProcessor, customer, fullScreenLoader) { + function (quote, urlBuilder, customer, placeOrderService) { 'use strict'; return function (paymentData, messageContainer) { - var serviceUrl, - payload; + var serviceUrl, payload; - /** Checkout for guest and registered customer. */ - if (!customer.isLoggedIn()) { + payload = { + cartId: quote.getQuoteId(), + billingAddress: quote.billingAddress(), + paymentMethod: paymentData + }; + + if (customer.isLoggedIn()) { + serviceUrl = urlBuilder.createUrl('/carts/mine/payment-information', {}); + } else { serviceUrl = urlBuilder.createUrl('/guest-carts/:quoteId/payment-information', { quoteId: quote.getQuoteId() }); - payload = { - cartId: quote.getQuoteId(), - email: quote.guestEmail, - paymentMethod: paymentData, - billingAddress: quote.billingAddress() - }; - } else { - serviceUrl = urlBuilder.createUrl('/carts/mine/payment-information', {}); - payload = { - cartId: quote.getQuoteId(), - paymentMethod: paymentData, - billingAddress: quote.billingAddress() - }; + payload.email = quote.guestEmail; } - fullScreenLoader.startLoader(); - - return storage.post( - serviceUrl, JSON.stringify(payload) - ).fail( - function (response) { - errorProcessor.process(response, messageContainer); - fullScreenLoader.stopLoader(); - } - ); + return placeOrderService(serviceUrl, payload, messageContainer); }; } ); diff --git a/app/code/Magento/Checkout/view/frontend/web/js/model/place-order.js b/app/code/Magento/Checkout/view/frontend/web/js/model/place-order.js new file mode 100644 index 0000000000000000000000000000000000000000..68548cb1b28d3e2a4abe66c8be13c9dd48b73ec2 --- /dev/null +++ b/app/code/Magento/Checkout/view/frontend/web/js/model/place-order.js @@ -0,0 +1,27 @@ +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +define( + [ + 'mage/storage', + 'Magento_Checkout/js/model/error-processor', + 'Magento_Checkout/js/model/full-screen-loader' + ], + function (storage, errorProcessor, fullScreenLoader) { + 'use strict'; + + return function (serviceUrl, payload, messageContainer) { + fullScreenLoader.startLoader(); + + return storage.post( + serviceUrl, JSON.stringify(payload) + ).fail( + function (response) { + errorProcessor.process(response, messageContainer); + fullScreenLoader.stopLoader(); + } + ); + }; + } +); diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php index b9725a98209599aac6fe187ded298d03a8070e97..8a626dd2d42b8cdd5af810d3dd64ef58d7055834 100644 --- a/app/code/Magento/Dhl/Model/Carrier.php +++ b/app/code/Magento/Dhl/Model/Carrier.php @@ -1123,9 +1123,8 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin throw new \Magento\Framework\Exception\LocalizedException($responseError); } $this->debugErrors($this->_errors); - - return false; } + $result->append($this->getErrorMessage()); } return $result; diff --git a/app/code/Magento/Fedex/Model/Carrier.php b/app/code/Magento/Fedex/Model/Carrier.php index c03d89e480c355c2e6abe3f1d9d1585e66a793a4..4cd95cb5b4ba9d3c433d311440b509ee93c6dd3e 100644 --- a/app/code/Magento/Fedex/Model/Carrier.php +++ b/app/code/Magento/Fedex/Model/Carrier.php @@ -501,7 +501,10 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C // make general request for all methods $response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL); $preparedGeneral = $this->_prepareRateResponse($response); - if (!$preparedGeneral->getError() || $this->_result->getError() && $preparedGeneral->getError()) { + if (!$preparedGeneral->getError() + || $this->_result->getError() && $preparedGeneral->getError() + || empty($this->_result->getAllRates()) + ) { $this->_result->append($preparedGeneral); } diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php index a824adbd2bf82ed733841813ba42d72622bfdf39..04e149cae270e1ff5077e55ce0283f9a51066e82 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php @@ -62,15 +62,21 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress */ public function execute() { - try { - if ($this->isValidationRequired() && - !$this->agreementsValidator->isValid(array_keys($this->getRequest()->getPost('agreement', []))) - ) { - throw new \Magento\Framework\Exception\LocalizedException( - __('Please agree to all the terms and conditions before placing the order.') - ); - } + if ($this->isValidationRequired() && + !$this->agreementsValidator->isValid(array_keys($this->getRequest()->getPost('agreement', []))) + ) { + $e = new \Magento\Framework\Exception\LocalizedException( + __('Please agree to all the terms and conditions before placing the order.') + ); + $this->messageManager->addExceptionMessage( + $e, + $e->getMessage() + ); + $this->_redirect('*/*/review'); + return; + } + try { $this->_initCheckout(); $this->_checkout->place($this->_initToken()); @@ -108,12 +114,6 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress return; } catch (ApiProcessableException $e) { $this->_processPaypalApiError($e); - } catch (\Magento\Framework\Exception\LocalizedException $e) { - $this->messageManager->addExceptionMessage( - $e, - $e->getMessage() - ); - $this->_redirect('*/*/review'); } catch (\Exception $e) { $this->messageManager->addExceptionMessage( $e, @@ -141,6 +141,9 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress case ApiProcessableException::API_DO_EXPRESS_CHECKOUT_FAIL: $this->_redirectSameToken(); break; + case ApiProcessableException::API_ADDRESS_MATCH_FAIL: + $this->redirectToOrderReviewPageAndShowError($exception->getUserMessage()); + break; case ApiProcessableException::API_UNABLE_TRANSACTION_COMPLETE: if ($this->_config->getPaymentAction() == \Magento\Payment\Model\Method\AbstractMethod::ACTION_ORDER) { $paypalTransactionData = $this->_getCheckoutSession()->getPaypalTransactionData(); @@ -182,6 +185,18 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress $this->_redirect('checkout/cart'); } + /** + * Redirect customer to the paypal order review page and show error message + * + * @param string $errorMessage + * @return void + */ + private function redirectToOrderReviewPageAndShowError($errorMessage) + { + $this->messageManager->addErrorMessage($errorMessage); + $this->_redirect('*/*/review'); + } + /** * Return true if agreements validation required * diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php index 20c9b5f7fb08fbcd78fc46cfa7c2e8ebce3436a1..aef1f4aa87920d3dc1a801ff5ee47b2c33ff84c5 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php @@ -21,7 +21,6 @@ class Start extends GetToken public function execute() { try { - $token = $this->getToken(); if ($token === null) { diff --git a/app/code/Magento/Paypal/Controller/Express/GetToken.php b/app/code/Magento/Paypal/Controller/Express/GetToken.php index c96cdb420bb3aca6bacfe83a9eb281a574e37c39..a7c00bf1f38322c811422f3e4b26f84934ed8bfd 100644 --- a/app/code/Magento/Paypal/Controller/Express/GetToken.php +++ b/app/code/Magento/Paypal/Controller/Express/GetToken.php @@ -53,8 +53,9 @@ class GetToken extends AbstractExpress if ($token === null) { $token = false; } + $url = $this->_checkout->getRedirectUrl(); $this->_initToken($token); - $controllerResult->setData(['token' => $token]); + $controllerResult->setData(['url' => $url]); } catch (LocalizedException $exception) { $this->messageManager->addExceptionMessage( $exception, diff --git a/app/code/Magento/Paypal/Model/Api/Nvp.php b/app/code/Magento/Paypal/Model/Api/Nvp.php index 521887b6c3c524e4f82fb348bfcc47d63f2db99e..d1cc47a06ff8ff89d4f1b0d95748184ad0244e4d 100644 --- a/app/code/Magento/Paypal/Model/Api/Nvp.php +++ b/app/code/Magento/Paypal/Model/Api/Nvp.php @@ -1288,9 +1288,10 @@ class Nvp extends \Magento\Paypal\Model\Api\AbstractApi $exceptionPhrase = __('PayPal gateway has rejected request. %1', $errorMessages); /** @var \Magento\Framework\Exception\LocalizedException $exception */ - $exception = count($errors) == 1 && $this->_isProcessableError($errors[0]['code']) + $firstError = $errors[0]['code']; + $exception = $this->_isProcessableError($firstError) ? $this->_processableExceptionFactory->create( - ['phrase' => $exceptionPhrase, 'code' => $errors[0]['code']] + ['phrase' => $exceptionPhrase, 'code' => $firstError] ) : $this->_frameworkExceptionFactory->create( ['phrase' => $exceptionPhrase] diff --git a/app/code/Magento/Paypal/Model/Api/ProcessableException.php b/app/code/Magento/Paypal/Model/Api/ProcessableException.php index a44e9ae5f3e753ef8c8a2e99a1bf768de8f16bfb..2a7ce0f104203c1a2803e1d77314f3c04cefbf0e 100644 --- a/app/code/Magento/Paypal/Model/Api/ProcessableException.php +++ b/app/code/Magento/Paypal/Model/Api/ProcessableException.php @@ -25,6 +25,7 @@ class ProcessableException extends LocalizedException const API_COUNTRY_FILTER_DECLINE = 10537; const API_MAXIMUM_AMOUNT_FILTER_DECLINE = 10538; const API_OTHER_FILTER_DECLINE = 10539; + const API_ADDRESS_MATCH_FAIL = 10736; /**#@-*/ /** @@ -61,8 +62,13 @@ class ProcessableException extends LocalizedException 'I\'m sorry - but we are not able to complete your transaction. Please contact us so we can assist you.' ); break; + case self::API_ADDRESS_MATCH_FAIL: + $message = __( + 'A match of the Shipping Address City, State, and Postal Code failed.' + ); + break; default: - $message = __($this->getMessage()); + $message = __('We can\'t place the order.'); break; } return $message; diff --git a/app/code/Magento/Paypal/Model/Express.php b/app/code/Magento/Paypal/Model/Express.php index 2464ef48498ce967dc6b074e695f4b685bfc3bd0..a10a2654bf529b63a70c07247bba9b9c154368d0 100644 --- a/app/code/Magento/Paypal/Model/Express.php +++ b/app/code/Magento/Paypal/Model/Express.php @@ -266,6 +266,7 @@ class Express extends \Magento\Payment\Model\Method\AbstractMethod ApiProcessableException::API_COUNTRY_FILTER_DECLINE, ApiProcessableException::API_MAXIMUM_AMOUNT_FILTER_DECLINE, ApiProcessableException::API_OTHER_FILTER_DECLINE, + ApiProcessableException::API_ADDRESS_MATCH_FAIL, ] ); } diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php index 63c6d364e82f43bddcc14fe7595560e494aef7fc..c90431dc4dc5979136d5f274517af4efe7c67c21 100644 --- a/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php @@ -5,19 +5,16 @@ */ namespace Magento\Paypal\Test\Unit\Model\Api; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Paypal\Model\Api\ProcessableException; class ProcessableExceptionTest extends \PHPUnit_Framework_TestCase { - /** - * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager - */ - protected $objectManager; + const UNKNOWN_CODE = 10411; /** - * @var \Magento\Paypal\Model\Api\ProcessableException + * @var ProcessableException */ - protected $model; + private $model; /** * @param int $code @@ -27,8 +24,7 @@ class ProcessableExceptionTest extends \PHPUnit_Framework_TestCase */ public function testGetUserMessage($code, $msg) { - $this->objectManager = new ObjectManager($this); - $this->model = new \Magento\Paypal\Model\Api\ProcessableException(__($msg), null, $code); + $this->model = new ProcessableException(__($msg), null, $code); $this->assertEquals($msg, $this->model->getUserMessage()); } @@ -39,28 +35,35 @@ class ProcessableExceptionTest extends \PHPUnit_Framework_TestCase { return [ [ - 10001, + ProcessableException::API_INTERNAL_ERROR, "I'm sorry - but we were not able to process your payment. " . "Please try another payment method or contact us so we can assist you.", ], [ - 10417, + ProcessableException::API_UNABLE_PROCESS_PAYMENT_ERROR_CODE, "I'm sorry - but we were not able to process your payment. " . "Please try another payment method or contact us so we can assist you." ], [ - 10537, + ProcessableException::API_COUNTRY_FILTER_DECLINE, "I'm sorry - but we are not able to complete your transaction. Please contact us so we can assist you." ], [ - 10538, + ProcessableException::API_MAXIMUM_AMOUNT_FILTER_DECLINE, "I'm sorry - but we are not able to complete your transaction. Please contact us so we can assist you." ], [ - 10539, + ProcessableException::API_OTHER_FILTER_DECLINE, "I'm sorry - but we are not able to complete your transaction. Please contact us so we can assist you." ], - [10411, "something went wrong"] + [ + ProcessableException::API_ADDRESS_MATCH_FAIL, + 'A match of the Shipping Address City, State, and Postal Code failed.' + ], + [ + self::UNKNOWN_CODE, + "We can't place the order." + ] ]; } } diff --git a/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php b/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php index 288b01bd05d399f3599158e686295044d250d767..75f4c14d8517e23b08dc59f46850ae63df5d4830 100644 --- a/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php @@ -22,6 +22,7 @@ class ExpressTest extends \PHPUnit_Framework_TestCase ApiProcessableException::API_COUNTRY_FILTER_DECLINE, ApiProcessableException::API_MAXIMUM_AMOUNT_FILTER_DECLINE, ApiProcessableException::API_OTHER_FILTER_DECLINE, + ApiProcessableException::API_ADDRESS_MATCH_FAIL ]; /** diff --git a/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js b/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js index e2f70141de02218a46bf0222af200e503ac35170..d70de53581276d34886263558deb455f03a55094 100644 --- a/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js +++ b/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js @@ -42,8 +42,8 @@ define( } ).done( function (response) { - if (response && response.token) { - paypalExpressCheckout.checkout.startFlow(response.token); + if (response && response.url) { + paypalExpressCheckout.checkout.startFlow(response.url); return; } diff --git a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js index 9d8ba97f26775ae95714cf8f15a2b892e6150fba..b95c0a7839a6dca8c21040c518192049e16611c5 100644 --- a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js +++ b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js @@ -50,6 +50,7 @@ define( */ placePendingPaymentOrder: function () { if (this.placeOrder()) { + fullScreenLoader.startLoader(); this.isInAction(true); // capture all click events document.addEventListener('click', iframe.stopEventPropagation, true); @@ -61,6 +62,7 @@ define( return this._super() .fail( function () { + fullScreenLoader.stopLoader(); self.isInAction(false); document.removeEventListener('click', iframe.stopEventPropagation, true); } @@ -71,7 +73,15 @@ define( * After place order callback */ afterPlaceOrder: function () { + if (this.iframeIsLoaded) { + document.getElementById(this.getCode() + '-iframe') + .contentWindow.location.reload(); + } + this.paymentReady(true); + this.iframeIsLoaded = true; + this.isPlaceOrderActionAllowed(true); + fullScreenLoader.stopLoader(); }, /** diff --git a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js index d93e0ea702fca98fcd447cc5786a830fa0f8df52..7538d3a02aa9b76a769845f5f32d471d110a7983 100644 --- a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js +++ b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js @@ -52,8 +52,8 @@ define( } ).done( function (response) { - if (response && response.token) { - paypalExpressCheckout.checkout.startFlow(response.token); + if (response && response.url) { + paypalExpressCheckout.checkout.startFlow(response.url); return; }