Ir para conteúdo

Arquivado

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

milisystem

WebService Transportadora

Recommended Posts

Boa noite pessoal,

 

estou tentando fazer a comunicação com um webservice de uma transportadora, utilizando SOAP, mas não está dando certo...

Gostaria da ajuda de vocês, pq não consigo enxergar onde está o erro =/

 

Arquivo php:

<?php
$client  = new SoapClient('http://xxxxx?wsdl');
$options = array('location' => 'xxxxx/CalculoFrete');

$function = 'calculaFrete'; 
$arguments= array('calculaFrete' => 
    array( 
    
       'cdDivisaoCliente'=>1,
       'cepDestino' =>'xxxx',
       'cepOrigem'=>'xxxx',
       'login'=>'xx@xx.com',
       'nrIdentifClienteDest'=>'xxx',
       'nrIdentifClienteRem'=>'xxx',
       'nrInscricaoEstadualDestinatario'=>'',
       'nrInscricaoEstadualRemetente'=>'xxxx',
       'psReal'=>'30',
       'senha'=>'',
       'tpFrete'=>'F',
       'tpPessoaDestinatario'=>'F',
       'tpPessoaRemetente'=>'J',
       'tpServico'=>'RNC',
       'tpSituacaoTributariaDestinatario'=>'',
       'tpSituacaoTributariaRemetente'=>'ME',
       'vlMercadoria' =>'60000'
     
));
 
	print_r($arguments); 
 	echo '<pre>'; 	
try{
    $result = $client->__soapCall($function, $arguments, $options);
    echo 'Response: ';
    print_r($result);
} catch (Exception $ex) {
    print_r($ex);
    $client->__getLastRequest();
}
?>

e uma parte do wsdl com a estrutura

<xsd:complexType name="CotacaoWebService">
<xsd:sequence>
<xsd:element minOccurs="0" name="cdDivisaoCliente" nillable="true" type="xsd:long"/>
<xsd:element minOccurs="0" name="cepDestino" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="cepOrigem" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="login" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="nrIdentifClienteDest" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="nrIdentifClienteRem" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="nrInscricaoEstadualDestinatario" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="nrInscricaoEstadualRemetente" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="psReal" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="senha" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="tpFrete" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="tpPessoaDestinatario" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="tpPessoaRemetente" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="tpServico" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="tpSituacaoTributariaDestinatario" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="tpSituacaoTributariaRemetente" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="vlMercadoria" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xxx.com">
<xsd:element name="calculaFrete">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="ns1:CotacaoWebService"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

e a mensagem que é retornada na linha em que é feita a chamada: [message:protected] => Fault: java.lang.NullPointerException

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Comente o trecho do try catch por um instante e faça o seguinte:

$result = $client->__soapCall($function, $arguments, $options);
echo '<pre>Requisição';
echo htmlspecialchars($client->request);
echo '<br/><br/>';
echo '<pre>Resposta';
echo htmlspecialchars($client->response);

E mande o resultado do XML pra gente por favor.
de ambos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Resultado foi esse:



Fatal error:  Uncaught SoapFault exception: [soap:Client] Fault: java.lang.NullPointerException in D:\xxxxxx\index.php:30
Stack trace:
#0 D:\xxxxxx\index.php(30): SoapClient->__soapCall('calculaFrete', Array, Array)
#1 {main}
  thrown in D:\xxxxxx\index.php on line 30

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro esta do lado do server então.

 

tem algum exemplo online funcionando desse serviço?

 

eles tem algum canal de suporte.

 

E claro, sempre teste no soapUI.

 

essa ferramenta já passa uma confiança enorme, se não rodar la é certeza que o erro esta no server.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei com a ferramente, obtive o mesmo erro.

 

O suporte é péssimo, único material que fornecem é um pdf com o nome dos campos, nenhum exemplo, nem nada

mais.

 

Ao questionar, responderam que o serviço está funcionando em outros clientes... somente isso =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este trecho do WSDL que você passou define um tipo complexo, como se fosse uma classe.

 

Verifique o WSDL na parte de operações (operation). Lá terá a assinatura da operação e quais são as partes (argumentos) utilizadas em sua chamada.

 

Vou te dar um exemplo de um dos WebServices que desenvolvemos para integração com nossas ferramentas aqui na empresa.

 

Esta é uma operação (um método a ser executado)

 

 

<wsdl:operation name="ConsultarCarga">
<wsdl:documentation>Consulta informacoes da carga.</wsdl:documentation>
<wsdl:input message="tns:ConsultarCargaRequest"/>
<wsdl:output message="tns:ConsultarCargaResponse"/>
</wsdl:operation> 

 

 

 

Veja que tem as tags input e output.

O que nos interessa é a input.

Ela se refere a um outro elemento, ConsultarCargaRequest.

 

Este elemento está definido assim:

 

 

<wsdl:message name="ConsultarCargaRequest">
<wsdl:part name="credencial" type="tns:Credencial"/>
<wsdl:part name="idCarga" type="xsd:string"/>
</wsdl:message> 

 

 

 

Este elemento está dividido em duas partes: Credencial e idCarga.

 

Credencial, está no namespace TNS, o que neste exemplo, define um tipo complexo (Classe).

idCarga, está no namespace xsd, o que neste exemplo, define o namespace próprio do WSDL e indica que é uma string.

 

Cada parte complexa, possui suas propriedades, como em uma classe.

Vejamos o tipo Credencial:

 

 

 

<xsd:complexType name="Credencial">
<xsd:all>
<xsd:element name="usuario" type="xsd:string" minOccurs="0" maxOccurs="1"/>
<xsd:element name="senha" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>

 

 

 

Agora ficou mais fácil:

 

Sabemos que para o método ConsultarCarga, é necessário passar dois parametros. Um do tipo Credencial e outro do tipo string (nesta mesma ordem).

 

O SoapClient do PHP funciona como um proxy. Ou seja, podemos chamar a função diretamente nele que ele ficará responsável por chamar o método mágico __call.

 

Vejamos uma implementação simples deste exemplo passado (não coloquei comentários no código porque está muito simples a leitura):


$wsdlURL = 'http://dominio.com/service?wsdl';

$client = new SoapClient($wsdlURL, array(
	'exceptions' => true,
	'cache_wsdl' => WSDL_CACHE_NONE,
	'trace' => true
));

$credencial = array(
	'usuario' => 'usuario',
	'senha' => 'senha'
);

echo '<pre>';

try {
	$result = $client->ConsultarCarga($credencial, '0000014');
	print_r($result);

} catch(Exception $ex) {
	echo $ex->getMessage();
}

E seu retorno é semelhante a:

stdClass Object
(
    [codigo] => 349
    [status] => stdClass Object
        (
            [codigo] => 1
            [descr] => A PROGRAMAR
            [dataHora] => 2014-05-12T17:49:53-03:00
        )

    [carregamento] => stdClass Object
        (
            [inicio] => 
            [fim] => 
        )

    [descarregamento] => stdClass Object
        (
            [inicio] => 
            [fim] => 
        )

    [situacao] => stdClass Object
        (
            [dataHora] => 
        )

)

Veja se com estes exemplos fica mais fácil o entendimento.

 

@braços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda me parece erro do servidor mas vamos fazer alguns testes.

 

Qual o type do WSDL?

 

Document ou RPC?

 

a mesma pergunta vale para as funções Document ou RPC?

 

Segundo, você tem certeza que é necessário a chave do array calculaFrete?

 

não é só passar um array comum?

 

e se for seguir de acordo com o XML do layout o nome da chave teria que ser CotacaoWebService.

 

Qualquer dúvida estou a disposição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, já tinha tentado de várias formas, nenhuma deu certo =/

mas agora me responderam que o problema pode estar no server mesmo e vão solucionar.

 

Obrigada à todos!

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.