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!






Foi so para mostrar como vc fez, correto?
Responder
Pedro Teixeira respondeu:
17 de março de 2010
@CajuCLC,
Exato!
Responder
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:
04 de abril de 2010
@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
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:
06 de abril de 2010
@deadmilkman,
Valeu!
Responder
Funcionou certinho, obrigado pela postagem…
Agora é só descobrir como eu atribuo acesso de arquivo somente a url…
Responder
Pedro Teixeira respondeu:
04 de junho de 2010
@Rodrigo,
Desculpe, não entendi o que você quer fazer.
Abraço!
Responder
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:
04 de junho de 2010
@Rodrigo,
Você pode usar outras bibliotecas como o CURL.
Abraço!
Responder
Rodrigo respondeu:
04 de junho de 2010
@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