2

I'm looking for code to convert guest checkout customer to regular customer on successful order placement.

\Magento\Sales\Api\OrderCustomerManagementInterface $orderCustomerService in this class I have found one method called create that is accepting order id and converting to a customer. But I guess it is not working.

Anyone know the solution?

7

Finally, I got the solution. By defining event checkout_onepage_controller_success_action and write a below code in observer we can convert the guest user to customer

        <?php
        $orderId = $orderIds[0];
        $order = $this->_orderFactory->create()->load($orderId);

        /*Convert guest to customer*/
        if ($order->getEntityId() && $this->accountManagement->isEmailAvailable($order->getEmailAddress())) {
            $this->orderCustomerService->create($orderId);

        }
        /*END*/
        ?>
0
4

Use below event

<event name="checkout_onepage_controller_success_action">
        <observer name="guestregistration" instance="Vendor\Module\Observer\ConvertGuest" />
</event>

In Observer file ConvertGuest.php

namespace Vendor\Module\Observer;

class ConvertGuest implements \Magento\Framework\Event\ObserverInterface
{

    public function __construct(
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Sales\Api\OrderCustomerManagementInterface $orderCustomerService,
        \Magento\Sales\Model\OrderFactory $orderFactory,
        \Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
        \Magento\Customer\Model\CustomerFactory $customer
    ) {
        $this->_storeManager = $storeManager;
        $this->orderCustomerService = $orderCustomerService;
        $this->_orderFactory = $orderFactory;
        $this->orderRepository = $orderRepository;
        $this->_customer = $customer;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $orderIds = $observer->getEvent()->getOrderIds();

        $orderId = $orderIds[0];
        $order = $this->_orderFactory->create()->load($orderId);

        $customer= $this->_customer->create();
        $customer->setWebsiteId($this->_storeManager->getStore()->getWebsiteId());
        $customer->loadByEmail($order->getCustomerEmail());

        //Convert guest into customer
        if ($order->getId() && !$customer->getId()) {
            $this->orderCustomerService->create($orderId);
        } else {
            //if customer Registered and checkout as guest
            $order->setCustomerId($customer->getId());
            $order->setCustomerIsGuest(0);
            $this->orderRepository->save($order);
        }
    }
}

Note :: if new customer not shown in customer-grid run indexer:reindex and check

2
  • 1
    works perfectly but there is an extra comma to remove in you constructor after \Magento\Customer\Model\CustomerFactory $customer(,) – urbansurfers Jul 26 '20 at 3:37
  • any particular reason to use the OrderFactory? because load($orderId) is deprecated and there is already the OrderRepositoryInterface with get($orderId) to load the order. – urbansurfers Jul 26 '20 at 17:01
2

Below are the two extension links which does the same functionality - Second one is available as free package :

Module Pay: https://www.commerceextensions.com/magento-convert-guest-checkout-customers-to-registered-customers-magento-2.html

Free Module on GitHub: https://github.com/magepal/magento2-guest-to-customer

3
  • 1
    free module not working on magento 2.1.8 – Lucas D.A.W. Oct 21 '19 at 10:04
  • @LucasD.A.W. What issue are you having with the MagePal extension? – Renon Stewart Apr 15 '20 at 21:26
  • same on 2.1.9, blank page on Stores -> Configuration. composer require magepal/magento2-guest-to-customer | php bin/magento setup:upgrade (dev mode) – urbansurfers Jul 26 '20 at 16:36
1

You can use extension :

Also, you can use code

$collection     = $this->filter->getCollection($this->collectionFactory->create());
        $collectionSize = $collection->getSize();
        $count          = 0;
        /** @var $order \Magento\Sales\Model\Order */

        foreach ($collection as $order) {
            $websiteId  = $order->getStore()->getWebsiteId();
            $storeId    = $order->getStore()->getId();

            $customerData = $this->objectCopyService->copyFieldsetToTarget(
                    'order_address',
                    'to_customer',
                    $order->getBillingAddress(),
                    []
                    );



            $addresses = $order->getAddresses();
            foreach ($addresses as $address) {
                $addressData = $this->objectCopyService->copyFieldsetToTarget(
                        'order_address',
                        'to_customer_address',
                        $address,
                        []
                        );

                /** @var \Magento\Customer\Api\Data\AddressInterface $customerAddress */
                $customerAddress = $this->addressFactory->create(['data' => $addressData]);
                switch ($address->getAddressType()) {
                    case QuoteAddress::ADDRESS_TYPE_BILLING:
                        $customerAddress->setIsDefaultBilling(true);
                        break;
                    case QuoteAddress::ADDRESS_TYPE_SHIPPING:
                        $customerAddress->setIsDefaultShipping(true);
                        break;
                }

                if (is_string($address->getRegion())) {
                    /** @var \Magento\Customer\Api\Data\RegionInterface $region */
                    $region = $this->regionFactory->create();
                    $region->setRegion($address->getRegion());
                    $region->setRegionCode($address->getRegionCode());
                    $region->setRegionId($address->getRegionId());
                    $customerAddress->setRegion($region);
                }
                $customerData['addresses'][] = $customerAddress;
            }
            $account    = $this->createUser($customerData, $websiteId, $storeId, (int)$this->getRequest()->getParam('group'), $count);

            $order
            ->setCustomerId($account->getId())
            ->setData('customer_group_id', $account->getGroupId())
            ->setData('customer_is_guest', 0)
            ->setData('customer_firstname', $account->getFirstname())
            ->setData('customer_lastname', $account->getLastname());

            $this->orderRepository->save($order);

        }
0

Guest Checkout

Your store can be configured to require shoppers to open an account before making a purchase. The default setting allows guests to make purchases, with an option to register for an account after they complete the checkout process.

https://docs.magento.com/m2/ce/user_guide/sales/checkout-guest.html

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.