12
mar

Como calcular frete pelo WebService dos Correios

No módulo de frete para Magento, integrei o WebService dos Correios para realizar o cálculo de frete.


Aqui vou explicar como fazer essa integração.


O primeiro passo é ler a documentação dos Correios:


Manual de implementação de cálculo remoto de preços e prazos.


Como a documentação explica, é algo simples, iremos chamar uma URL dos Correios com as variáveis de cálculo e ele nos devolve um XML com os valores e prazos.


O primeiro passo é criar a URL:


//Valores das variáveis
$StrRetorno = "xml";
$nCdServico = 40010;
$nVlPeso = 1;
$sCepOrigem = "01318002";
$sCepDestino = "01318002";
$nCdFormato = 1;
$sCdMaoPropria = "N";
$sCdAvisoRecebimento = "N";
$nVlValorDeclarado = 0;

//Base da URL
$url = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx";

//Variáveis na URL
$url .= "?StrRetorno=" . $StrRetorno;
$url .= "&nCdServico=" . $nCdServico;
$url .= "&nVlPeso=" . $nVlPeso;
$url .= "&sCepOrigem=" . $sCepOrigem;
$url .= "&sCepDestino=" . $sCepDestino;
$url .= "&nCdFormato=" . $nCdFormato;
$url .= "&sCdMaoPropria=" . $sCdMaoPropria;
$url .= "&sCdAvisoRecebimento=" . $sCdAvisoRecebimento;
$url .= "&nVlValorDeclarado=" . $nVlValorDeclarado;


Acabamos de criar a URL com todas as variáveis definidas. Usei valores de teste, você precisará coletar esses valores da base ou de um formulário.


Para entender melhor as variáveis, consulte o manual.


Agora iremos fazer a conexão e receber o retorno:


//Carrega o retorno
if(!($retorno = file($url))){
	echo "Erro na conexão!";
	exit();
}

//Verifica se houve retorno
if(strlen($retorno) <1){
	echo "Não houve retorno!";
	exit();
}


Pronto! Temos na variável $retorno o XML de retorno dos Correios.


Vamos tirar dele os valores que queremos:


//Retira do XML os valores e prazos
preg_match_all("/(.+)<\/Codigo>/", $retorno, $xml_servico);
preg_match_all("/(.+)<\/Valor>/", $retorno, $preco_postal);
preg_match_all("/(.+)<\/PrazoEntrega>/", $retorno, $prazo_postal);
preg_match_all("/(.+)<\/Erro>/", $retorno, $err_id);
$err_id = str_replace('-', '', $err_id[1][0]);
$err_id = (int)$err_id;
preg_match_all("/(.+)<\/MsgErro>/", $retorno, $err_msg);


Agora você tem nas variáveis o valor do frete, tempo de entrega e possíveis erros:


//Código do serviço
$xml_servico[1][0];

//Valor do frete
$preco_postal[1][0];

//Tempo de entrega
$prazo_postal[1][0];

//ID do erro, se existir
$err_id;

//Mensagem de erro, se existir
$err_msg[1][0];


Lembre-se, leia a documentação para entender como funcionam as variáveis e o retorno.


Basta integrar na sua aplicação e calcular o frete!


Abraço!

28 comentários para “Como calcular frete pelo WebService dos Correios”

  1. CajuCLC disse:

    Foi so para mostrar como vc fez, correto?

    Responder

    Pedro Teixeira respondeu:

    @CajuCLC,

    Exato!

    Responder

    wagner respondeu:

    @Pedro Teixeira, @CajuCLC, to no termino de meu web site e neste exato momento deu erro,no modulo dos correios de uma olhada em meu website.poderia me informar o que eu fiz de errado

    Responder

    Pedro Teixeira respondeu:

    @wagner,

    Dê uma lida na Wiki:

    http://code.google.com/p/pedroteixeira-correios/wiki/

    Se mesmo assim não conseguir resolver, habilite o log e me passe a mensagem.

    Abraço!

    Responder

    wagner respondeu:

    @CajuCLC, to no termino de meu web site e neste exato momento deu erro,no modulo dos correios de uma olhada em meu website.poderia me informar o que eu fiz de errado
    Agradeço desde ja

    Responder

  2. walter disse:

    Pedro
    boa noite!
    estou recebendo um e-commerce magento e estou tendo algumas dificuldades, como por exemplo.-
    1-horario do relogio (rodateto) apresentacao nao coincide com horario, neste momento 9,27pm diz aproveite a sua madrugada!
    2-qdo se clica no produto exemplo 0 1 capacete qq, gostaria que as condicoes de pagtos ficasse ao lado ou junto ao capacete para que o cliente possa decidir a compra neste momento, alem do preco, sabendo em quantas parcelas podera pagar, e no meu caso so sabera isto apo fazer checkout!
    3- ainda referente ao item 2, no caso do capacete, para o cliente colocar o tamanho do capacete fica longe do produto tem que rolar a pagina para colocar o tamanho, este item tem que ficar ao lado do capacete.
    Tem outras coisas mais que informare posteriormente.
    Vc tem como resolver isto e me fornecer um orcamento?

    abs

    walter

    Responder

    Pedro Teixeira respondeu:

    @walter,

    Infelizmente nesse momento não estou pegando esse tipo de projeto, poste no fórum que com certeza diversos profissionais vão te ajudar.

    Abraço!

    Responder

  3. deadmilkman disse:

    Pedro,

    Obrigado por compartilhar estas informações. Você resumiu direitinho tudo que precisava ser contado para colocar um calculo de frete pra funcionar.

    Ajudou muito.

    Responder

    Pedro Teixeira respondeu:

    @deadmilkman,

    Valeu!

    Responder

  4. Rodrigo disse:

    Funcionou certinho, obrigado pela postagem…
    Agora é só descobrir como eu atribuo acesso de arquivo somente a url…

    Responder

    Pedro Teixeira respondeu:

    @Rodrigo,

    Desculpe, não entendi o que você quer fazer.

    Abraço!

    Responder

  5. Rodrigo disse:

    Pra funcionar preciso fazer uma alteração nas configurações do php para arquivos externos funcionarem “ativar allow_url_fopen”, mas como tenho medo em habilitar procuro ver se consigo se fazer funcionar sem mexer nesta configuração.

    Responder

    Pedro Teixeira respondeu:

    @Rodrigo,

    Você pode usar outras bibliotecas como o CURL.

    Abraço!

    Responder

    Rodrigo respondeu:

    @Pedro Teixeira, tentei usar:

    ini_set(‘allow_url_fopen’, ‘on’);

    mas tive o seguinte erro:
    Warning: preg_match_all() expects parameter 2 to be string, array given in /home/roberto/public_html/frete/frete.php on line 47;

    Grato pela dica vou pesquisar sobre o CURL…

    Responder

  6. Thiago disse:

    Ola Pedro montei o webservice mas estou com problema com a conexao com os correios da um erro de conexao.
    Você pode me ajudar.Obrigado!

    Responder

    Pedro Teixeira respondeu:

    @Thiago,

    Mudou a URL, dê uma olhada na documentação dos Correios:

    http://correios.com.br/servicos/precos_tarifas/pdf/SCPP_manual_implementacao_calculo_remoto_de_precos_e_prazos.pdf

    Abraço!

    Responder

    Jonecir respondeu:

    @Pedro Teixeira, o link http://correios.com.br/servicos/precos_tarifas/pdf/SCPP_manual_implementacao_calculo_remoto_de_precos_e_prazos.pdf

    está quebrado. Vc trabalha com o magento? Vc oferece serviços para montar um ecommerce com o magento? Qual a média de preço que vc cobra para montar uma loja virtual?

    um abraço

    Responder

  7. Guilherme disse:

    Boa tarde amigo,

    Instalei hoje o teu módulo dos correios mais da um erro. Pode me ajudar? Sou novo no magento. O meu site está acima. Obrigado!

    Responder

    Pedro Teixeira respondeu:

    @Guilherme,

    Peço que antes de tirar dúvidas no blog leia a wiki do módulo, nela você mesmo poderá resolver 99% dos problemas:

    http://code.google.com/p/pedroteixeira-correios/w/list

    Se mesmo assim não resolver, me detalhe exatamente o que está acontecendo, siga o procedimento de habilitar o log (tambpem no wiki) e me passe o resultado.

    Abraço!

    Responder

  8. Julio Cesar disse:

    Olá Pedro,

    Parabéns pelo modulo e pela ajuda a comunidade.

    Estou com um problema onde tenho um produto cadastrado com peso de 0.1500 o modulo está configurado assim:
    Modulo configurado com formato de peso em kilos

    Valor Máximo de Compra – 10000
    Peso Máximo Permitido Pelos Correios – 30
    Ao efetuar o calculo com mais de 66 itens é exibido o erro :
    Peso excedido. (Cod. 4)

    Sendo que o limite é 30kilos
    log:
    2011-07-01T15:09:41+00:00 DEBUG (7): pedroteixeira_correios [230]: Correios Error: Peso excedido. [Cod. 4] [Serv. 40290]

    O que pode estar errado?

    Obrigado!
    Julio

    Responder

    Pedro Teixeira respondeu:

    @Julio Cesar,

    Confira o formato do peso e o peso cadastrado no produto. Se estiverem corretos não sei o que pode ser.

    Abraço!

    Responder

    Julio Cesar respondeu:

    @Pedro Teixeira,

    Será que é poque eui não desinstalei o modulo antigo?

    Desistalar ele agora com a versão 4 instalada é perigoso?

    Obrigado!
    Abraços

    Responder

    Pedro Teixeira respondeu:

    @Julio Cesar,

    Tudo que for feito em produção é perigoso, teste antes em um ambiente separado.

    Abraço!

    Responder

  9. Edivar disse:

    Olá Pedro,

    Gostaria de uma função em minha loja magento. Estou usando seu módulo dos correios. Porém quando os correios não retornam o calculo eu gostaria de utilizar um módulo alternativo de calculo. Isto é possível? O magento tem esta função por defaut? Se negativo as duas respostas anteriores: você pega este tipo de projeto?

    Se tiver interesse favor enviar email.
    Abraços

    Responder

  10. Carlos Viegas disse:

    Oi, Pedro.
    Apliquei a sua extension no meu site.
    O plugin está retornando um erro 403. Ao invés de calcular o valor do frete, o site somente apresenta uma mensagem dizendo que o serviço está fora do ar.

    Li em uma documentação dos Correios que, para usufruir do cálculo de frete, é necessário ter um código de cliente. Isso é verdade? E se aplica mesmo a serviços sem contrato?

    Qualquer ajuda que puderes me dar será muito útil.

    Responder

  11. Herberte disse:

    Quem dera se fosse tão simples assim! Esse calculo só serve para uma unica mercadoria, quero ver você postar um função de calculo de vários produtos!

    Responder

  12. Fernando disse:

    Bom dia, a calculadora não esta aparecendo na pagina do produto… que comando devo inserir no checkou.xml ?

    Responder

Deixe um comentário