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!