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!

comments powered by Disqus