Otras de las mejoras que vimos con la aparición de la versión 1.1 de Magento, fue la API.
Debido a la estrucutra de datos que utiliza la aplicación, no alcanza con hacer algunas altas o actualizaciones en la base de datos (si bien no es imposible y una vez que nos familiarizamos con el esquema de datos, no es tan complicado).
Igualmente, la API no es solamente una forma de resolver el proceso de alta o actualización de registros, sino que también permite sumergirnos en la integración de tecnologías.
Un escenario muy real, es el de tener un sistema offline propio para la gestión de nuestros productos, y ahora necesitamos vender a través de nuestra Tienda online, pero no queremos hacer doble trabajo.
Pensando en este escenario, vamos a crear nuestro primer acceso a la API, usando PHP.
Lo primero que tenemos que hacer, es crear roles y usuarios para poder acceder. La API utiliza Usuarios y Roles independientes a los que utiliza el backend en si mismo.
Avanzemos creando un Rol. Para esto, vamos a Sistema -> Web service -> Roles.
De más está decir que al ser nuestra primera visita, no vamos a encontrar ningún Rol definido. Creemos el primero.
Ingresamos un nombre único para nuestro Rol. Luego le asignaremos los permisos.
Como pueden ver, al igual que con los permisos del backend, podemos acotar las acciones posibles.
Para nuestro primer ejemplo, vamos a darle acceso irrestricto a nuestro Usuario.
En lugar de tildar todas las opciones, cambiamos el valor del select, de “Personalizado” a “Todos”.
Una vez que guardemos, veremos la confirmación del proceso de alta.
En mi caso, el Rol se llama CRM (para continuar con nuestro ejemplo de integración).
Ahora nos aparece una tercera solapa en el formulario del Rol, en la cual podemos asignar los Usuarios del Web Service que podrán utilizarlo.
Como pueden ver, no hay ningún Usuario disponible. Si bien es posible que me esté tornando demasiado insistente, esto es porque los Usuarios del backend no son los mismos que en la API.
Paso siguiente, crear un usuario para el Web Service.
Vayamos a Sistema -> Web Service -> Usuarios.
Como siempre, nuestra grilla vacía. Clickeamos en “Agregar nuevo usuario”.
El formulario es bastante sencillo, y tiene como particularidad que todos sus campos son obligatorios.
Una vez que carguemos los datos requeridos, pasamos a la segunda solapa, en donde veremos el Rol que acabamos de crear.
Lo unico que tenemos que hacer es tildar sobre el Rol que queremos para nuestro Usuario.
Con estos pasos, ya hemos creado nuestro primer Usuario de la API. Ahora, vamos a intentar conectarnos desde nuestra aplicación externa.
En este ejemplo, vamos a hacerlo con Php.
No se olviden de consultar la guía de referencia de la API de Magento para conocer los métodos posibles.
Teniendo ya todos los elementos, vamos con un primer ejemplo, en el cual vamos a consultar qué Productos tenemos en el catálogo.
<?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"); //Lista de productos $products = $client->call($session, "catalog_product.list"); //Impresion print_r($products); //Logout $client->endSession($session); ?>
La impresión que hago, es sólo de caracter informativo, para poder conocer qué nos devuelve el método catalog_product.list.
Lo que obtuvimos, fueron los dos Productos que ya había cargado en mi catálogo.
Como pueden ver, no es tan difícil obtener la información (si bien sólo la estamos viendo tal cual viene de la API). Igualmente, a manera de ejemplo, con estas líneas de código, ya tenemos una primera aproximación a la interacción con el Web Service.
Más adelante, en lugar de solo consumir esa información, vamos a mandar información a Magento a través de ésta vía.










Muy buena explicación, pero no entiendo cual es el url de la conexión… en cada caso
@Carla
Por url de la conexión me refiero a la dirección a la cual accederás para ingresar al Web Service, en el ejemplo, la dirección es:
http://www.dominio.com.ar/index.php/api/?wsdl
Está claro que http://www.dominio.com.ar será el dominio que tenga tu plataforma.
¿Es esto a lo que te referís o interpreté mal?.
sí, tenía un problema en la configuración de php pero ya está solucionado. Excelente aporte, me sirvió mucho para empezar a programar usando el web service de Magento.
@Carla
Me alegra que te haya servido. El uso de la API esbastante interesante.
En breve voy a estar armando algunos posts con una herramienta para integración de datos con la que estoy trabajando (junto con Magento).
Damián… estoy atada en un problema y pensé que quizás tu podrías saber.
Resulta que necesito un identificador de la tienda, para asociarlo con sus productos en otro sitio…
Qué campo cumple esta función y con que función de la API puedo obtenerlo?
Además.. ¿Magento guarda información de la empresa, por ejemplo: nombre, dirección, teléfono.. etc?
Ojalá pudiera responderme estas preguntas,
Muchas gracias.
en la API se habla del id de la tiuenda o del “code” de la tienda, pero aun no se como obtener ete valor…
saludos
@Carla
Prometo estar contestándote, y posteando más sobre el Web Service.
Estoy en medio de una implementación, la cual tiene la particularidad de haber hecho uso intensivo de la API para la gestión de productos, stock y otros detalles.
Saludos.
Hola…
Serian tan amable de mostrar un ejemplo sobre web services en magento donde se obtengan los productos y su stock…..la idea es interactuar con un ERP…..ahh otra cosita, la idea es manejar el stock desde la otra aplicacion
@miller
Si buscás un poco en el blog, vengo armando ejemplos de toda la API, si bien no tengo listo el de productos (es por lejos el módulo más grande y el más importante desde mi perspectiva).
Con el correr de los días voy a seguir posteando ejemplos de uso de los web services hasta cubrir todos los casos.
Lo que buscás hacer puede hacerse sin problema. De hecho, en alguna implementación en producción ya tengo eso corriendo.
Saludos.
Damián, creo que tu podrías responder una duda que tengo.
De un sistema accedo a unas tiendas en magento y recibo los productos a través del web service.
Pues bien, necesito recibir los productos y sus atributos. Esto lo estaba haciendo mediante una consulta al web service que trae todos los productos mediante “catalog_product.list”.
Y como esta no obtiene todos los datos accedo nuevamente por cada producto con “catalog_product.info”
Esto si bien funciona relentiza profundamente la funcion, muchas veces se detiene el programa completo. Tu sabes si existe alguna funcion del web service que reciba todos los datos de una vez, en sólo una llamada? es esto posible?
Muchas gracias.
Hola Carla.
¿Tu catálogo está compuesto por cuántos productos aproximadamente?.
¿La llamada al webservice la hacés con Php?.
En primer lugar, el uso de esos dos métodos de la API es la forma correcta de hacerlo.
Gracias por responder.
El catálogo está compuesto por aproximadamente 100 productos.
Sí, con php y xml rpc.
Mmm.. es decir que es la única forma? Hasta el momento no he podido hacerlo con todos los productos, es demasiado esfuerzo para mi máquina, o tal vez se cae la conexión a la API… .
No se me ocurre como solucionarlo…
Saludos.
Sólo de curioso, ¿por qué por RPC y no por SOAP?.
Porque es más rápido.
Je, fuera de la teoría, en este caso resultaría que ninguno de los dos es suficiente.
Te envié un mail referente al código que estás usando, ¿lo viste?.
Si, enviaré algo.
Entonces, cómo se podría hacer? directamente de la base de datos? :S
Antes de usar la base de datos, te recomiendo una herramienta para integraciones, llamada Jitterbit.
Hacé la prueba con ese tool que está bastante bueno y anda bastante bien.
Hola Damian… espero tu puedas ayudarme con este problema
Resulta que instale un nuevo modulo a mi tienda pero, no logre acceder a el con el administrador, fui a los roles a verificar que no existiera algo que me faltaba asignar
Sin embargo, no sé q error cometi y ahora cuando intento ingresar con el admin me sale access denied y los otros usuarios que tengo no tienen privilegios para cambiar los roles
Intente modificar alguna informacion de la tabla admin_role en la base de datos pero no fue exitoso
Espero que tu sepas de que forma puedo modificar los roles desde la base de datos para acceder de nuevo como administrador y tener TODOS los privilegios o crear un nuevo administrador… Te agradeceria muchisimo tu ayuda¡¡¡
La verdad que esta bueno el uso de API, pero tengo un problema que tiene que ver que cuando hago un call a culaquier api debo esperar mucho tiempo hasta que se recibe respuesta. Alguien mas tiene este problema???
Por ejemplo yo creo un cliente soap y luego de hacer el login, hago un call de customer.list. pero cuando se carga la pagina debo esperar 15 egundos para ver la lista de clientes.
@jmartinb
¿El WS corre en un servidor remoto, en una lan, en una pc local?.
¿Cuántos clientes tenés registardos?.
Saludos.
Hola Damián!
No puedo acceder a la api en un magento instalado en un ordenador de la red local. Sin embargo en la instalación de pruducción no tengo problemas.
Sabes a que se puede deber esto? la página se queda en blanco sin arrojar ningún error.
Saludos
A la página accedo sin problemas modificando el archivo host ubicado en C:\Windows\System32\drivers\etc
Saludos
@Alex
¿Cómo estás realizando la conexión?.
Estos son mis datos de conexión, he probado con www y sin www
//Url de la conexión$client = new SoapClient("http://www.xxx.com/index.php/api/?wsdl");
//Login
$session = $client->login("xxx", "xxx");
@Alex
El código no tiene error.
¿No hay log de error en tu equipo local o en el servidor de la lan?.
¿Es posible que haya algún firewall que impida que te conectes?
Hola Damian:
Gracias por este interesante blog.
Estoy intentando acceder a mi magento con el ejemplo que pones. He creado un archivo.php y he metido el codigo.
He ido a la ruta de este archivo para que se ejecute, pero no se muestra nada.
A ver si me puedes ayudar.
Gracias
El problema creo que esta en que no funciona la conexion y por tanto no ejecuta el resto
@Juan Carlos
Usá try catch para validar el error.
Podés ver un ejemplo en el post Magento API: directory_region.
Hola Damian:
Utilice el Try catch pero no sale nada.
He puesto echos para ver que va haciendo y no pasa del intento de conexion, de la llamada al new SoapClient
@Juan Carlos
Deberías revisar los logs de Apache para tratar de encontrar el error.
Ok. Lo miraré.
Por que lanzandolo en local con el XAMPP si me funciona.
Gracias
Hola Damian, he logrado acceder a los metodos necesarios para la informacion que se necesita tener en los wsdl, la tienda ya tiene implementado 1 wsdl y esta en la ruta por defecto de los wsdl (la que no se cual es), los metodos que implemente para traer la informacion retornan arreglos y para confirmar la informacion los imprimi en pantalla, todo esta correcto.
Ahora quisiera saber como puedo volver los metodos un WSDL accesible para C#…
De antemano muchas gracias de nuevo… se que ya teniendo los metodos que traen la info no debe ser gran cosa….
Gracias.
@chris
No estoy seguro de lo que buscás, ¿pero te referís a los métodos disponibles en la API de Magento?
Si Damian, ya tengo lo que me esta trayendo la informacion de la DB por ejemplo:
$product_data['Cedula_Comprador']= $myOrder->getCustomerTaxvat();
$product_data['Apellido_Comprador']= $myOrder->getBillingAddress()->getLastname();
$product_data['Nombre_Comprador']= $myOrder->getBillingAddress()->getFirstname();
Lo almaceno en un array y luego lo retorno para verlo en pantalla, asi probe que me funcionara todo, ahora quiero es poner eso en un WSDL para que sea consumido, eso es todo lo que me hace falta, si me pudieras aconsejar te lo agradeceria.
Gracias por responder tan pronto!
@chris
¿Revistas la documentación oficial?.
Tenés ejemplos de todo: http://www.magentocommerce.com/support/magento_core_api