Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luiz Paulo Franz

WSDL (Webservice)

Recommended Posts

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

http://forum.imasters.com.br/topic/489353-consumindo-webservice/#entry1945024

 

http://php.net/soapclient

$client = new SoapClient('endereco/do/wsdl'); [/client]

[inline]$client[/inline] passa a ser uma instância do objeto definido pela especificação do WSDL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.