Question

I develop a gateway module for magento 2 and when a customer who complete the registration process - i can get his email by :

$quote->getCustomerEmail()

but when i try to get a Guest email - i get a NULL value. There is a "Magento 2 way" to get it?

Javascript solution allready found: Magento2: How to get guest email address in checkout?

Was it helpful?

Solution

If we take a look: vendor/magento/module-checkout/Model/Type/Onepage.php

 protected function _prepareGuestQuote()
 {
        $quote = $this->getQuote();
        $quote->setCustomerId(null)
            ->setCustomerEmail($quote->getBillingAddress()->getEmail())
            ->setCustomerIsGuest(true)
            ->setCustomerGroupId(GroupInterface::NOT_LOGGED_IN_ID);
        return $this;
 }

So, basically, we can get the guest email: $quote->getBillingAddress()->getEmail()

There are some other places:

vendor/magento/module-paypal/Model/Express/Checkout.php

vendor/magento/module-quote/Model/QuoteManagement.php

OTHER TIPS

  • In case of the Guest customer, magento didn't map email id to shipping or billing address before place order.
  • In my case, I need guest email which is provided at the time of shipping page. To validate Guest email with Coupon code using this event ( salesrule_validator_process ) .

To Do that : Step 1: Create di.xml to override core code.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
  <preference for="Magento\Customer\Model\AccountManagement" type="Custom\Couponfriend\Model\AccountManagement" />
</config>

Step 2: Override model in custom module, and set email to
Quote's->shipping object. and get where you need it.

<?php

namespace Custom\Couponfriend\Model;

class AccountManagement extends \Magento\Customer\Model\AccountManagement {

    public function isEmailAvailable($customerEmail, $websiteId = null) {
        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $cart = $objectManager->get('\Magento\Checkout\Model\Cart');
        $shippingAddress = $cart->getQuote()->getShippingAddress();

        $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/guestFriendsFamily.log');
        $logger = new \Zend\Log\Logger();
        $logger->addWriter($writer);
        $logger->info('------------');

        try {
            if ($shippingAddress) {
                $shippingAddress->setData('email', $customerEmail);
                $shippingAddress->save();
            }
        } catch (NoSuchEntityException $e) {
            $logger->info($e->getMessage());
        }

        try {
            if ($websiteId === null) {
                $websiteId = $this->storeManager->getStore()->getWebsiteId();
            }
            $this->customerRepository->get($customerEmail, $websiteId);
            return false;
        } catch (NoSuchEntityException $e) {
            return true;
        }
    }

}

?>

You can override constructor to create cart object using dependency injection

This work for Magento 1

<?php class Exinent_Billingtax_Model_Observer { 
public function autoRegisterBilling($evt){
if(!Mage::helper('customer')->isLoggedIn()){
    $data =$evt->getEvent()->getControllerAction()->getRequest()->getPost('billing', array());
    echo "<pre>";
    print_r($data);
    $customer = Mage::getModel("customer/customer");
    $email = $data['email'];
    $websiteId = Mage::app()->getWebsite()->getId();
    $store = Mage::app()->getStore();
    $pwd = $data['customer_password'];
    $customer->setWebsiteId(Mage::app()->getStore()->getWebsiteId())->loadByEmail($email);

    if (!$customer->getId()) {
         //Code begins here for new customer registration
        $customer->website_id = $websiteId;
        $customer->setStore($store);
        $customer->firstname = $data['firstname'];
        $customer->lastname = $data['lastname'];
        $customer->setEmail($email);
        $customer->setPassword($pwd);
        $customer->sendNewAccountEmail('confirmed');  
        $customer->save();
           }
    Mage::getSingleton('customer/session')->loginById($customer->getId()); // to login that customer.
   }

}

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top