Nova APIs dos Correios e Pedro Teixeira

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

One Step Checkout Brasil 6.0 erra no total na tela de fechamento

24 comentários sobre “Nova APIs dos Correios e Pedro Teixeira

  1. 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!

    • 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

  2. 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

  3. 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?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *