Magento API: customer

Hace un tiempo había empezado a mostrarles un poco cómo jugar con la API de Magento.

Hasta ahora, sólo habíamos visto cómo obtener información, casi sin interacción.

Había hablado también de los 5 grupos de módulos que posee la API:

  • Mage_Customer.
  • Mage_Directory.
  • Mage_Catalog.
  • Mage_Sales.
  • Mage_CatalogInventory.

Hoy vamos a meternos en uno más que importante: Mage_Customer.

A través de ésta sección del webservice, vamos a poder crear clientes, y también obtener información de los mismos.

Consideren lo interesante que puede ser esto al momento de integrar la tienda con cualquier sistema de gestión que pueda estar usando el cliente.

A diferencia de los ejemplos que vimos sobre el módulo Mage_Catalog, en el caso de hoy vamos a tener varios métodos más, por lo cual el post será algo más extenso y van a tener que prestar un poco más de atención.

Haciendo uso de Customer, vamos a poder crear clientes, listarlos, obtener sus datos, actualizarlos e incluso borrarlos.

Vamos a recorrer cada uno de los métodos, comenzando con obtener la lista de clientes.

<?php
 
//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");
 
//Login
$session = $client->login("usuario", "contraseña");
 
//Listado de clientes
$customers = $client->call($session, "customer.list");
 
//Impresión
print_r($customers);
 
//Logout
$client->endSession($session);
 
?>

Supongo que imaginarán el resultado.

Array
(
)

Como no tenemos ningún cliente creado, no vamos a ver nada.

Lo que vamos a hacer ahora, es agregar clientes a nuestra base de datos.

Vayamos al ejemplo.

<?php

//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");

//Login
$session = $client->login("usuario", "contraseña");

//Atributos para el nuevo cliente
$data = array(
    "firstname"       => "Damián",
    "lastname"        => "Culotta",
    "email"           => "mail@dominio.com.ar",
    "password_hash"   => md5("contraseña"),
    "store_id"        => 0,
    "website_id"      => 0
);

//Crea cliente
$id = $client->call($session, "customer.create", array($data));

//Impresión
print_r($id);

//Logout
$client->endSession($session);

?>

Lo que hicimos fue crear una array llamado $data en el cual pasamos algunos atributos con sus valores.

A continuación, invocamos el método customer.create y le pasamos nuestro array.

Con éste método, obtenemos un Entero como respuesta a la ejecución. Lo que veremos será el id que se le ha asignado a nuestro cliente.

Siguiendo el ejemplo, veríamos lo ésto:

1

Ahora si, podemos volver con el método anterior, customer.list.

A diferencia del comienzo, ahora si obtenemos un array con datos. Por el momento, de nuestro único cliente.

Array
(
    [0] => Array
        (
            [customer_id] => 1
            [created_at] => 2009-03-14 00:30:33
            [updated_at] => 2009-03-14 00:30:33
            [increment_id] => 000000001
            [store_id] => 0
            [website_id] => 0
            [created_in] => Admin
            [email] => mail@dominio.com.ar
            [firstname] => Damián
            [group_id] => 1
            [lastname] => Culotta
            [password_hash] => 4c882dcb24bcb1bc225391a602feca7c
        )
)

Como ven, hay ciertos valores que en caso de no indicarlos, son llenados automáticamente por el webservice.

Con customer.list, también podemos hacer búsquedas.

Para eso, tenemos que agregar los filtros que deseamos.

Vamos a modificar el ejemplo de customer.list para obtener como resultado el único valor que ahora tengo cargado.

<?php

//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");

//Login
$session = $client->login("usuario", "contraseña");

//Filtro de búsqeuda
$filter = array(
    "lastname" => "Culotta"
);

//Listado de clientes filtrado
$customers = $client->call($session, "customer.list", array($filter));

//Impresión
print_r($customers);

//Logout
$client->endSession($session);

?>

El ejemplo devolvería lo mismo que si no usáramos filtro, pero si se ponen a crear varios clientes, van a poder ver la búsqueda con filtros en acción.

Si sólo buscamos un cliente en particular y sabemos su id, podemos hacer uso del método customer.info.

<?php

//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");

//Login
$session = $client->login("usuario", "contraseña");

//Id cliente
$id = "1";

$customer = $client->call($session, "customer.info", $id);

//Impresión
print_r($customer);

//Logout
$client->endSession($session);

?>

La salida seria la siguiente.

Array
(
    [customer_id] => 1
    [created_at] => 2009-03-14 03:30:33
    [updated_at] => 2009-03-14 03:30:33
    [increment_id] => 000000001
    [store_id] => 0
    [website_id] => 0
    [created_in] => Admin
    [email] => mail@dominio.com.ar
    [firstname] => Damián
    [group_id] => 1
    [lastname] => Culotta
    [password_hash] => 4c882dcb24bcb1bc225391a602feca7c
)

Queda claro que la información es la misma que la devuelta por el método customer.list ya que no me puse a crear clientes de forma masiva.

Lo próximo que podríamos necesitar hacer, es actualizar información de éste cliente.

Vamos al ejemplo de customer.update.

<?php

//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");

//Login
$session = $client->login("usuario", "contraseña");

//Id cliente
$id = "1";

//Datos a actualizar
$data = array(
    "email" => "correo@dominio.com.ar",
    "passwordhash" => md5("otracontraseña")
);

$status = $client->call($session, "customer.update", array($id, $data));

//Impresión
print_r($status);

//Logout
$client->endSession($session);

?>

Antes de ver el resultado de la operación, algunas explicaciones.

El método va a recibir un array de parámetros.

En el ejemplo, esos parámetros son:

array($id, $data)

En la variable $id tendremos el id interno que utiliza Magento para identificar al usuario.

$data es el array que pasamos con los atributos que queremos actualizar y sus respectivos nuevos valores.

También hago uso de la variable $status. Esto se debe a que el método customer.update, devuelve un valor Booleano sobre el estado de la operación.

Sobre el detalle de qué sucede luego de una operación, vamos a volver dentro de unas pocas líneas.

Veamos ahora el último método: customer.delete.

Está claro que si podemos listar, crear y actualizar; también tenemos que poder borrar.

Vamos con el último ejemplo del módulo.

<?php

//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");

//Login
$session = $client->login("usuario", "contraseña");

//Id cliente
$id = "1";

$status = $client->call($session, "customer.delete", $id);

//Impresión
print_r($status);

//Logout
$client->endSession($session);

?>

Este caso es bastante similar al de customer.info; aunque al igual que customer.update, obtenemos un valor Booleano para conocer el resultado de la operación.

Un detalle a tener en cuenta, es que no usé ningún tipo de control de error en los ejemplos.

Para el uso de customer, existen 4 excepciones definidas.

  • 100: Invalid customer data. Details in error message.
  • 101: Invalid filters specified. Details in error message.
  • 102: Customer does not exist.
  • 103: Customer not deleted. Details in error message.

Como ya vimos en otros ejemplos, sería más prudente capturar las excepciones y operar en consecuencia en caso de error.

Cuando trabajemos con éste módulo, los métodos en los cuales deberíamos hacer la captura serian:

  • customer.create
  • customer.update
  • customer.delete

Pensando en esto, el último ejemplo, nos quedaria de la siguiente forma.

<?php

//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");

//Login
$session = $client->login("usuario", "contraseña");

try {

    //Id cliente
    $id = "1";

    $status = $client->call($session, "customer.delete", $id);

    //Impresión
    print_r($status);

} catch (SoapFault $exception) {

    echo "<h1>Se produjo un error</h1>";
    echo "<p>Código: " . $exception->faultcode . "</p>";
    echo "<p>Mensaje: " . $exception->faultstring . "</p>";

}

//Logout
$client->endSession($session);

?>