Come aggiornare l'indirizzo del cliente usando l'API personalizzata in magento2?


8

Ho creato un'API personalizzata per aggiornare l'indirizzo del cliente utilizzando customer ido l'indirizzo ID.

Sotto il codice l'ho usato per implementarlo.

[Fornitore] / [Modulo] /etc/webapi.xml

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

[Fornitore] / [Modulo] /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] / [Modulo] /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;
    }
}
}

Devo aggiornare l'indirizzo del cliente utilizzando customerIdo addressId, Come è possibile farlo? se l'ID indirizzo non esiste, sto cercando di ottenere l'indirizzo ID dal cliente e, in caso di aggiornamento, sto creando un nuovo indirizzo per il cliente.

Ecco la mia richiesta 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"
   }
 }
}

Risposte:


4

È necessario chiamare sotto API per l'aggiornamento dell'indirizzo del cliente

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

Intestazione:

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

Metodo: PUT

Parametro:

{
    "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
    }
}

Nota: Passa ID indirizzo nel parametro in modo da aggiornare l'indirizzo esistente, se non passi ID indirizzo nel parametro creerà un nuovo indirizzo per il cliente


3

controlla sotto il codice che ti aiuta in qualche modo

/**
 * @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']; questa linea non è valida. perché stai passando ID cliente a AddressId
pinjar

nella mia richiesta customerId e AddressId sono entrambi presenti, se addressId viene passato, dovrebbe controllare quell'ID indirizzo e aggiornarlo, altrimenti usando customerId, devo controllare se ha addressId, aggiornare con quell'ID, altrimenti creare un nuovo indirizzo per il cliente, questo è il mio requisito completo
jafar pinjar

@jafarpinjar Ho aggiornato il codice con addressId
Murtuza Zabuawala

ciao @Murtuza, penso che tu non abbia capito il mio punto, per favore leggi il mio commento sopra, se l'ID dell'indirizzo è passato nella richiesta, devo aggiornare l'indirizzo per quell'id, altrimenti devo controllare il clienteId e recuperare il suo indirizzoId e aggiornare altro crea un nuovo indirizzo per quel clienteId, il tuo codice funzionerà solo se passiamo l'indirizzoId corretto, se l'ID dell'indirizzo non valido o il valore vuoto sono passati, quella volta non funziona immagino
jafar pinjar

in qualche modo sono riuscito a creare l'indirizzo, ma setRegion sta generando un errore.
jafar pinjar,

3

Se conosci l'indirizzo ID $ addressId puoi utilizzare il repository di indirizzi per caricare e salvare gli indirizzi aggiornati:

/**
 * @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);
}

Come possiamo aggiornarlo usando customerId? Sto cercando un codice con ID cliente.
jafar pinjar,

controlla il mio codice aggiornato, per cambiare l'indirizzo in base
all'ID

non stai iniettando _customerRepository e puoi aggiornare il codice per verificare se il cliente ha un indirizzo, devo aggiornarlo altrimenti devo creare un nuovo indirizzo.
jafar pinjar,

$ indirizzo-> setCustomerId ($ customerId); genera errore, errore non rilevato: chiamata a una funzione membro setCustomerId ()
jafar pinjar

puoi aggiornarmi codice corretto per favore.
jafar pinjar,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.