Entendendo as APIs do Magento – SOAP – Introdução

Este post faz parte de uma séries de posts que vou fazer sobre os WebServices do Magento, tanto em SOAP quanto em REST. Espero realmente que curtam este conteúdo e o que está por vir.

A API SOAP v1 do Magento proporciona a possibilidade de gerenciar suas lojas e-commerce fazendo chamadas para trabalhar com os resources do Magento como clientes, produtos e pedidos de vendas. Ele também permite gerenciar os carrinhos de compras e o estoque de cada loja. A API SOAP versão v2 está disponível no Magento desde sua versão 1.3 e uma versão do WS-I compliant está disponível desde sua versão 1.6. Supported Types A API do Magento suporta SOAP e XML-RPC, aonde SOAP é o protocolo padrão. SOAP Para se conectar ao Web Services do Magento via SOAP, carregue o arquivo WSDL em seu cliente SOAP de alguma dessas duas URLs:

http://magentohost/api/?wsdl
http://magentohost/api/soap/?wsdl

Aonde magentohost é o domínio para sua loja Magento. A partir da versão 1.3 você deve usar a URL abaixo para acessar a API v2 do Magento, o qual teve uma melhoria de compatibilidade com Java e .NET:

http://magentohost/api/v2_soap?wsdl=1

O exemplo PHP abaixo mostra como fazer uma chamada SOAP na API v1 do Magento:

$client = new SoapClient('http://magentohost/soap/api/?wsdl');

// If somestuff requires api authentification,
// then get a session token
$session = $client->login('apiUser', 'apiKey');

$result = $client->call($session, 'somestuff.method');
$result = $client->call($session, 'somestuff.method', 'arg1');
$result = $client->call($session, 'somestuff.method', array('arg1', 'arg2', 'arg3'));
$result = $client->multiCall($session, array(
     array('somestuff.method'),
     array('somestuff.method', 'arg1'),
     array('somestuff.method', array('arg1', 'arg2'))
));


// If you don't need the session anymore
$client->endSession($session);

XML-RPC

Para utilizar o XML-RPC, carregue a seguinte URL em seu cliente XML-RPC:

http://magentohost/api/xmlrpc/

Aonde magentohost é o domínio para sua loja Magento.

O seguinte exemplo PHP mostra como fazer chamadas XML-RPC:

$client = new Zend_XmlRpc_Client('http://magentohost/api/xmlrpc/');

// If somestuff requires api authentification,
// we should get session token
$session = $client->call('login', array('apiUser', 'apiKey'));

$client->call('call', array($session, 'somestuff.method', array('arg1', 'arg2', 'arg3')));
$client->call('call', array($session, 'somestuff.method', 'arg1'));
$client->call('call', array($session, 'somestuff.method'));
$client->call('multiCall', array($session,
     array(
        array('somestuff.method', 'arg1'),
        array('somestuff.method', array('arg1', 'arg2')),
        array('somestuff.method')
     )
));

// If you don't need the session anymore
$client->call('endSession', array($session));

O XML-RPC suporta apenas a versão 1 da API do Magento.

Métodos da API

A tabela seguinte contem os métodos da API que podem ser chamados de seu cliente SOAP ou XML-RPC na API v1 do Magento.

Method Description Return Value
startSession() Start the API session and return session ID. string
endSession(sessionId) End the API session. boolean
login(apiUser, apiKey) Start the API session, return the session ID, and authorize the API user. string
call(sessionId, resourcePath,array arguments) Call the API resource that is allowed in the current session. See Note below. mixed
multiCall(sessionId, array calls,array options) Call the API resource’s methods that are allowed for current session. See Notes below. array
resources(sessionId) Return a list of available API resources and methods allowed for the current session. array
globalFaults(sessionId) Return a list of fault messages and their codes that do not depend on any resource. array
resourceFaults(sessionId, resourceName) Return a list of the specified resource fault messages, if this resource is allowed in the current session. array

Nota: para chamadas e multiplas chamadas, se nenhuma sessão for especificada, você pode chamar apenas resources que não são protegidos nas chamadas.
Nota: Para múltiplas chamadas, se a opção “break” for especificada, a múltipla chamada para no primeiro erro.

A API v2 do Magento não suporta os métodos call() e multicall(), em vez disso ele fornece um método separado para cada resource da API.

Erros Globais da API

A seguinte tabela contem os códigos dos erros que são aplicados para todas as chamadas SOAP/XML-RPC.

Fault Code Fault Message
0 Unknown Error
1 Internal Error. Please see log for details.
2 Access denied.
3 Invalid api path.
4 Resource path is not callable.

API SOAP Versão v2

Desde a versão 1.3 do Magento, a versão v2 do API do SOAP está disponível. A principal diferença entre v1 e v2 é que ao invés de utilizar os métodos call e multicall, ele separa os métodos para cada ação.

Por exemplo, considere o seguinte código PHP utilizando a v1 do SOAP:

$params = array(array(
    'status'=>array('eq'=>'pending'),
    'customer_is_guest'=>array('eq'=>'1'))
));
$result = $client->call($sessionId, 'sales_order.list', $params);

Com o SOAP v2, o seguinte código seria equivalente:

$params = array('filter' => array(
    array('key' => 'status', 'value' => 'pending'),
    array('key' => 'customer_is_guest', 'value' => '1')
));
$result = $client->salesOrderList($sessionId, $params);

Note que o WSDL para a v1 e v2 do SOAP são diferentes. No SOAP v1, customizar a API não envolve a alteração do WSDL. No SOAP v2, as alterações no WSDL são necessárias.

Você pode configurar o SOAP v2 para ser compatível com o WS-I no menu de configurações do sistema. Para fazer a alteração navegue até Services > Magento Core API > WS-I Compliance e altere seu valor para Yes.

Também perceba que o WSDL para o SOAP v1 e v2 são diferentes quando estão em modo compatível com WS-I.

Utilizando a compatibilidade WS-I para o WSDL da API do SOAP v2, fica fácil gerar automaticamente as classes do cliente para Java, .NET e outras linguagens que utilizem bibliotecas padrão.

Um abraço e até a próxima!

Tiago Sampaio

30 Comments

  1. Very nice post. I just stumbled upon your blog and wanted to say that I have truly enjoyed browsing your blog posts. After all I will be subscribing to your rss feed and I hope you write again soon!

    • Thanks a lot,

      I hope you enjoy each post I put here in my blog.
      I really hope they help you too.

      Thanks a lot.

      Tiago Sampaio

  2. Alexandre Gomes Reply

    Thiago, boa tarde…

    Você sabe o motivo de se não conseguir utilizar a API do magento no mesmo servidor? Tenho um hotsite que vai usar a API, construi uma camada de acesso a API do magento e ta tudo funcionando, só que quando tento acessar a API do magento da minha máquina, ele carrega o WSDL mas não funciona nenhum método, ai quando aponto a camada de acesso para meu servidor de homologação funciona tudo perfeitamente… tem alguma idéia do que pode ser?

    Obrigado… e parabéns pelo post!

    • Olá Alexandre,

      O SOAP está instalado no servidor?
      Acredito que você preciso entrar em contato com o suporte técnico de seu host.

      Abraços,

      Tiago Sampaio

  3. Raphael Igor Reply

    Olá Tiago.

    Como eu vejo o nome dos parametros que tenho de passar em cada chamada? Não achei documentação disto.

  4. marcos vinicius Reply

    olá…eu pretendo fazer uma parceria com uma loja para vender virtualmente seus produtos e gostaria de saber se na plataforma do magento eu consigo criar um webservice para buscar as informações de preço e estoque dos produtos que serão comercializados e se sim como fazer ?
    Obrigado !

  5. Eduardo Martins Reply

    Oi Thiago tudo bem?
    Cara eu tenho um servidor que montamos, um ubuntu na Under, ele não é gerenciado então os caras não vão me ajudar com isso.

    Enfim, o webservice não está funcionando. Quando eu mando pro servidor um arquivo com o script do exemplo aqui do post, roda, roda, roda e não retorna nada.

    Você já viu algo assim?

  6. Estou a meses tentado funcionar o soap e não consigo por nada, já entrei em contato co o pessoal do servidor e está tudo ligado da parte deles….

  7. celio ricardo Reply

    Tiago, poderia me dar uma dica:
    Estou usando o Magento 1.8 na minha máquina localmente, usando o EasyPHP. Quando instalei o Plugin dos Correios , apareceu a seguinte mensagem: ” A extensão do PHP Soap deve estar instalada para que o módulo dos Correios funcione corretamente.” Estou começando agora no Magento e não tenho conhecimento de programação. Não consigo resolver isso.
    Poderia me dar uma ajudinha ?
    Abs
    Ricardo

  8. celio ricardo Reply

    Poderia me dar uma dica:
    Estou usando o Magento 1.8 na minha máquina localmente, usando o EasyPHP. Quando instalei o Plugin dos Correios , apareceu a seguinte mensagem: ” A extensão do PHP Soap deve estar instalada para que o módulo dos Correios funcione corretamente.” Estou começando agora no Magento e não tenho conhecimento técnico nesse assunto.

  9. Tiago,

    Estou com problemas para obter o customerCustomerList na versão 1.6 do magento.
    Pois não trás nenhum retorno, já habilitei o trace e nada de getLastResponse

    Tem ideia do que pode estar faltando ??

    Abraços,
    Paulo

  10. Amigo, vc tem um tutorial de como configurar a loja cadastrando os usuarios do webserices, etc
    Cosegui conectar ao webservice da loja pelo C# mas nao tenho os dados de conexão, usuário, senha, etc…

    abraço.

  11. Boa tarde, Thiago

    Tenho que criar uma conexão com o magento, porém estou utilizando C# e não estou conseguindo converter o código php para C#, você pode me ajudar ?

    Obrigado

    • Olá Diego, tudo bem?

      Quando você diz que precisa criar uma conexão você quer dizer via API?

      Abraços,

      – Tiago

  12. Olá, estou precisando de um programador em Magento que faça uma API para meu comércio eletrônico que eu consigo replicar meus produtos em outro loja minha sem precisar cadastrar todos meus produtos novamente nesta loja nova.

    Você consegue executar esse serviço pra mim ?

    • Olá Marcelo,

      A plataforma que você usa atualmente é Magento? Em caso positivo, já existem APIs prontas para consumo de dados de produtos, clientes, pedidos, etc.

      Abraços,

      – Tiago

  13. Olá Tiago,
    estou com um problema que está difcil de resolver´.
    nossa integração, ao mover do diretorio de homologação para o de produção parou de funcionar.
    O erro:
    “SOAP-ERROR: Parsing WSDL: Couldn’t load
    from ‘http://www.canellado.com.br/index.php/api/v2_soap/index/?wsdl=1’ : failed to load external entity
    “http://www.canellado.com.br/index.php/api/v2_soap/index/?wsdl=1″

    Fui verificar se os usuário e chave da api estavam corretas e me deparei com outro problema, a opção Sistema” -> “Compartilhar recursos”, desapareceu do menu.

    Antes da migração tudo funcionava, tem idéia do que possa estar acontecendo?

    Grato

    • Olá Seijy,

      Nesta migração podem ter ocorrido vários problemas, e o que mais poderia impactar seria a migração do banco de dados. Verifique se o banco de dados foi migrado corretamente. Outra questão pode ser a configuração do ambiente, já me deparei com o mesmo tipo de problema e no caso o Apache não estava retornando o XML do SOAP corretamente devido má configuração.

      Abraços,

      – Tiago

  14. Ola,
    estou com problema para conectar Java com Magento via Sopa, será que poderia me dar alguma sugestão?
    Consigo criar o carrinho, adicionar cliente, endereço e produto, mas quando tento o pagamento, retorna que método de pagamento não é permitido. Estou usando o método “cashondelivery”, mas isto também acontece com outros métodos habilitados no backend.

  15. Ramon Valentim Reply

    Olá Tiago, boa tarde!

    Estou iniciando no Magento. Fiz a instalação semana passada, segui todos os passos recomendados pelo site do próprio Magento e a princípio está tudo funcionando. No momento, estou tentando consumir um webservice do Magento através de uma aplicação bem simples feita em php. Quando executo o comando $client = new SoapCliente(‘http://meumagento.com/index.php/api/v2_soap?wsdl=1’); recebo o seguinte retorno: “Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://meumagento.com/index.php/api/v2_soap?wsdl=1’ : failed to load external entity “http://meumagento.com/index.php/api/v2_soap?wsdl=1” in /var/www/html1/teste/index.php:19 Stack trace: #0 /var/www/html1/teste/index.php(19): SoapClient->SoapClient(‘http://meumagen…’) #1 {main} thrown in /var/www/html1/teste/index.php on line 19. Tens alguma pista do que pode ser?

    Obrigado desde já!
    Atenciosamente, Ramon.

    • Olá Ramon, tudo bem?

      Já tive problemas assim e resolvi aumentando o seguinte parâmetro do PHP.ini:

      default_socket_timeout =300

      Espero que te ajude. Teste e deixe o comentário aqui.

      Abraços,

      – Tiago

      • Ramon Valentim Reply

        Boa tarde Tiago.

        Consegui resolver.
        Aparentemente era algum problema com a versão do Magento e a configuração que eu havia feito.
        Desinstalei a versão anterior, instalei a versão 1.9.2.4 e realizei um teste com o mesmo código no PHP e consegui realizar a comunicação.

        Obrigado pelo retorno.
        Atenciosamente, Ramon.

  16. Tiago

    Ja utilizo a API do magento em meu ERP, foi totalmente desenvolvida internamente, porém travei no envio de produtos do ERP para a loja, onde utilizo a API SOAP V2 o catalogProductCreate, preciso enviar atributos tanto single como multiple, os single somente estão indo certinho, utilizo o PHP. Para enviar os atributos simple criei um array em additional_atribbutes e funciona, agora preciso passar dos dois tipos, você tem idéia de como posso fazer isso em PHP?

  17. Olá Thiago, boa tarde

    Estou usando uma URL SOAP no formato: http://magentohost/api/soap/?wsdl
    Uso o sistema Protheus e ele cria um client automaticamente onde consigo instânciar um objeto WSMagentoService e usar os métodos para integração via WS.
    Estou usando o método Call e preciso buscar uma lista com os pedidos no Magento.
    O método Call criado no meu client tem 3 parâmetros e não estou conseguindo passar o terceiro parâmetro corretamente. Você saberia me informar como faço para passar esse parâmetro, eu tentei montar um array mas deu erro informando que o tipo não é o correto. O método Call está abaixo para melhor entendimento. Note que o parâmetro oWSargs é do tipo “anyType”:

    // WSDL Method call of Service WSMagentoService
    WSMETHOD call WSSEND csessionId,cresourcePath,oWSargs WSRECEIVE oWScallReturn WSCLIENT WSMagentoService
    Local cSoap := “” , oXmlRet

    BEGIN WSMETHOD

    cSoap += ”
    cSoap += WSSoapValue(“sessionId”, ::csessionId, csessionId , “string”, .T. , .T. , 0 , NIL, .F.)
    cSoap += WSSoapValue(“resourcePath”, ::cresourcePath, cresourcePath , “string”, .T. , .T. , 0 , NIL, .F.)
    cSoap += WSSoapValue(“args”, ::oWSargs, oWSargs , “anyType”, .T. , .T. , 0 , NIL, .F.)
    cSoap += “”

    oXmlRet := SvcSoapCall( Self,cSoap,;
    “urn:Mage_Api_Model_Server_HandlerAction”,;
    “RPCX”,”urn:Magento”,,,;
    “http://www.wjcommerce.com.br/shpneus/dev4/index.php/api/soap/index/”)

    ::Init()
    ::oWScallReturn := WSAdvValue( oXmlRet,”_CALLRETURN”,”anyType”,NIL,NIL,NIL,”O”,NIL,NIL)

    END WSMETHOD

    oXmlRet := NIL
    Return .T.

    //Eu estou chamando o método dessa forma, sem informar o terceiro parâmetro, porém assim excede o limite de 1MB do servidor web pois estaria buscando todos os pedidos:

    oSvc := WSMagentoService():New()
    cMagUser := ALLTRIM(GetNewPar(“MV_MAGUSR”,”user”))
    cMagPsw := ALLTRIM(GetNewPar(“MV_MAGPSW”,”senha”))

    oSvc:login(cMagUser,cMagPsw)
    cIdSession := oSvc:cloginReturn

    oSvc:call(cIdSession,”order.list”,””)

    • Olá Rodrigo, tudo bem?

      Na realidade não sei exatamente como resolver seu problema, já que minha especialidade é PHP. Em PHP o terceiro parâmetro pode ser uma string em alguns casos ou um array em outros casos.

      O que posso tentar fazer para te ajudar é indicar um módulo que eu criei para facilitar essa integração do lado do Magento.

      https://github.com/tiagosampaio/ApiPlus

      Este módulo tem a finalidade de facilitar a integração utilizando uma abordagem bem mais simples do que o SOAP, porém com a mesma camada de abstração.

      Abraços,

      – Tiago

      • Obrigado Tiago,

        eu consegui desenvolver a aplicação usando outro método, no caso o sale_order.info: call(cIdSession,”sales_order.info”,cNumPed). Nesse método consigo passar o pedido no terceiro parâmetro e com isso ficou mais fácil para mim.

        valeu mesmo…

Leave A Reply

Navigate