Olá Pessoal,
Eu fiz uma alteração rápida para funcionar no módulo do Pedro, montando o XML igual ao retornado pelo SOAP dos Correios usando as novas APIs.
Temos que adicionar algumas linhas no método _getCorreiosReturn do fonte:
PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php
deixando ele assim:
protected function _getCorreiosReturn()
{
include_once “correiosapi.php”;
$idCorreios = “Id_de_entrada_no_portal”;
$codAcesso = “cod_acesso_gerado_no_portal”;
$cartao = “numero_cartao_postagem”;
$access_code = base64_encode($idCorreios . “:” . $codAcesso);
$tokenA = getToken($access_code, $cartao);
if (false === $tokenA) {
Mage::log(“correiosapi: Erro: nao conseguiu pegar token!”);
return false;
}
$token = $tokenA[1];
$expiraEm = $tokenA[0];
// vamos ver quantos servicos temos para buscar
$metods = explode(“,”, $this->_postMethods);
//Mage::log(“metods=” . $this->_postMethods);
$xml_total=”<Servicos>”;
foreach($metods as $metod) {
$ret_xml = correiosapi($token, $metod, $this->_fromZip, $this->_toZip, $this->_packageWeight * 1000, 1, $this->_midSize, $this->_midSize, $this->_midSize, “”, 0);
$xml_total .= $ret_xml;
}
$xml_total .= “</Servicos>”;
$xml = new SimpleXMLElement($xml_total);
//Mage::log(“xml=” . print_r($xml,true));
//Mage::log(“xml_total=” . print_r($xml_total,true));
return $xml->cServico;
//aqui seria a continuacao do metodo, mas nao vai passar, tem um return antes
$filename = $this->getConfigData(‘url_ws_correios’);
try {
$client = new Zend_Http_Client($filename);
$client->setConfig(
array(
‘timeout’ => $this->getConfigData(‘ws_timeout’),
…
…
Tem que fazer download do correiosapi.php e deixar na mesma pasta.
Ele pode ser melhorado, buscando dados que foram digitados acima lá do admin do Pedro, mas não deu tempo para isto!
Está funcionando em 5 lojas de Magento 1.9.X com as versões 4.9.0 e 4.5.0.
Rotina, pegar aqui: wget http://lx13.letti.com.br/correiosapi.php.zip
Ou Aqui
Espero ter ajudado!
A.Letti
Esse link: http://lx13.letti.com.br/correiosapi.php.zip não está funcionando, por favor você pode postar a versão correta?
Olá Flávio, você não consegue fazer o download? O que você quer dizer com versão correta?
Não consegui baixar também, aparece um monte de caracteres estranhos na tela e não aparece nada para baixar
Então, estando em ssh no servidor, você faz um wget da url que ele baixa direto no server e depois você abre o zip!
Sou um tanto amador, estou tentando ajudar um amigo que esta tendo problema, existe alguma forma de baixar o php e subir o arquivo no servidor por ftp?
Consegui baixar aqui com um wget portable hehehe
Vou fazer a mudanças aqui e testar, logo retorno para dizer se funcionou
Desculpa estar atormentando com isso.
Seria possível disponibilizar o arquivo CorreiosMethod.php com as modificações?
(provavelmente por falta de conhecimento) não estou conseguindo, inclui o codigo acima onde indicou e retorna a seguinte mensagem quando tento calcular o frete
“Parse error: syntax error, unexpected ‘portal”’ (T_STRING) in /home/protecaodacabeca/www/app/code/community/PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php on line 311”
Você tem que colocar os 3 dados do seu contrato nestas variáveis!
$idCorreios = “Id_de_entrada_no_portal”;
$codAcesso = “cod_acesso_gerado_no_portal”;
$cartao = “numero_cartao_postagem”;
Verifique se a palavra portal ficou sobrando, tem que ter aspas e ; no final de cada linha!
Certo, coloquei os 3 dados nas variaveis, conferi o ; e se tinha palavra portal sobrando
O que esta aparecendo agora é o seguinte:
Parse error: syntax error, unexpected ‘:’, expecting ‘)’ in /home/protecaodacabeca/www/app/code/community/PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php on line 315
Vou colocar o código completo abaixo ocultando os 3 dados com ***
protected function _getCorreiosReturn()
{
include_once “correiosapi.php”;
$idCorreios = “*********”;
$codAcesso = “*********”;
$cartao = “*********”;
$access_code = base64_encode($idCorreios . “:” . $codAcesso);
$tokenA = getToken($access_code, $cartao);
if (false === $tokenA) {
Mage::log(“correiosapi: Erro: nao conseguiu pegar token!”);
return false;
}
$token = $tokenA[1];
$expiraEm = $tokenA[0];
// vamos ver quantos servicos temos para buscar
$metods = explode(“,”, $this->_postMethods);
//Mage::log(“metods=” . $this->_postMethods);
$xml_total=””;
foreach($metods as $metod) {
$ret_xml = correiosapi($token, $metod, $this->_fromZip, $this->_toZip, $this->_packageWeight * 1000, 1, $this->_midSize, $this->_midSize, $this->_midSize, “”, 0);
$xml_total .= $ret_xml;
}
$xml_total .= “”;
$xml = new SimpleXMLElement($xml_total);
//Mage::log(“xml=” . print_r($xml,true));
//Mage::log(“xml_total=” . print_r($xml_total,true));
return $xml->cServico;
//aqui seria a continuacao do metodo, mas nao vai passar, tem um return antes
$filename = $this->getConfigData(‘url_ws_correios’);
try {
$client = new Zend_Http_Client($filename);
$client->setConfig(
array(
‘timeout’ => $this->getConfigData(‘ws_timeout’),
$filename = $this->getConfigData(‘url_ws_correios’);
try {
$client = new Zend_Http_Client($filename);
$client->setConfig(
array(
‘timeout’ => $this->getConfigData(‘ws_timeout’),
‘adapter’ => Mage::getModel(‘pedroteixeira_correios/http_client_adapter_socket’)
)
);
$client->setParameterGet(‘StrRetorno’, ‘xml’);
$client->setParameterGet(‘nCdServico’, $this->_postMethods);
$client->setParameterGet(‘nVlPeso’, $this->_packageWeight);
$client->setParameterGet(‘sCepOrigem’, $this->_fromZip);
$client->setParameterGet(‘sCepDestino’, $this->_toZip);
$client->setParameterGet(‘nCdFormato’, 1);
$client->setParameterGet(‘nVlComprimento’, $this->_midSize);
$client->setParameterGet(‘nVlAltura’, $this->_midSize);
$client->setParameterGet(‘nVlLargura’, $this->_midSize);
if ($this->getConfigData(‘mao_propria’)) {
$client->setParameterGet(‘sCdMaoPropria’, ‘S’);
} else {
$client->setParameterGet(‘sCdMaoPropria’, ‘N’);
}
if ($this->getConfigData(‘aviso_recebimento’)) {
$client->setParameterGet(‘sCdAvisoRecebimento’, ‘S’);
} else {
$client->setParameterGet(‘sCdAvisoRecebimento’, ‘N’);
}
if ($this->getConfigData(‘valor_declarado’)
|| in_array($this->getConfigData(‘acobrar_code’), $this->_postMethodsExplode)
) {
$client->setParameterGet(‘nVlValorDeclarado’, number_format($this->_packageValue, 2, ‘,’, ”));
} else {
$client->setParameterGet(‘nVlValorDeclarado’, 0);
}
$nCdEmpresa = $this->getConfigData(‘cod_admin’);
$sDsSenha = $this->getConfigData(‘senha_admin’);
if (!empty($nCdEmpresa) && !empty($sDsSenha)) {
$client->setParameterGet(‘nCdEmpresa’, $nCdEmpresa);
$client->setParameterGet(‘sDsSenha’, $sDsSenha);
}
$content = $client->request()->getBody();
if ($content == ”) {
throw new Exception(‘No XML returned [‘ . __LINE__ . ‘]’);
}
libxml_use_internal_errors(true);
$sxe = simplexml_load_string($content);
if (!$sxe) {
throw new Exception(‘Bad XML [‘ . __LINE__ . ‘]’);
}
$xml = new SimpleXMLElement($content);
if (count($xml->cServico) cServico;
} catch (Exception $e) {
$this->_throwError(‘urlerror’, ‘URL Error – ‘ . $e->getMessage(), __LINE__);
return false;
}
}
era para parar na linha de comentário abaixo!
//aqui seria a continuacao do metodo, mas nao vai passar, tem um return antes
Nem esta linha precisava levar, você copiou um trecho a mais que está descrito abaixo
try {
$client = new Zend_Http_Client($filename);
$client->setConfig(
array(
‘timeout’ => $this->getConfigData(‘ws_timeout’),
se tirar estas linhas que foram a mais deve sumir o erro de sintaxe!
Sigo na luta aqui hehehehe (estou honestamente sem graça de ficar enchendo o saco aqui, mas estou realmente na tentativa e erro por conta do meu pouco conhecimento com php)
Agora o erro que aparece é esse
“Parse error: syntax error, unexpected ‘:’, expecting ‘)’ in /home/protecaodacabeca/www/app/code/community/PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php on line 303”
Como ficou o código tirando tudo abaixo da linha que disse:
protected function _getCorreiosReturn()
{
include_once “correiosapi.php”;
$idCorreios = “**********”;
$codAcesso = “**********”;
$cartao = “**********”;
$access_code = base64_encode($idCorreios . “:” . $codAcesso);
$tokenA = getToken($access_code, $cartao);
if (false === $tokenA) {
Mage::log(“correiosapi: Erro: nao conseguiu pegar token!”);
return false;
}
$token = $tokenA[1];
$expiraEm = $tokenA[0];
// vamos ver quantos servicos temos para buscar
$metods = explode(“,”, $this->_postMethods);
//Mage::log(“metods=” . $this->_postMethods);
$xml_total=””;
foreach($metods as $metod) {
$ret_xml = correiosapi($token, $metod, $this->_fromZip, $this->_toZip, $this->_packageWeight * 1000, 1, $this->_midSize, $this->_midSize, $this->_midSize, “”, 0);
$xml_total .= $ret_xml;
}
$xml_total .= “”;
$xml = new SimpleXMLElement($xml_total);
//Mage::log(“xml=” . print_r($xml,true));
//Mage::log(“xml_total=” . print_r($xml_total,true));
return $xml->cServico;
}
O correto é colocar todo o fonte, pois pode ter erro após as linhas inseridas, por conta de você ter insrrido mais coisas! Mas o último } acima acho que está errado!
coloca o código todo pra nos?
Vitor, você conseguiu solucionar?
Até agora não, comecei a refazer o site em woocommerce pq ta sendo mais rapido do que corrigir os recorrentes problemas que temos com o magenta. Pedro Teixeira bem que podia soltar atualização hehehe
Gente, não é difícil. Segue os passos:
1 – baixar o arquivo correiosapi.php e colocar no diretório: app/code/community/PedroTeixeira/Correios/Model/Carrier/
SÓ VAI FUNCIONAR SE ESSE AQUIVO ESTIVER AQUI.
2 – Tem que abrir o portal https://cws.correios.com.br e/ou falar com o gerente dos correios. Você precisa ter um usuário e uma senha da API. O teu gerente consegue rapidinho isso se tu não tiver.
Você mesmo consegue gerar isso dentro desse painel, no menu “gestão de acesso a API’s”
3 – DEPOIS que vc tem esses dados + cartão de postagem vai pro passo 4
4 – abre o arquivo app/code/community/PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php apaga tudo e insere o código que deixei pronto no pastebin https://pastebin.com/vZta6sbP
5 -TROCA AS CREDENCIAIS ali pela linha 276 e salva.
6 – Se vc fez tudo certo já vai funcionar.
Obrigado A.Letti por disponibilizar o código!
Se alguém precisar de ajuda profissioanl me chama no linkedin https://br.linkedin.com/in/davilevecke
gostaria de uma solucao profissional, inclusicve tenho outras demandas, pode entrar em contato comigo? instagram @vipracing
fala danilo, segui o seu passo a passo mas continua nao funcionando, envia uma mensagem para voce no linkedin, se puder da uma olhada para verificar se tem algo errado no que eu fiz
Para mim funcionou parcialmente agora está apontando problema nas dimensões:
” Correios
Dimensões dos produtos fora do permitido pelos Correios.”
E está tudo OK com as dimensões, esse é um dos produtos mais vendidos antes dessa troca de api, aconteceu com mais alguém?
Vim aqui agradecer a postagem, pois me salvou. Funcionou direitinho.
Como agradecimento, fiz algumas mudanças na solução, principalmente incluindo um documento útil, dos correios e reutilizando campos para incluir os dados de acesso no Painel de Controle do Magento ao invés de inseridos manualmente no código fonte.
A solução está no meu Git: https://gitlab.com/d.position1/pedroteixeira-correios-fix-api-token
Olá Danilo,
Fico contente, vou olhar o que a sua contribuição está fazendo!
Obrigado,
Abraços!
Oi Danilo, tudo bem? Então não funcionou. Alguém conseguiu fazer funcionar este código!
Olá Sergio, Boa tarde! Sim, eu consegui em 6 lojas e pelo que sei o Danilo também! Veja se está tudo certo com as credenciais dos Correios, esta é a primeira coisa! O Danilo fez um tutorial com mais detalhes para quem não tem muita prática com php.
Abç,
Olá, passando para agradecer pelo conteúdo. Me ajudou muito.
Abraço!