Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Soap request retornando java.lang.NullPointerException #8

Open
wdarking opened this issue Oct 16, 2019 · 28 comments · May be fixed by #9
Open

Soap request retornando java.lang.NullPointerException #8

wdarking opened this issue Oct 16, 2019 · 28 comments · May be fixed by #9

Comments

@wdarking
Copy link

Bom dia @rafaelpatro , o módulo estava funcionando, mas ultimamente percebi que ele não estava aparecendo mais nas opções de frete, fui no log e verifiquei este erro de java ai, java.lang.NullPointerException. Está ocorrendo na classe Quack_TntBrasil_Model_Rate, no método sendRequest.

Acredito ser algo relacionado ao xml sendo enviado via soap ou algum atributo meu que esteja faltando. Tentei um request via postman com um xml de exemplo aqui e deu certo, queria ver exatamente como este xml está sendo enviado pro webservice.

Estou tentando debugar aqui, mas não estou conseguindo retornar o xml aqui.
Estou fazendo assim:

$ws = new TntMercurio_CalculoFrete(array('connection_timeout' => $configTimeout, 'trace' => true), $url);
$response = $ws->calculaFrete(new TntMercurio_CalculaFrete($this->getRequest()));
Mage::log($ws->__getLastRequest());

Aprecio se tiver alguma dica ou sugestão. Vou continuar tentando.

@wdarking
Copy link
Author

Esse é o xml sendo gerado pelo soap no módulo:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://service.calculoFrete.mercurio.com">
    <SOAP-ENV:Body>
        <ns1:calculaFrete>
            <ns1:in0>
                <login>[email protected]</login>
                <nrIdentifClienteRem>99999999999999</nrIdentifClienteRem>
                <nrIdentifClienteDest>00000000000</nrIdentifClienteDest>
                <tpFrete>C</tpFrete>
                <tpServico>ANC</tpServico>
                <cepOrigem>90830000</cepOrigem>
                <cepDestino>90830000</cepDestino>
                <vlMercadoria>50.00</vlMercadoria>
                <psReal>1.00</psReal>
                <nrInscricaoEstadualRemetente>0000000000</nrInscricaoEstadualRemetente>
                <tpSituacaoTributariaRemetente>CO</tpSituacaoTributariaRemetente>
                <tpSituacaoTributariaDestinatario>NC</tpSituacaoTributariaDestinatario>
                <cdDivisaoCliente>1</cdDivisaoCliente>
                <tpPessoaRemetente>J</tpPessoaRemetente>
                <tpPessoaDestinatario>F</tpPessoaDestinatario>
            </ns1:in0>
        </ns1:calculaFrete>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

que retorna o seguinte response:

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns0:Fault xmlns:ns1="http://www.w3.org/2003/05/soap-envelope" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">
            <faultcode>ns0:Server</faultcode>
            <faultstring>java.lang.NullPointerException</faultstring>
        </ns0:Fault>
    </S:Body>
</S:Envelope>

A estrutura do xml que a TI da TNT me passou possui este formato:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.calculoFrete.mercurio.com" xmlns:mod="http://model.vendas.lms.mercurio.com">
    <soapenv:Header />
    <soapenv:Body>
        <ser:calculaFrete>
            <ser:in0>
                <mod:cdDivisaoCliente>1</mod:cdDivisaoCliente>
                <mod:cepDestino>86702784</mod:cepDestino>
                <mod:cepOrigem>90830000</mod:cepOrigem>
                <mod:login>[email protected]</mod:login>
                <mod:nrIdentifClienteDest>12345678909</mod:nrIdentifClienteDest>
                <mod:nrIdentifClienteRem>99999999999999</mod:nrIdentifClienteRem>
                <mod:nrInscricaoEstadualDestinatario></mod:nrInscricaoEstadualDestinatario>
                <mod:nrInscricaoEstadualRemetente>0000000000</mod:nrInscricaoEstadualRemetente>
                <mod:psReal>4.8</mod:psReal>
                <mod:tpFrete>C</mod:tpFrete>
                <mod:tpPessoaDestinatario>F</mod:tpPessoaDestinatario>
                <mod:tpPessoaRemetente>J</mod:tpPessoaRemetente>
                <mod:tpServico>RNC</mod:tpServico>
                <mod:tpSituacaoTributariaDestinatario>NC</mod:tpSituacaoTributariaDestinatario>
                <mod:tpSituacaoTributariaRemetente>CO</mod:tpSituacaoTributariaRemetente>
                <mod:vlMercadoria>201.7</mod:vlMercadoria>
            </ser:in0>
        </ser:calculaFrete>
    </soapenv:Body>
</soapenv:Envelope>

Com este xml retorna a resposta esperada. A diferença que algumas tags do xml tem algum tipo de prefixo diferente. Vou estudar como aplicar isso lá no módulo.

@yurirn
Copy link

yurirn commented Oct 18, 2019

Boa tarde @wdarking você conseguiu alterar? estou com o mesmo problema

@wdarking
Copy link
Author

Consegui parcialmente, mas ainda não consegui uma solução decente pra fazer um pull request aqui.

Eu entrei em contato com a TI da TNT e eles realmente modificaram algumas coisas. Segue trecho do email:

Boa tarde, Gilmar.

Estou enviando abaixo trechos de e-mail que tratei com os clientes sobre o problema na ferramenta de web service, caso vocês ainda tenham problema.

Só para ressaltar: mais de 80% dos clientes não tiveram problema com a mudança que fizemos, pois a estrutura deles foi feita de maneira a suportar a alteração realizada pela TNT. Apenas clientes que fizeram a implementação seguindo alguma particularidade é que teve o problema, mas o nosso serviço está ativo e funcionando. Por isso a primeira sugestão é reimplementar o client seguindo o contrato estabelecido pelo novo endereço WSDL.

Algumas ferramentas do PHP já criam a estrutura e puxam o contrato de forma automática, mas já pegamos casos em que o processo feito desse jeito não funcionou, pois a estrutura foi gerada com algum erro ou falta de informação. Nessa situação o programador teve que fazer a estrutura XML na mão, para poder processar os dados corretamente.

Tente seguir um desses passos, pode ser que a solução sirva para vocês. No final existem uma parte tratando especificamente de PHP, se a linguagem de vocês for essa, crio que ajudará bastante, pois vários cliente já conseguiram ajustar seguindo os passos descritos.:

Qualquer duvida estou a disposição.

Ou seja, alguma modificação deles quebrou alguns clients, principalmente os em PHP pelo que eu entendi. No email ele da algumas informações de como outros clientes corrigiram o suas integrações.

Dentre as soluções, uma delas seria setar os atributos da classe TntMercurio_CotacaoWebService (lib/TntMercurio_CotacaoWebService.php) com o SoapVar.

Ex.

public function setCdDivisaoCliente($cdDivisaoCliente)
{
    $this->cdDivisaoCliente = $cdDivisaoCliente;
    return $this;
}

Ficaria assim:

public function setCdDivisaoCliente($cdDivisaoCliente)
{
    $this->cdDivisaoCliente = new SoapVar($cdDivisaoCliente, XSD_STRING, 'string', null, 'cdDivisaoCliente', 'http://model.vendas.lms.mercurio.com');
    return $this;
}

Eu fiz isso em todos os atributos da classe, e o reponse voltou a funcionar. Só que isso quebra outras partes do módulo, que estão esperando os atributos em um formato, mas agora recebem uma instância de SoapVar. Imagino que seja algo haver com o classmap na classe TntMercurio_CalculoFrete.

@yurirn
Copy link

yurirn commented Oct 18, 2019

@wdarking precisa de ajuda? tem um cliente que sempre usou, e esta sem vendas por conta disso kkkkkk

@wdarking
Copy link
Author

Sim, preciso de ajuda!

Aqui está a classe adaptada: https://gist.github.com/wdarking/ddd1da93bcfe1760ae09d2e3efd4649c

Mas isso não resolve, pq quebra outras partes do módulo. Mas se vc colocar essa classe lá, já vai perceber que o response em Quack_TntBrasil_Model_Rate::sendRequest já retorna os dados com sucesso.

Se vc quiser ir testando, coloca um Mage::log no método sendRequest em Quack_TntBrasil_Model_Rate::sendRequest por aqui mais ou menos:

try {
    $ws = new TntMercurio_CalculoFrete(array('connection_timeout' => $configTimeout), $url);
    $response = $ws->calculaFrete(new TntMercurio_CalculaFrete($this->getRequest()));
    Mage::log($response);

Fui debugando e percebi que ele quebra em $out->getErrorList(); principalmente, entre outros, apesar da resposta retornar os dados corretos. A partir dai eu deduzi que o problema na no classmap do soap.

Eu nunca usei soap antes, então minha abordagem do problema é mais lenta, preciso ficar procurando referências de como implementar soap com php.

@rafaelpatro , quando vc puder da um help pra gente tbm!

@yurirn
Copy link

yurirn commented Oct 18, 2019

Eu entrei em contato com o cara, ele me passou toda documentação deles, e o que os cliente fizeram para fazer voltar a funcionar, mas nenhum era magento, vou pegar o que vc ja fez, e vou testar aqui também! @wdarking

@rafaelpatro
Copy link
Owner

Boa tarde pessoal
Desculpe a demora. Faz um tempo que não abro esse repositório.
Tenho a correção aqui. Já vou encaminhar pra vcs.

@yurirn
Copy link

yurirn commented Oct 18, 2019

Beleza @rafaelpatro no aguardo entao!!

@rafaelpatro
Copy link
Owner

Segue patch com a correção (só baixar e executar).

Fico aguardando o feedback de alguém, para mesclar ao projeto.

Exemplo de instalação:

cd <diretório raiz magento>
wget https://patch-diff.githubusercontent.com/raw/rafaelpatro/Quack_TntBrasil/pull/9.diff
git apply 9.diff --check

Se aparecer algum erro, postar aqui.
Se nenhum erro aparecer:

git apply 9.diff

@yurirn
Copy link

yurirn commented Oct 18, 2019

@rafaelpatro vc vai atualizar o repositorio também?

@wdarking
Copy link
Author

Aqui deu certo!
Instalei direto via branch https://github.com/rafaelpatro/Quack_TntBrasil/tree/add-params-namespace

Só sugeri uma correção la no pull request pra corrigir o nome do método, que não estava aparecendo.

@rafaelpatro , você foi avisado desta mudança? Se sim, existe um canal que avise este tipo de mudança?

@rafaelpatro
Copy link
Owner

@wdarking, tb fui pego de surpresa. Não tenho conhecimento de algum canal que forneça atualizações sobre o webservice.

@yurirn
Copy link

yurirn commented Oct 21, 2019

Bom dia @rafaelpatro @wdarking deu certo pra vocês? quando eu calculo cep, da erro 500 aqui :(

@wdarking
Copy link
Author

Aqui deu certo, já estou usando em produção.

Vc usa apache2? Reproduz o erro e dá uma verificada nas ultimas linhas do arquivo /var/log/apache2/error.log, ali vai mencionar o motivo do erro 500.

@yurirn
Copy link

yurirn commented Oct 21, 2019

@wdarking uso nginx, poderia me enviar a pasta do seu? eu baixei direto o zip e joguei na loja, ai começou dar erro 500, vou olhar no log para ver

@yurirn
Copy link

yurirn commented Oct 21, 2019

@wdarking @rafaelpatro pelo GIT tenho esses erros

error: patch failed: app/code/community/Quack/TntBrasil/Model/Abstract.php:307
error: app/code/community/Quack/TntBrasil/Model/Abstract.php: patch does not apply
error: patch failed: app/code/community/Quack/TntBrasil/Model/Carrier.php:75
error: app/code/community/Quack/TntBrasil/Model/Carrier.php: patch does not apply
error: patch failed: app/code/community/Quack/TntBrasil/Model/Rate.php:158
error: app/code/community/Quack/TntBrasil/Model/Rate.php: patch does not apply
error: patch failed: lib/TntMercurio/CalculaFrete.php:26
error: lib/TntMercurio/CalculaFrete.php: patch does not apply

@wdarking
Copy link
Author

Eu não instalei via patch diff, eu clonei o branch add-params-namespace e copiei para o magento.

Aqui ta o link do zip do branch onde a correção está aplicada: https://github.com/rafaelpatro/Quack_TntBrasil/archive/add-params-namespace.zip

@yurirn
Copy link

yurirn commented Oct 21, 2019

é eu apliquei esse branch também, mas não deu certo :/ e no log nao tem nada, nem do magento, vai ser difícil achar o problema....

@yurirn
Copy link

yurirn commented Oct 21, 2019

@wdarking sera que preciso reinstalar o modulo?

@wdarking
Copy link
Author

Seria bom ver o motivo desse erro 500 pra garantir se tem haver com o módulo ou não.

Mas sim, recomendo reinstalar o módulo. O que eu fiz: eu baixei o zip, unzipei e copiei por cima todos os arquivos, substituindo os anteriores pelos novos arquivos. Parece mais complicado que isso, mas um cp -r app/ lib/ /var/www/magento faz isso tudo.

@yurirn
Copy link

yurirn commented Oct 21, 2019

sim, fiz isso também, no log do magento nao tem nada, do servidor também não :(

@rafaelpatro
Copy link
Owner

Puts, o problema é que erro 500 não diz nada.
Se vc usa nginx, verifica o log do PHP. Normalmente é um arquivo php_errors.log na pasta raiz do Magento. Ou então em /var/log/php.

Se não encontrar nada, sugiro remover completamente o módulo. Só pra ter certeza de que não é algo externo ao módulo.

@yurirn
Copy link

yurirn commented Oct 21, 2019

achei!
2019/10/21 11:00:42 [error] 1690#0: *2268688 FastCGI sent in stderr: "PHP message: PHP Parse error: syntax error, unexpected 'NAMESPACE' (T_NAMESPACE), expecting identifier (T_STRING) in /home/sosom/www/lib/TntMercurio/CalculaFrete.php on line 29"

@rafaelpatro @wdarking

@rafaelpatro
Copy link
Owner

@yurirn, qual sua versão do PHP?

Se não me engano, até a versão 5.3, a palavra NAMESPACE é reservada. E eu usei como constante. Vou encaminhar uma correção para isso na PR. Só não consigo ver isso hoje.

Por enquanto vc pode editar o arquivo que está apresentando o erro, e alterar o nome dessa constante. Ou então atualizar seu PHP.

@yurirn
Copy link

yurirn commented Oct 21, 2019

@rafaelpatro PHP Version 5.6.40

@wdarking
Copy link
Author

Este seria o arquivo editado, conforme o @rafaelpatro falou https://gist.github.com/wdarking/55d155e61a224c4848f8bd847481db94

recomendo alterar o conteúdo do arquivo lib/TntMercurio/CalculaFrete.php pelo conteúdo do gist acima.

No meu caso eu já uso o PHP 7.2

Atualizar o PHP é um pouco mais trabalhoso, dependendo da sua versão do magento. Mas é recomendável.

@rafaelpatro
Copy link
Owner

Então me enganei. O namespace é reservado até PHP5.6, pelo menos. Mas é só aplicar o ajuste do @wdarking. Deve funcionar

Vlw @wdarking

@yurirn
Copy link

yurirn commented Oct 21, 2019

@wdarking @rafaelpatro fiz isso pessoal, deu certo aqui, obrigado pelo apoio!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants