diff --git a/vendor/magento/module-paypal/Model/Express/Checkout.php b/vendor/magento/module-paypal/Model/Express/Checkout.php index 389f20c757ae1..5099f0ccb35ff 100644 --- a/vendor/magento/module-paypal/Model/Express/Checkout.php +++ b/vendor/magento/module-paypal/Model/Express/Checkout.php @@ -1155,8 +1155,18 @@ private function setShippingOptions(PaypalCart $cart, Address $address = null) protected function prepareGuestQuote() { $quote = $this->_quote; + $billingAddress = $quote->getBillingAddress(); + + /* Check if Guest customer provided an email address on checkout page, and in case + it was provided, use it as priority, if not, use email address returned from PayPal. + (Guest customer can place order two ways: - from checkout page, where guest is asked to provide + an email address that later can be used for account creation; - from mini shopping cart, directly + proceeding to PayPal without providing an email address */ + $email = $billingAddress->getOrigData('email') !== null + ? $billingAddress->getOrigData('email') : $billingAddress->getEmail(); + $quote->setCustomerId(null) - ->setCustomerEmail($quote->getBillingAddress()->getEmail()) + ->setCustomerEmail($email) ->setCustomerIsGuest(true) ->setCustomerGroupId(\Magento\Customer\Model\Group::NOT_LOGGED_IN_ID); return $this; diff --git a/vendor/magento/module-paypal/view/frontend/web/js/in-context/express-checkout-smart-buttons.js b/vendor/magento/module-paypal/view/frontend/web/js/in-context/express-checkout-smart-buttons.js index ad7e86f2e99e0..95415c827f215 100644 --- a/vendor/magento/module-paypal/view/frontend/web/js/in-context/express-checkout-smart-buttons.js +++ b/vendor/magento/module-paypal/view/frontend/web/js/in-context/express-checkout-smart-buttons.js @@ -4,8 +4,9 @@ */ define([ 'underscore', + 'jquery', 'paypalInContextExpressCheckout' -], function (_, paypal) { +], function (_, $, paypal) { 'use strict'; /** @@ -63,15 +64,15 @@ define([ button: clientConfig.button }; - return new paypal.Promise(function (resolve, reject) { - clientConfig.rendererComponent.beforePayment(resolve, reject).then(function () { - paypal.request.post(clientConfig.getTokenUrl, params).then(function (res) { - return clientConfig.rendererComponent.afterPayment(res, resolve, reject); - }).catch(function (err) { - return clientConfig.rendererComponent.catchPayment(err, resolve, reject); + return $.Deferred(function (deferred) { + clientConfig.rendererComponent.beforePayment(deferred.resolve, deferred.reject).then(function () { + $.post(clientConfig.getTokenUrl, params).done(function (res) { + clientConfig.rendererComponent.afterPayment(res, deferred.resolve, deferred.reject); + }).fail(function (jqXHR, textStatus, err) { + clientConfig.rendererComponent.catchPayment(err, deferred.resolve, deferred.reject); }); }); - }); + }).promise(); }, /** @@ -90,15 +91,17 @@ define([ 'form_key': clientConfig.formKey }; - return new paypal.Promise(function (resolve, reject) { - clientConfig.rendererComponent.beforeOnAuthorize(resolve, reject, actions).then(function () { - paypal.request.post(clientConfig.onAuthorizeUrl, params).then(function (res) { - clientConfig.rendererComponent.afterOnAuthorize(res, resolve, reject, actions); - }).catch(function (err) { - return clientConfig.rendererComponent.catchOnAuthorize(err, resolve, reject); + return $.Deferred(function (deferred) { + clientConfig.rendererComponent.beforeOnAuthorize(deferred.resolve, deferred.reject, actions) + .then(function () { + $.post(clientConfig.onAuthorizeUrl, params).done(function (res) { + clientConfig.rendererComponent + .afterOnAuthorize(res, deferred.resolve, deferred.reject, actions); + }).fail(function (jqXHR, textStatus, err) { + clientConfig.rendererComponent.catchOnAuthorize(err, deferred.resolve, deferred.reject); + }); }); - }); - }); + }).promise(); }, diff --git a/vendor/magento/module-quote/Observer/Frontend/Quote/Address/CollectTotalsObserver.php b/vendor/magento/module-quote/Observer/Frontend/Quote/Address/CollectTotalsObserver.php index a1228903e2323..18934fab00afb 100644 --- a/vendor/magento/module-quote/Observer/Frontend/Quote/Address/CollectTotalsObserver.php +++ b/vendor/magento/module-quote/Observer/Frontend/Quote/Address/CollectTotalsObserver.php @@ -5,7 +5,16 @@ */ namespace Magento\Quote\Observer\Frontend\Quote\Address; +use Magento\Customer\Api\AddressRepositoryInterface; +use Magento\Customer\Api\Data\CustomerInterfaceFactory; +use Magento\Customer\Api\GroupManagementInterface; +use Magento\Customer\Helper\Address; +use Magento\Customer\Model\Session; +use Magento\Customer\Model\Vat; +use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; +use Magento\Quote\Api\Data\ShippingAssignmentInterface; +use Magento\Quote\Model\Quote; /** * Handle customer VAT number on collect_totals_before event of quote address. @@ -15,22 +24,22 @@ class CollectTotalsObserver implements ObserverInterface { /** - * @var \Magento\Customer\Api\AddressRepositoryInterface + * @var AddressRepositoryInterface */ private $addressRepository; /** - * @var \Magento\Customer\Model\Session + * @var Session */ private $customerSession; /** - * @var \Magento\Customer\Helper\Address + * @var Address */ protected $customerAddressHelper; /** - * @var \Magento\Customer\Model\Vat + * @var Vat */ protected $customerVat; @@ -40,36 +49,36 @@ class CollectTotalsObserver implements ObserverInterface protected $vatValidator; /** - * @var \Magento\Customer\Api\Data\CustomerInterfaceFactory + * @var CustomerInterfaceFactory */ protected $customerDataFactory; /** * Group Management * - * @var \Magento\Customer\Api\GroupManagementInterface + * @var GroupManagementInterface */ protected $groupManagement; /** * Initialize dependencies. * - * @param \Magento\Customer\Helper\Address $customerAddressHelper - * @param \Magento\Customer\Model\Vat $customerVat + * @param Address $customerAddressHelper + * @param Vat $customerVat * @param VatValidator $vatValidator - * @param \Magento\Customer\Api\Data\CustomerInterfaceFactory $customerDataFactory - * @param \Magento\Customer\Api\GroupManagementInterface $groupManagement - * @param \Magento\Customer\Api\AddressRepositoryInterface $addressRepository - * @param \Magento\Customer\Model\Session $customerSession + * @param CustomerInterfaceFactory $customerDataFactory + * @param GroupManagementInterface $groupManagement + * @param AddressRepositoryInterface $addressRepository + * @param Session $customerSession */ public function __construct( - \Magento\Customer\Helper\Address $customerAddressHelper, - \Magento\Customer\Model\Vat $customerVat, + Address $customerAddressHelper, + Vat $customerVat, VatValidator $vatValidator, - \Magento\Customer\Api\Data\CustomerInterfaceFactory $customerDataFactory, - \Magento\Customer\Api\GroupManagementInterface $groupManagement, - \Magento\Customer\Api\AddressRepositoryInterface $addressRepository, - \Magento\Customer\Model\Session $customerSession + CustomerInterfaceFactory $customerDataFactory, + GroupManagementInterface $groupManagement, + AddressRepositoryInterface $addressRepository, + Session $customerSession ) { $this->customerVat = $customerVat; $this->customerAddressHelper = $customerAddressHelper; @@ -83,25 +92,23 @@ public function __construct( /** * Handle customer VAT number if needed on collect_totals_before event of quote address * - * @param \Magento\Framework\Event\Observer $observer + * @param Observer $observer * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute(\Magento\Framework\Event\Observer $observer) + public function execute(Observer $observer) { - /** @var \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment */ + /** @var ShippingAssignmentInterface $shippingAssignment */ $shippingAssignment = $observer->getShippingAssignment(); - /** @var \Magento\Quote\Model\Quote $quote */ + /** @var Quote $quote */ $quote = $observer->getQuote(); - /** @var \Magento\Quote\Model\Quote\Address $address */ + /** @var Quote\Address $address */ $address = $shippingAssignment->getShipping()->getAddress(); $customer = $quote->getCustomer(); $storeId = $customer->getStoreId(); - if ($customer->getDisableAutoGroupChange() - || false == $this->vatValidator->isEnabled($address, $storeId) - ) { + if ($customer->getDisableAutoGroupChange() || !$this->vatValidator->isEnabled($address, $storeId)) { return; } $customerCountryCode = $address->getCountryId(); @@ -136,6 +143,7 @@ public function execute(\Magento\Framework\Event\Observer $observer) $quote->setCustomerGroupId($groupId); $this->customerSession->setCustomerGroupId($groupId); $customer->setGroupId($groupId); + $customer->setEmail($customer->getEmail() ?: $quote->getCustomerEmail()); $quote->setCustomer($customer); } }