Para chamar um serviço no PHP 5 existe uma classe chamada SoapClient. A documentação pode ser encontrada no manual do PHP. Nesse exemplo, vamos utilizar um WebService SOAP de conversão de temperatura que está disponível online: http://www.webservicex.net/ConvertTemperature.asmx?WSDL
O exemplo básico consiste em criar um objeto SoapClient passando o WSDL e invocar o método "__soapCall" passando os parametros adequados. Para isso é só criar uma página PHP com o seguinte conteúdo:
<?php $client = new SoapClient('http://www.webservicex.net/ConvertTemperature.asmx?WSDL'); $function = 'ConvertTemp'; $arguments= array('ConvertTemp' => array( 'Temperature' => 31, 'FromUnit' => 'degreeCelsius', 'ToUnit' => 'degreeFahrenheit' )); $options = array('location' => 'http://www.webservicex.net/ConvertTemperature.asmx'); $result = $client->__soapCall($function, $arguments, $options); echo 'Response: '; print_r($result); ?>
Na linha 2 criamos o objeto SoapClient passando o WSDL como parâmetro. O WSDL não precisa estar necessariamente no servidor do serviço, você pode copiar para o seu próprio servidor. Na linha 3 especificamos o nome da operação a ser executada. Na linha 4 criamos o payload de requisição. Essa parte é muito importante, pois esse payload tem que obedecer o esquema definido dentro do WSDL. Para o nosso caso a estrutura é a seguinte:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ConvertTemp xmlns="http://www.webserviceX.NET/"> <Temperature>double</Temperature> <FromUnit>degreeCelsius or degreeFahrenheit or degreeRankine or degreeReaumur or kelvin</FromUnit> <ToUnit>degreeCelsius or degreeFahrenheit or degreeRankine or degreeReaumur or kelvin</ToUnit> </ConvertTemp> </soap:Body> </soap:Envelope>
O conteúdo dentro da tag Body é a estrutura a ser seguida. Na linha 9 o endpoint do serviço é sobreescrito e na linha 10 realizamos a chamada do serviço e atribuímos a sua resposta à variável "result".
Agora é só executar e verificar a saída. Para outros parâmetro e dados mais elaborados, consulte o manual do PHP.
Muito fera!
Como faço para passar um objeto para um método do webservice? Exemplo: o método do meu webservice espera 3 parametros:
O primeiro é um objeto VO, que contém alguns strings e ints. Como faço para setar esses parametros e enviar para o método do webservice? Você poderia me dar um exemplo?
Obrigada
Se for em PHP, vocẽ só precisa aninhar os arrays e pegar os valores do objeto. Você possui o WSDL desse serviço?
Bom dia, tudo bem??
Estou com um problema, se vc me ajudasse agradeceria muito. O problema é que estou tentando acessar um webservice com autenticação de Header,
do spc brasil que utiliza java.
Consegui fazer a autenticação, e utilizar uma das funcoes que seria listarProdutos, que não necessita de parametros adicionais, entretanto,
qdo tento realizar uma consulta, e passando os parametros necessarios ele me retorna o erro:
[faultcode] => S:Server
[faultstring] => com.sun.istack.XMLStreamException2: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'soapenv:Envelope'.
)
o atendente de lá, diz que do lado dele funciona, utilizando o xml de parametro, ms no meu nao funciona.
eu utilizo, php, com a biblioteca nosuap
include_once('lib/nusoap.php');
$wsdl = 'https://treina.spc.org.br/spc/remoting/ws/consulta/consultaWebService?WSDL';
$client = new nusoapclient($wsdl,true);
$client->setCredentials('xxxxx','yyyy','basic');
$string_detalhar .= ''13';
$retorno = $client->call('detalharProduto',$string_detalhar);
ja tentei de tudo e ja pesquisei muito e nada...
Agradeço sua atençao...
Bom dia !
Luiz estou com pequeno problema também, gostaria de saber se você consegui resolver?
Qual problema?
Boa tarde Amigo,
Não consigo fazer a integração com SPC Brasil, gostaria de saber como faço essa autenticação com header?
Tem como passar um exemplo?
Como faço para pegar apenas o resultado da transformação de temperatura?
Quando dá o print retorna ex:
stdClass Object ( [ConvertTempResult] => 89.6 )
Como faço para pegar apenas o 89.6 ?
echo 'O valor de 31 graus Celsius convertido para Fahrenheit eh de '.$result->ConvertTempResult;
Bom dia Amigo,
Estou tentando implementar a consulta WebService da SPC Brasil no meu sistema, não é PHP é xHrabour com FiveWin porém a idéia é a mesma;
Eu consegui autenticar normalmente, mas não estou conseguindo pegar as informações do WebService, eu não sei se é o XML que estou enviando, ou as informações estão incorretas, como eu tenho que montar o XML na mão mesmo fica um pouco difícil, a baixo segue meu XML de envio se vocês puderem me ajudar eu agradeço.
12
F
000.000.000-00
Não consigo usar o listarProdutos também não sei como fazer isso e não tenho exemplos e também o pessoa do SPC eu liguei lá e eles não me ajudaram muito a respeito.
Grato
Boa tarde Amigo,
Não consigo fazer a integração com SPC Brasil, gostaria de saber como faço essa autenticação que você fez?
meu código xml bugou:
requisicao:= ''
+ ''
+ '12'
+ 'F'
+ '000.000.000-00'
+ '';
[...] de maneira muito simples com as ferramentas necessárias, mas fiquei com uma certa inveja do PHP. Nesse artigo, podemos ver que é muito simples invocar serviços SOAP no PHP. Tá certo que não tem as [...]
Olá Thiago, parabéns pelo post.
veja se consegue me ajudar, estou tentando consumir um webservice para emissão de uma NFS-e, porém preciso assinar digitalmente o XML que vai para o servidor do serviço. Vi algumas funções e classes php que fazem isso, mas fazem para arquivos XML propriamente ditos, e pelo que vejo, a gnt não tem acesso ao XML gerado nesse seu exemplo, parece que a classe SOAP do PHP faz o arquivo e envia sem o nosso acesso ao arquivo, sendo assim, tem alguma ideia de como posso fazer isso, qualquer ajuda é bem vinda, obrigado.
Se você tem que assinar o XML não vejo como fazer conforme o post. Teria que fazer separado.
Entendi, há a possibilidade de eu gerar o XML de forma manual e enviar para o webservice pelo SOAP.
tenho um arquivo php e estou precisando inserir um codigo de conversão do adwordes e nao sei onde insiro ,,, manda inseir entre tag body e heat so que a pagina em php nao tem estas tags ,, alguem me ajuda
Ótimo artigo.
Estou fazendo essa mesma chamada para receber um resultado no formato "boolean", porém não retorna nada.
Alguem sabe o porque?
Obrigado
Victor,
estou começando a utilizar Webservices e pelo pouco que aprendi acho que você o WSDL está setado para retornar um Double (double)
Como realizo a chamada para esse webservice:
http://consulta.confirmeonline.com.br/Integracao/Consulta?wsdl
A função que quero obter retorno é a Cpfcnpj (tenho as informações referente a nome e senha)
Porem sempre me retorna que não se pode converter
Object of class stdClass could not be converted to string
Com isso entendo que não posso imprimir o resultado sem passar por um objeto, ai que não estou tendo resultado.
ola pessoal, tb to tentando acessar um WS, pra envio de NFS-e.
o codigo q to usando é este:
array(
'Temperature' => 31,
'FromUnit' => 'degreeCelsius',
'ToUnit' => 'degreeFahrenheit'
));*/
$arguments = "";
$options = array('location' => 'https://www.webiss.com.br/sinop_wsnfse_homolog/NfseServices.svc');
$result = $client->__soapCall($function, $arguments, $options);
echo 'Response: ';
print_r($result);
?>
e o erro:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://www.webiss.com.br/sinop_wsnfse_homolog/NfseServices.svc?wsdl' : failed to load external entity "https://www.webiss.com.br/sinop_wsnfse_homolog/NfseServices.svc?wsdl" in C:\wamp\www\test_nfs.php:2 Stack trace: #0 C:\wamp\www\test_nfs.php(2): SoapClient->SoapClient('https://www.web...') #1 {main} thrown in C:\wamp\www\test_nfs.php on line 2
alg tem alguma ideia do q pode ser?
ja fiz o xml, mas nao to conseguindo consumir o webservice
O problema é o uso de https... consegue copiar esse wsdl pro seu projeto?
Salvou meu dia, kkkkkkkkkkk
Excelente exemplo, resolveu o meu problema. Obrigado!
Muito bom, foi muito útil para mim, obrigado !
Estou rodando aqui, mas como retorno está vindo uma página em branco. O que eu posso estar fazendo errado?
Tem como me enviar o código que você está executando?
Muito bom o artigo. Mas estou com um problema. Estou usando zend framework e estou tentando consumir um serviço do Banco Central. Só que ele esta levantando uma exceção com a mensagem "Internal Server Error". Só que se eu utilizar a classe SoapClient do php ela funciona normalmente. Abaxo segue meu codigo:
public function bancoCentralAction()
{
try {
$sUrl = 'https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/FachadaWSSGS.wsdl';
$oBcb = new Zend_Soap_Client($sUrl);
print_r($oBcb->getUltimoValorXML(159));
} catch (Exception $exc) {
echo '';echo '';
echo $exc->getMessage();
echo '';
echo $exc->getTraceAsString();
echo '';
echo $exc->getCode();
echo '';
echo $exc->getFile();
echo '';
echo $exc->getLine();
}
}
Sabe onde posso estar errando? Tenho que fazer alguma configuração a mais por ser https? Este wsdl peguei no seguinte endereço: https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/sgsAjuda.jsp
Qual erro?
botei pra rodar seu exemplo porem me retorna o seguinte erro:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.webservicex.net/ConvertTemperature.asmx?WSDL' : failed to load external entity "http://www.webservicex.net/ConvertTemperature.asmx?WSDL" in C:\Program Files\EasyPHP-DevServer-14.1VC9\data\localweb\my portable files\new6.php:2 Stack trace: #0 C:\Program Files\EasyPHP-DevServer-14.1VC9\data\localweb\my portable files\new6.php(2): SoapClient->SoapClient('http://www.webs...') #1 {main} thrown in C:\Program Files\EasyPHP-DevServer-14.1VC9\data\localweb\my portable files\new6.php on line 2
a linha 2 é:
$client = new SoapClient('http://www.webservicex.net/ConvertTemperature.asmx?WSDL');
O servidor acessa essa url: http://www.webservicex.net/ConvertTemperature.asmx?WSDL ?
Como eu trato o retorno, no meu caso:
stdClass Object ( [ListarResult] => stdClass Object ( [Acao] => Listar Fabricante [Data] => 2015-01-14T09:50:57.0604076-02:00 [Codigo] => 1 [Descricao] => Fabricante Listado com Sucesso [Lista] => stdClass Object ( [clsFabricante] => stdClass Object ( [LojaCodigo] => 0 [CodigoInterno] => 1 [FabricanteStatus] => Ativo [Nome] => Garmin ) ) ) )
Dê uma olhada nesse link:
amigo porque nao retorna nenhum valor????
array(
'emp_id' => 1
));
$options = array('location' => 'http://177.70.24.181/ECommerceWebService.asmx/getProduto');
$result = $client->__soapCall($function, $arguments, $options);
echo 'Response: ';
print_r($result);
?>
Tlvz porque o sistema não esteja retornando nada
Me ajudou bastante cara! Estava com um problema em passar alguns parâmetros aqui e com seu post conseguir resolver!
Sucesso!
Olá, parabéns pelo post amigo. Só não entendi o trecho que foi colocado ali na variável options. Para que serve e se por um acaso eu não fornecer este valor?
o location do option é o operation do serviço
Funcionou Perfeitamente! Muito Obrigado xará!
Thiago bom dia:
Gostaria de obter a sua ajuda profissional para desenvolvimento de um módulo de transmissão de dados para um webservice.
Por favor, entre em contato comigo: nogueira_jr@ig.com.br
Ou Tel (19) 99202-1873
Thiago, como fazer para conferir a mensagem(request) XML que foi montada? Obrigado.
Você pode imprimir o $arguments: print_r($arguments);
Outra possibilidade é criar um mock com o soap ui e chamar ele, assim vc vê o request pelo soapui
Boa noite!
Vc tem algum exemplo para acessar o webservice da NFe? Estou tentando, sem sucesso com:
SOAP_1_2,
'trace' => true,
'encoding' => 'UTF-8',
'verifypeer' => false,
'verifyhost' => true,
'style' => SOAP_DOCUMENT,
'use' => SOAP_LITERAL,
'local_cert' => $cert,
'compression' => 0,
'exceptions' => true,
'connection_timeout' => 180,
'cache_wsdl' => WSDL_CACHE_NONE,
'passphrase' => $senha
);
$client = new SoapClient($wsdl, $opcoes);
$err = $client->getError();
if ($err) {
echo 'Erro SOAP: ' . $err;
} else {
echo 'Ok....';
}
$result = $client->__soapCall($metodo);
/*
RETORNOU: Exception Error!SOAP-ERROR: Parsing WSDL: Couldn't load from
'https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx?WSDL' :
failed to load external entity "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx?WSDL"
*/
?>
Valeu Cara!
[…] Consegui resolver o problema seguindo o tutorial Chamando um WebService SOAP com PHP […]