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!

11 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

  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

Deixe um comentário