8

I have created custom API to update customer address using customer id or address id.

Below code I used to implement it.

[Vendor]/[Module]/etc/webapi.xml

<route url="/V1/address/createUpdate" method="POST">
    <service class="[Vendor]\[Module]\Api\CustomAddressInterface" method="addressUpdate"/>
    <resources>
        <resource ref="anonymous"/>
    </resources>
</route>

[Vendor]/[Module]/Api/CustomAddressInterface.php

 <?php
  namespace [Vendor]\[Module]\Api;

  interface CustomAddressInterface
 {
/**
 * Returns greeting message to user
 *
 * @api
 * @param string $name Users name.
 * @return string Greeting message with users name.
 */
public function name($name);

/**
 * POST for attribute api
 * @param mixed $param
 * @return array
 */

 public function addressUpdate($params);

}

[Vendo]/[Module]/Model/Address.php

namespace [Vendor]\[Module]\Model;
use [Vendor]\[Module]\Api\CustomAddressInterface;
use Magento\Store\Model\StoreManagerInterface;

class Address implements CustomAddressInterface
{   
protected $_storeManager;
protected $addressFactory;
protected $addressRepository;
protected $customerRepository;
protected $_customer; 
public function __construct(
    \Magento\Framework\ObjectManagerInterface $objectManager,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Customer\Model\AddressFactory $addressFactory,
    \Magento\Customer\Api\AddressRepositoryInterface $addressRepository,
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Customer\Model\Customer $customer
) {
    $this->_objectManager = $objectManager;
    $this->_storeManager = $storeManager;
    $this->_addressFactory = $addressFactory;
    $this->addressRepository = $addressRepository;
    $this->customerRepository = $customerRepository;
    $this->_customer = $customer;
}

/**
 * Returns greeting message to user
 *
 * @api
 * @param string $name Users name.
 * @return string Greeting message with users name.
 */
public function name($name) {
    return "Hello, " . $name;
}

public function addressUpdate($params) {

   public function addressUpdate($params) {
    //return 'Response: ' . json_encode($params);   
    $resultArr = array();
    $paramArr = array();
    $result =  json_encode($params);
    $resultSet = json_decode($result,true);

    $EntType = $resultSet['Entity_Type'];
    $customerId = $resultSet['Entity_Attributes']['CustomerId'];
    $AddressId = $resultSet['Entity_Attributes']['AddressId'];

    if(empty($customerId)){
        $resultArr['result'] = "Failed";
        $resultArr['message'] = "customerId shouldn't be empty!!!";
        $paramArr['Magento_ID'] = "";
        $paramArr['NAV_ID'] = "";
        $resultArr['parameters'] = $paramArr;
        echo json_encode($resultArr,JSON_PRETTY_PRINT);
        die;
    }else{  
        $address1 = $resultSet['Entity_Attributes']['Address'];         
        $address2 = $resultSet['Entity_Attributes']['Address2'];
        $City = $resultSet['Entity_Attributes']['City'];
        $County = $resultSet['Entity_Attributes']['County'];
        $PostCode = $resultSet['Entity_Attributes']['PostCode'];
        $PhoneNo = $resultSet['Entity_Attributes']['PhoneNo'];
        $Contact = $resultSet['Entity_Attributes']['Contact'];
        $MagentoDefault = $resultSet['Entity_Attributes']['MagentoDefault'];
        $Initials = $resultSet['Entity_Attributes']['Initials'];
        $FirstName = $resultSet['Entity_Attributes']['FirstName'];
        $Surname = $resultSet['Entity_Attributes']['Surname'];
        try{
            if(isset($AddressId) && $AddressId !=''){
                $address = $this->addressRepository->getById($AddressId);
                $address->setFirstname($FirstName);
                $address->setLastname($Surname);
                $address->setCountryId('GB');
                $address->setPostcode($PostCode);
                $address->setCity($City);
                $address->setPrefix($Initials);
                $address->setTelephone($PhoneNo);
                $this->addressRepository->save($address);
                $resultArr['message'] = "customer Address saved Sucessfully!!!";
                $paramArr['Address_Id'] = $addressId;
                $paramArr['NAV_ID'] = "";
                $resultArr['parameters'] = $paramArr;
                echo json_encode($resultArr,JSON_PRETTY_PRINT);
                die;
            }else{
                $customerObj = $this->_customer->load($customerId);
                $customerAddress = array();
                foreach($customerObj->getAddresses() as $address)
                {
                    $customerAddress[] = $address->toArray();
                }
                $addressId = $customerAddress[0]["entity_id"];
                if(isset($addressId) && $addressId != '' ){
                    $address = $this->addressRepository->getById($addressId);
                    $address->setFirstname($FirstName);
                    $address->setLastname($Surname);
                    $address->setCountryId('GB');
                    $address->setPostcode($PostCode);
                    $address->setCity($City);
                    $address->setPrefix($Initials);
                    $address->setTelephone($PhoneNo);
                    $this->addressRepository->save($address);
                    $resultArr['message'] = "customer Address saved Sucessfully!!!";
                    $paramArr['Address_Id'] = $addressId;
                    $paramArr['NAV_ID'] = "";
                    $resultArr['parameters'] = $paramArr;
                    echo json_encode($resultArr,JSON_PRETTY_PRINT);
                    die;
                }else{
                    $address = $this->_addressFactory->create();//->setStreet(Street)                   

                    $address->setCustomerId($customerId)
                        ->setFirstname($FirstName)
                        ->setLastname($Surname)
                        ->setCountryId('GB')
                        ->setPostcode($PostCode)
                        ->setCity($City)
                        ->setRegion($County)
                        ->setPrefix($Initials)
                        ->setStreet($address2)
                        ->setTelephone($PhoneNo)                    
                        ->setIsDefaultBilling('1')
                        ->setIsDefaultShipping('1')
                        ->setSaveInAddressBook('1');
                        $address->save();

                        $resultArr['message'] = "customer Address saved Sucessfully!!!";
                        $paramArr['Address_Id'] = $address->getId();
                        $paramArr['NAV_ID'] = "";
                        $resultArr['parameters'] = $paramArr;
                        echo json_encode($resultArr,JSON_PRETTY_PRINT);
                        die;
                    }                   

            }
        }
        catch(\Exception $e){
                $resultArr['result'] = "Failed";
                $resultArr['message'] = $e->getMessage();
                $paramArr['Magento_ID'] = '';
                $paramArr['NAV_ID'] = '';
                $resultArr['parameters'] = $paramArr;
        } 

        echo json_encode($resultArr,JSON_PRETTY_PRINT);
        die;
    }
}
}

I need to update customer address using customerId or addressId, How this can be done? if address id not exist i am trying to get addresId from customerId and updating else i am creating new address for customer.

Here is my request json.

{
 "params": {
"Entity_Type": "Address",
"Entity_Attributes": {
  "Name": "test",
  "CustomerId": "46897",
  "AddressId":"0",
  "Address": "test",
  "Address2": "test",
  "City": "Craigavon",
  "County": "test",
  "PostCode": "BT65 5BE",
  "PhoneNo": "656565656565",
  "FirstName": "test",
  "Surname": "test"
   }
 }
}
4

You need to call below api for customer address update

API : xyz.com/rest/V1/customers/2

Header:

Authorization :"Bearer ishamls4xu7pnwhlvup141502tjm3cl2"
Content-Type :"application/json"

Method : PUT

Parameter :

{
    "id": 2,
    "group_id": 1,
    "default_billing": "1",
    "default_shipping": "2",
    "created_at": "2017-04-26 14:31:22",
    "updated_at": "2018-09-01 08:08:47",
    "created_in": "Default Store View",
    "email": "abc@xyz.com",
    "firstname": "ABC",
    "lastname": "XYZ",
    "store_id": 1,
    "website_id": 1,
    "addresses": [
        {
            "id": 1,
            "customer_id": 2,
            "region": {
                "region_code": null,
                "region": null,
                "region_id": 0
            },
            "region_id": 0,
            "country_id": "MY",
            "street": [
                "No 545 Jalan balau 27/13",
                "sinar link Taman rinting"
            ],
            "company": "Mahnazfood",
            "telephone": "04040404040404",
            "fax": "01010101101010101",
            "postcode": "81750",
            "city": "Masai",
            "firstname": "ABC",
            "lastname": "XYZ",
            "default_billing": true
        },
        {
            "id": 2,
            "customer_id": 2,
            "region": {
                "region_code": null,
                "region": null,
                "region_id": 0
            },
            "region_id": 0,
            "country_id": "MY",
            "street": [
                "Colony#3 Block#126/F",
                "Address 2"
            ],
            "company": "Prashant",
            "telephone": "9999999999",
            "fax": "00000000000000",
            "postcode": "45000",
            "city": "Lahore",
            "firstname": "Test",
            "lastname": "Test",
            "default_shipping": true
        }
    ],
    "disable_auto_group_change": 0,
    "extension_attributes": {
        "is_subscribed": false
    }
}

Note: Pass address Id in parameter so it will update existing address, if you not pass address id in parameter it will create new address for customer

3

check below code that helps you somewhat

/**
 * @var \Magento\Customer\Api\CustomerRepositoryInterface
 */
protected $customerRepository;
protected $addressRepository;
protected $addressData;

/**
 * Sync constructor.
 * @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
 */
public function __construct(
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Customer\Api\AddressRepositoryInterface $addressRepository,
    \Magento\Customer\Api\Data\AddressInterface $addressData   
) {
    $this->_customerRepository = $customerRepository;
    $this->addressRepository = $addressRepository;
    $this->addressData  = $addressData;
}

public function changeAddress($customerId)
{
    /** @var \Magento\Customer\Api\Data\AddressInterface $address */
    $customer = $this->_customerRepository->getById($customerId);
    $customerAddress = array();

    $address1 = $resultSet['Entity_Attributes']['Address'];         
    $address2 = $resultSet['Entity_Attributes']['Address2'];
    $City = $resultSet['Entity_Attributes']['City'];
    $County = $resultSet['Entity_Attributes']['County'];
    $PostCode = $resultSet['Entity_Attributes']['PostCode'];
    $PhoneNo = $resultSet['Entity_Attributes']['PhoneNo'];
    $Contact = $resultSet['Entity_Attributes']['Contact'];
    $MagentoDefault = $resultSet['Entity_Attributes']['MagentoDefault'];

    $FirstName = $resultSet['Entity_Attributes']['FirstName'];
    $Surname = $resultSet['Entity_Attributes']['Surname'];


    $addressId = $resultSet['Entity_Attributes']['AddressId'];

    $address = $this->addressData;
    //$address->setCustomerId($customerId);
    if($addressId){
    $address->setId($addressId);  
    }
    $address->setFirstname($FirstName);
    $address->setLastname($Surname);
    $address->setCountryId('GB');
    $address->setPostcode($PostCode);
    $address->setCity($City);
    $address->setTelephone($PhoneNo);
    $address->setStreet($address1);
    $address->setSaveInAddressBook('1');
    // update what ever you want
    $this->addressRepository->save($address);
}
  • $addressId = $resultSet['Entity_Attributes']['CustomerId']; this line is not valid. why you are passing customerId to AddressId – jafar pinjar Aug 31 '18 at 13:29
  • in my request customerId and AddressId both are there, if addressId is passed, should check that address id and update, else using customerId, i need to check if he has addressId, update with that id , else create new address for customer, This is my full requirement – jafar pinjar Aug 31 '18 at 13:31
  • @jafarpinjar I have updated the code with addressId – Murtuza Zabuawala Aug 31 '18 at 13:54
  • hi @Murtuza, i think you didn't get my point, Please read my above comment, if address id passed in request, i need to update address for that id, else i need to check for customerId and fetch his addressId and update else create new address for that customerId, your code will work only if we pass proper addressId, if invalid address id or empty value passed , that time its not work i guess – jafar pinjar Aug 31 '18 at 14:00
  • somehow i managed to create address, but setRegion is throwing error. – jafar pinjar Sep 1 '18 at 9:14
3

If you know the address id $addressId you can use the address repository to load and save updated addresses:

/**
 * @var \Magento\Customer\Api\CustomerRepositoryInterface
 */
protected $customerRepository;
protected $addressRepository;

/**
 * Sync constructor.
 * @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
 */
public function __construct(
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Customer\Api\AddressRepositoryInterface $addressRepository
) {
    $this->_customerRepository = $customerRepository;
    $this->addressRepository = $addressRepository;
}

public function changeAddress($customerId)
{
    /** @var \Magento\Customer\Api\Data\AddressInterface $address */
    //$customer = $this->_customerRepository->getById($customerId);

    $customerObj = $this->objectManager->create('Magento\Customer\Model\Customer')->load($customerId);
    $customerAddress = array();

    foreach ($customerObj->getAddresses() as $address)
    {
        $customerAddress[] = $address->toArray();
    }

    /*foreach ($customerAddress as $customerAddres) {

        echo $customerAddres['street'];
        echo $customerAddres['city'];
    }*/

    $addressId = $customerAddress[0]["entity_id"];

    //$addressId = $customer->getAddresses()->getId();
    $address = $this->addressRepository->getById($addressId);
    //$address->setCustomerId($customerId);
    $address->setFirstname('test');
    $address->setLastname('test');
    $address->setCountryId('GB');
    $address->setPostcode('BH 1BD');
    $address->setCity('Test');
    $address->setTelephone('');
    $address->setStreet('');
    //$address->setSaveInAddressBook('1');
    // update what ever you want
    $this->addressRepository->save($address);
}
  • How can we update it using customerId? I am looking for code with customer id. – jafar pinjar Aug 31 '18 at 6:35
  • check my updated code, for change address by customer id – Aasim Goriya Aug 31 '18 at 6:59
  • you are not injecting _customerRepository, and can you please update the code for check if customer have address i need to update else i need to create new address. – jafar pinjar Aug 31 '18 at 7:05
  • $address->setCustomerId($customerId); is throwing error, Uncaught Error: Call to a member function setCustomerId() – jafar pinjar Aug 31 '18 at 7:10
  • can you update me correct code please. – jafar pinjar Aug 31 '18 at 7:31
0

I just created a new module but without own api interfaces and models. Instead I use the default ones of magnento-customer.

Could be a simple alternative.

See https://magento.stackexchange.com/a/297701/15114

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.