rafaelpatro / Quack_TntBrasil

Módulo de frete via TNT Mercúrio, para Magento
GNU General Public License v3.0
6 stars 6 forks source link

Soap request retornando java.lang.NullPointerException #8

Open wdarking opened 5 years ago

wdarking commented 5 years ago

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 commented 5 years ago

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>suaconta@seuemail.com</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>suaconta@seuemail.com</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 commented 5 years ago

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

wdarking commented 5 years ago

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 commented 5 years ago

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

wdarking commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

Beleza @rafaelpatro no aguardo entao!!

rafaelpatro commented 5 years ago

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 commented 5 years ago

@rafaelpatro vc vai atualizar o repositorio também?

wdarking commented 5 years ago

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 commented 5 years ago

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

yurirn commented 5 years ago

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

wdarking commented 5 years ago

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 commented 5 years ago

@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 commented 5 years ago

@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 commented 5 years ago

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 commented 5 years ago

é 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 commented 5 years ago

@wdarking sera que preciso reinstalar o modulo?

wdarking commented 5 years ago

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 commented 5 years ago

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

rafaelpatro commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

@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 commented 5 years ago

@rafaelpatro PHP Version 5.6.40

wdarking commented 5 years ago

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 commented 5 years ago

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

Vlw @wdarking

yurirn commented 5 years ago

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