Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite!
Preciso fazer a parte de NFS-e na minha empresa e para isso eles disponibilizam webservice, porém é um webservice um pouco avançado, pois tem assinatura digital e tals, levando em conta que eu nem entendi direito o conceito de webservice, então ta complicado.
Eles disponibilizam um arquivo WSDL para as chamadas das funcoes usando o SOAP do php, ai vai se alguem quiser ver.
https://e-gov.betha.com.br/e-nota-contribuinte-test-ws/recepcionarLoteRps?wsdl
A questão é:
Como eu faço os chamados às funções usando SOAP? Vou ter de gerar um XML ou essa extenção SOAP gera automatico se tiver o WSDL, to perdido!
Se tiverem um tutorial bacana de webservice ou coisa assim agradeço.
Bah, ninguém!
http://forum.imasters.com.br/topic/489353-consumindo-webservice/#entry1945024
$client = new SoapClient('endereco/do/wsdl'); [/client]
[inline]$client[/inline] passa a ser uma instância do objeto definido pela especificação do WSDL.
Obrigado aeh galera, vou dar uma olhada nesses links. E se alguém mais puder compartilhar conhecimento agradeço.
Da uma olhada ae :P
Então, consegui entender essa parte, e até já consumi alguns web-services como exemplo usando um objeto da classe SoapClient do PHP. Onde passando os parâmetros certo a própria classe gera o arquivo XML, e isso é bom! Porém isso me causou outro problema, preciso assinar digitalmente esse arquivo XML, e eu não tenho acesso ao arquivo, pois pelo que entendi, a classe gera o XML apenas na hora da chamada da função. Eu sei que tem a função __getLastRequest() que me traz o XML do último request, porém eu preciso assinar antes de enviar. Tem alguma forma de assinar o XML usando o objeto SoapClient? Obrigado pela atenção.
Olá Evandro, obrigado pela ajuda, mas creio que não vou usar headers para fazer isso, considerando que o servidor não tem autenticação nenhuma, eles verificam o cliente que esta chamando pela assinatura digital, que está dentro da tag SOAP Body, tenho de assinar digitalmente em duas Tags do XML, se alguém conseguir me dar ajudar agradeço.
@Luiz Paulo Franz, utilize o método __getTypes, para obter a definição dos tipos utilizados pelo webservice. De posse disso, você pode ou utilizar a classe StdClass, ou implementar cada tipo para o envio
Obrigado a todos, mas esse caso expecífico de NFS-e da betha sistemas não teve geito, tive de gerar o XML na mão mesmo, fazer as assinatura e então utilizar o cUrl para enviar o arquivo XMl para o webservice dessa forma:
$soap_msg='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" soapenv:encodingStyle="http://www.w3.org/2001/12/soap-encoding"><soapenv:Body>'.$stringXML.'</soapenv:Body></soapenv:Envelope>';
$soap_msg = str_replace('<?xml version="1.0" encoding="UTF-8"?>','<?xml version="1.0" encoding="UTF-8" standalone="no"?>',$soap_msg);
$soap_msg = str_replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>','',$soap_msg);
$soap_msg = str_replace('<?xml version="1.0" encoding="UTF-8"?>','',$soap_msg);
$soap_msg = str_replace("\n","",$soap_msg);
$soap_msg = str_replace(" "," ",$soap_msg);
$soap_msg = str_replace(" "," ",$soap_msg);
$soap_msg = str_replace(" "," ",$soap_msg);
$soap_msg = str_replace(" "," ",$soap_msg);
$soap_msg = str_replace(" "," ",$soap_msg);
$soap_msg = str_replace("> <","><",$soap_msg);
//salvar arquivo enviado
//$arquivo = fopen('habiteto_smo.xml', 'w');
//fwrite($arquivo, $soap_msg);
//fclose($arquivo);
$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL, $urlWebService);
//tempo em segundos de aguardo na tentativa de conectar-se com o servidor
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 40);
//tempo em que o webservice aguradara a execucao no servidor
curl_setopt($soap_do, CURLOPT_TIMEOUT, 86400);//24 horas
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
//verificacao de certificados da camada SSL (https)
//primeira opcao para analizar certificado de quem chama o servico (o proprio sistema), deixar false
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
//verificar o certificado do servidor da url requisitada
//1: confere se a url requisitada consta nas autoridades certificadoras
//2: verifica se a url da autoridade certificadora corresponde a url chamada
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, 2);
//enviar a msg soap via post
curl_setopt($soap_do, CURLOPT_POST, true );
curl_setopt($soap_do, CURLOPT_POSTFIELDS, $soap_msg);
//para mensagens SOAP, isso eh obrigatorio
curl_setopt($soap_do, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($soap_msg)));
$response=curl_exec($soap_do);
//retornamos o xml do response do webservice, aqui nao tratamos erros
return $response;
Cara,
Eu também estou apanhando bastante para conseguir testar "local" PHP / WSDL. Não achei um tutorial que explique BEM.
Mas esse post, me ajudou a entender o inicio:
http://www.vankouteren.eu/blog/2009/03/simple-php-soap-example/
veja se te ajuda.
Abs!