Open wdarking opened 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.
Boa tarde @wdarking você conseguiu alterar? estou com o mesmo problema
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
.
@wdarking precisa de ajuda? tem um cliente que sempre usou, e esta sem vendas por conta disso kkkkkk
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!
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
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.
Beleza @rafaelpatro no aguardo entao!!
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
@rafaelpatro vc vai atualizar o repositorio também?
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?
@wdarking, tb fui pego de surpresa. Não tenho conhecimento de algum canal que forneça atualizações sobre o webservice.
Bom dia @rafaelpatro @wdarking deu certo pra vocês? quando eu calculo cep, da erro 500 aqui :(
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.
@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
@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
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
é 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....
@wdarking sera que preciso reinstalar o modulo?
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.
sim, fiz isso também, no log do magento nao tem nada, do servidor também não :(
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.
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
@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.
@rafaelpatro PHP Version 5.6.40
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.
Então me enganei. O namespace é reservado até PHP5.6, pelo menos. Mas é só aplicar o ajuste do @wdarking. Deve funcionar
Vlw @wdarking
@wdarking @rafaelpatro fiz isso pessoal, deu certo aqui, obrigado pelo apoio!
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 classeQuack_TntBrasil_Model_Rate
, no métodosendRequest
.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:
Aprecio se tiver alguma dica ou sugestão. Vou continuar tentando.