Ir para conteúdo
Fórum Script Brasil
  • 0

3 duvidas com Calculo de Frete correios


Carlos Rocha

Pergunta

Ola amigos, estou aqui sofrendo para entender a dinamica de uma loja virtual e agora tem 3 duvidas que preciso tirar antes de prosseuir meu trabalho e gostaria de poder contar a ajuda de voces.

1) Peguei um script de calculo de frete (com a URL dos correios) que me retorna valores bem proximos aos do correios.

Segue código:

<?php

/**
* Executa calculo do frete usando webservice dos correios.
* @copyright  Phaneronsoft
* @author Marcelo Korjenioski - faleconosco@phaneronsoft.com
* @see http://www.phaneronsoft.com
* @filesource correios.php
* @version 1.1
*/

#####################################
# Código dos Serviços dos Correios  #
#    FRETE PAC = 41106       #
#    FRETE SEDEX = 40010       #
#    FRETE SEDEX 10 = 40215       #
#    FRETE SEDEX HOJE = 40290    #
#    FRETE E-SEDEX = 81019       #
#    FRETE MALOTE = 44105       #
#    FRETE NORMAL = 41017       #
#   SEDEX A COBRAR = 40045       #
#####################################

// Definindo constantes

// Peso total do pacote em Quilos, caso seja menos de 1Kg, ex.: 300g, coloque 0.300
define('PESO',2.00);
define('EMBALAGEM',0.00);
// Valor adicional no envio como custo de embalagem.
define('COMPRIMENTO',20);
define('ALTURA',15);
define('LARGURA',20);

if($_POST) {
// Código do Serviço que deseja calcular, veja tabela acima:
if ($_POST['servico']) {
$cod_servico = $_POST['servico'];
}
// CEP de Origem, em geral o CEP da Loja
$cep_origem = '36855000';
// CEP de Destino, você pode passar esse CEP por GET ou POST vindo de um formulário

$cep_destino = $_POST['cep-destino'];

$cep_destino = eregi_replace("([^0-9])","",$cep_destino);

// URL de Consulta dos Correios
$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?StrRetorno=xml&nCdServico={$cod_servico}&nVlPeso=" . PESO . "&sCepOrigem={$cep_origem}&sCepDestino={$cep_destino}&nCdFormato=1&nVlComprimento=" . COMPRIMENTO . "&nVlAltura=" . ALTURA . "&nVlLargura=" . LARGURA;

// Capta as informações da página dos Correios
$correios_info = file($correios);
// Processa as informações vindas do site dos correios em um Array
foreach($correios_info as $info) {
// Busca a informação do Preço da Postagem
if(preg_match("/\<Valor>(.*)\<\/Valor>/",$info,$tarifa)) {

$total = $tarifa[1] + EMBALAGEM;
}
if(preg_match("/\<PrazoEntrega>(.*)\<\/PrazoEntrega>/",$info,$PrazoEntrega)) {
$PrazoEntrega = $PrazoEntrega[1];
}
}

// Neste exemplo estou colocando apenas PAC e SEDEX
switch ($cod_servico) {
case 41106:
$nome_servico = " PAC ";
break;
case 40010:
$nome_servico = " SEDEX ";
break;
}

// Caso venha valor de resposta é numerio e maior que o custo da embalagem senão ocorreu algum erro na solicitação.
if(is_numeric($total) and ($total > $embalagem)) {
// Quando encontra o valor da postagem, exibe na página formatando em padrão de moeda 10,89
// Caso você não queira formatar basta comentar a linha abaixo que será exibido assim 10.89 e basta executar o comando abaixo
$total = number_format($total,2,',','.');
echo $nome_servico . $total . ' prazo entrega de ' . $PrazoEntrega . ' dia(s) ';
} else {
echo 'Erro ao consultar verifique se CEP esta correto';
}
} else {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<link href="http://demo.phaneronsoft.com/img/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<title>Sistema para Calcular Frete SEDEX e PAC a partir de CEP informado. | Phaneronsoft</title>
<style type="text/css">

* {
font-family:"Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:12px;
font-style:normal;
font-variant:normal;
font-weight:normal;
line-height:normal;
}

body {
background:#FFFFFF none repeat scroll 0 0;
height:100%;
margin:0;
margin-top:20px;
width:100%;
}

div#wrapper {
margin:auto;
position:relative;
width:450px;
z-index:0;
}

.formMain .select {
text-transform:uppercase;
width:99%;
border:1px solid #B6B6B6;
display:block;
}

.formSearch fieldset {
border:1px solid #CCCCCC;
margin:0;
padding:0 10px;
}

.formMain label {
display:block;
float:left;
margin-right:4px;
padding-bottom:5px !important;
}

.formMain legend {
color:#1E398D;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
padding:10px 5px;
}

.formMain .button {
background:#F5EED3;
border:1px solid #CCCCCC;
color:#666666;
cursor:pointer;
font-size:12px;
font-weight:bold;
letter-spacing:1px;
margin:10px 0 0;
overflow:visible;
text-transform:uppercase;
width:100%;
}

.formMain .inline {
margin:15px 0 0 !important;
}

.formMain .text, .formMain .select, .formMain .textarea, .formMain .password {
border:1px solid #B6B6B6;
display:block;
text-transform:uppercase;
}

.formMain fieldset span.nameField {
color:#666666;
text-transform:uppercase;
}

h3 {
border-bottom:1px solid #F58220;
margin:0;
padding:0;
}

h3 span {
-x-system-font:none;
color:#1E398D;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
font-style:normal;
font-variant:normal;
font-weight:bold;
line-height:normal;
}

#value {
-x-system-font:none;
color:#9B0000;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
font-style:normal;
font-variant:normal;
font-weight:bold;
line-height:normal;
}
</style>

</head>
<body>
<div id="wrapper">
<h3>
<span>Pesquisa valor de frete</span>

</h3>
<form id="form-pesquisa-repasse" action="" method="post" class="formMain formSearch wsizep100" onsubmit="submitForm(this); return false;">
<fieldset>
<legend>Filtrar Referência</legend>
<label for="servico" class="wsize015">
<span class="nameField">Envio</span>
<select id="servico" name="servico" title="Serviços dos Correios" class="select" tabindex="1">
<option value="41106">PAC</option>
<option value="40010">SEDEX</option>
</select>
</label>
<label class="wsize010" for="cep-destino">
<span class="nameField">CEP Destino</span>
<input id="cep-destino" class="text" type="text" value="" maxlength="9" title="CPF destino" name="cep-destino" tabindex="2"/>
</label>
<label for="pesquisar" class="wsize010">
<input type="submit" id="pesquisar" name="pesquisar" tabindex="3" class="button inline"  value="Pesquisar" />
</label>
</fieldset>
</form>
<span>* Digitar somente número no CEP</span>
<br />
<span id="value"></span>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js" type="text/javascript"></script>
<script type="text/javascript">
function submitForm(form) {
/*
usa método request() da classe Form da prototype, que serializa os campos
do formulário e submete (por POST como default) para a action especificada no form
*/
form.request({
onComplete: function(transport){
/*
se o retorno for diferente de -1, entende-se que não houve problemas, então apaga-se
os campos do formulário usando o método reset() da classe Form
*/

if(transport.responseText !=-1)  {
$('value').innerHTML = transport.responseText;
} else {
form.reset();
$('value').innerHTML = 'Erro ao consultar';
}
}
});
return false;
}

</script>
</body>
</html>
<?php
} // fim else

?>

2)No caso do site dos correios falhar, o que é certo fazer? Verificar o erro com um IF e se houver erro, tentar um outro webservice?

Pergunto isso pois não posso impedir que o internauta deixe de efetuar a compra por causa dos correios não retornarem o valor do frete né?

Nesse casom o que fazer?

3) No calculo do PAC, é necessario enviar as dimensões da embalagem que vai levar a encomenda até a casa do comprador bem como o peso.

Não é pedido o volume do pacote e sim as dimensões.

A) Essas dimensões precisam de ser enviadas mesmo que a embalagem não seja comprada la nos correios?

B) Quanto às medidas,. deixa eu ver se entendi:

No form de cadastro de produtos acrescenta mais 3 campos, (comprimento,altura e largura) para o cliente digitar (ambiente administratio - cadastro de produto da loja virtual) as medidas de cada produto.

Depois, criar um contador de medidas (do jeito que fiz com o peso) para calcular as dimensões provaveis para a embalagem!

É isso?

Se for, será que encontro um codigo desses ai pronto?

Então, me ajuda fazer essa conta:

O site que eu administro, vende produtos pequenos de perfumaria e cuidados com a pele (sabonete, shampoo, antimofo)

No caso de um sabonete (medidas de cada sabonete)

5cm de comprimento

2cm de largura

1cm de altura

No caso de um shampoo (medidas de cada shampoo)

20cm de comprimento

4cm de largura

2cm de altura

Dai um cliente no site faz uma compra assim:

20 sabonetes e 10 shampoos.

A conta para desobrir as dimensões da embalagem de envio seria como?

Como fazer esse calculo?

Voces me explicando isso ai o resto da pra eu me virar!

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Sabe, consegui dar uma enxugada boa no codigo, inclusive, ele retorna exatamente os mesmos valores do site dos correios.

Agora, preciso de ajuda para filtrar prelos erros de cep inserido errado, falha no site dos correios. Nesse caso, redirecionar para outra pagina.

Qual o código devo usar para achar esses erros?

Tambem preciso achar a cidade, estado, endereço do cep de destino escolhido pelo internauta a partir da resposta dos correios.

Como fazer isso?

Segue o codigo enxuto:

<?php
#####################################
# Código dos Serviços dos Correios  #
#    FRETE PAC = 41106              #
#    FRETE SEDEX = 40010            #
#    FRETE SEDEX 10 = 40215         #
#    FRETE SEDEX HOJE = 40290       #
#    FRETE E-SEDEX = 81019          #
#    FRETE MALOTE = 44105           #
#    FRETE NORMAL = 41017           #
#    SEDEX A COBRAR = 40045         #
#####################################

        $nCdEmpresa          = "";
        $sDsSenha            = "";
        $nCdServico          = $_POST['TENVIO'];
        $sCepOrigem          = 36855000;
        $sCepDestino         = $_POST['TCEP'];
        $sCepDestino         = eregi_replace("([^0-9])","",$sCepDestino);
        $nVlPeso             = $peso_medio;
        $nCdFormato          = 1;
        $nVlComprimento      = 20;
        $nVlAltura           = 20;
        $nVlLargura          = 20;
        $nVlDiametro         = 0;
        $sCdMaoPropria       = "S";
        $nVlValorDeclarado   = 0;
        $sCdAvisoRecebimento = "N";

// URL de Consulta dos Correios
$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?StrRetorno=xml&nCdEmpresa=$nCdEmpresa&sDsSenha=$sDsSenha&nCdServico=$nCdServico&sCepOrigem=$sCepOrigem&sCepDestino=$sCepDestino&nVlPeso=$nVlPeso&nCdFormato=$nCdFormato&nVlComprimento=$nVlComprimento&nVlAltura=$nVlAltura&nVlLargura=$nVlLargura&nVlDiametro=$nVlDiametro&sCdMaoPropria=$sCdMaoPropria&nVlValorDeclarado=$nVlValorDeclarado&sCdAvisoRecebimento=$sCdAvisoRecebimento";



// Capta as informações da página dos Correios
$correios_info = file($correios);
// Processa as informações vindas do site dos correios em um Array
/*
foreach ($correios_info as $line_num => $line) {
echo "Linha #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br>\n";
}
*/
foreach($correios_info as $info) {
// Busca a informação do Preço da Postagem
//////////////////////////////////////////////////////////////////////////////////////////
/// GUARDAR EM SESSÃO OS RETORNOS PARA EVITAR QUE UM ENTER PERCA OS DADOS ENVIADOS////////
//////////////////////////////////////////////////////////////////////////////////////////

if(preg_match("/\<MsgErro>(.*)\<\/MsgErro>/",$info,$Erro)) {
   print $Erro[1];
                                                           }    
if(preg_match("/\<Valor>(.*)\<\/Valor>/",$info,$tarifa)) {
   $total = floatval(str_replace(',', '.', $tarifa[1]));
                                                         }

if(preg_match("/\<PrazoEntrega>(.*)\<\/PrazoEntrega>/",$info,$PrazoEntrega)) {
   $PrazoEntrega = $PrazoEntrega[1];
                                                         }
                                                                                                              
                                }
// Neste exemplo estou colocando apenas PAC e SEDEX
switch ($nCdServico) {
case 41106:
$nome_servico = " PAC ";
break;
case 40010:
$nome_servico = " SEDEX ";
break;
}
?>

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

  • 0

Só que eu que queria pegar todos os retornos tipo endereço, UF, cepDestino, tarifa, do rerorno que o correio nos envia.

E tambem fazer assim:

Se der erro, redireciona para outra pagina, se não der erro, prossegue os calculos.

Outra coisa é a seginte: Esse url ficou muito tumultuada.

Como eu faria para organizala em linhas? tipo:

linhas 1 url + ?,

linha parametro 1 + &,

linha parametro 2 + &,

assim pos diante

Na verdade, eu queria a url assim:

$correios =
"http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?
StrRetorno=xml&
nCdEmpresa=$nCdEmpresa&
sDsSenha=$sDsSenha&
nCdServico=$nCdServico&
sCepOrigem=$sCepOrigem&
sCepDestino=$sCepDestino&
nVlPeso=$nVlPeso&
nCdFormato=$nCdFormato&
nVlComprimento=$nVlComprimento&
nVlAltura=$nVlAltura&
nVlLargura=$nVlLargura&
nVlDiametro=$nVlDiametro&
sCdMaoPropria=$sCdMaoPropria&
nVlValorDeclarado=$nVlValorDeclarado&
sCdAvisoRecebimento=$sCdAvisoRecebimento
";

O que falta de concatenação para funcionar assim?

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

  • 0

Consegui assim:

// URL de Consulta dos Correios entregue à variavel $correios
$correios ="http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?"
."nCdEmpresa=$nCdEmpresa&"
."sDsSenha=$sDsSenha&"
."sCepOrigem=$sCepOrigem&"
."sCepDestino=$sCepDestino&"
."nVlPeso=$nVlPeso&"
."nCdFormato=$nCdFormato&"
."nVlComprimento=$nVlComprimento&"
."nVlAltura=$nVlAltura&"
."nVlLargura=$nVlLargura&"
."sCdMaoPropria=$sCdMaoPropria&"
."nVlValorDeclarado=$nVlValorDeclarado&"
."sCdAvisoRecebimento=$sCdAvisoRecebimento&"
."nCdServico=$nCdServico&"
."nVlDiametro=$nVlDiametro&"
."StrRetorno=xml";
Isso ai fechou mas o lance de pegar os endereços na resposta dos correios? Voce manja? Tipo nessa parte, fazer se o erro vier imprimir o erro e parar, mas, se não vier erro, prosseguir.
foreach($correios_info as $info) {
// Busca a informação do Preço da Postagem
//////////////////////////////////////////////////////////////////////////////////////////
/// GUARDAR EM SESSÃO OS RETORNOS PARA EVITAR QUE UM ENTER PERCA OS DADOS ENVIADOS////////
//////////////////////////////////////////////////////////////////////////////////////////

if(preg_match("/\<MsgErro>(.*)\<\/MsgErro>/",$info,$Erro)) {
   print $Erro[1];
                                                           }    
if(preg_match("/\<Valor>(.*)\<\/Valor>/",$info,$tarifa)) {
   $total = floatval(str_replace(',', '.', $tarifa[1]));
                                                         }

if(preg_match("/\<PrazoEntrega>(.*)\<\/PrazoEntrega>/",$info,$PrazoEntrega)) {
   $PrazoEntrega = $PrazoEntrega[1];
                                                         }
                                                                                                              
                                }
Eu fiz assim, mas quando não da erro, ele segue mas não envia o valor do frete:
foreach($correios_info as $info) {
// Busca a informação do Preço da Postagem
//////////////////////////////////////////////////////////////////////////////////////////
/// GUARDAR EM SESSÃO OS RETORNOS PARA EVITAR QUE UM ENTER PERCA OS DADOS ENVIADOS////////
//////////////////////////////////////////////////////////////////////////////////////////

if(preg_match("/\<MsgErro>(.*)\<\/MsgErro>/",$info,$Erro) == 0) {
   print $Erro[1]; exit;
                                                           }    
else {
if(preg_match("/\<Valor>(.*)\<\/Valor>/",$info,$tarifa)) {
   $total = floatval(str_replace(',', '.', $tarifa[1]));
                                                         }

if(preg_match("/\<PrazoEntrega>(.*)\<\/PrazoEntrega>/",$info,$PrazoEntrega)) {
   $PrazoEntrega = $PrazoEntrega[1];
                                                         }
}
                                                                                                              
                                }

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

  • 0

Bom, conseguimos,

Para quem querr tai:

Falta apenas implementar a gosto

<?php
#####################################
# Código dos Serviços dos Correios  #
#    FRETE PAC = 41106              #
#    FRETE SEDEX = 40010            #
#    FRETE SEDEX 10 = 40215         #
#    FRETE SEDEX HOJE = 40290       #
#    FRETE E-SEDEX = 81019          #
#    FRETE MALOTE = 44105           #
#    FRETE NORMAL = 41017           #
#    SEDEX A COBRAR = 40045         #
#####################################

        $nCdEmpresa          = "";
        $sDsSenha            = "";
        $nCdServico          = $_POST['TENVIO'];
        $sCepOrigem          = 36855000;
        $sCepDestino         = $_POST['TCEP'];
        $sCepDestino         = eregi_replace("([^0-9])","",$sCepDestino);
        $nVlPeso             = $peso_medio;
        $nCdFormato          = 1;
        $nVlComprimento      = 20;
        $nVlAltura           = 20;
        $nVlLargura          = 20;
        $nVlDiametro         = 0;
        $sCdMaoPropria       = "N";
        $nVlValorDeclarado   = 0;
        $sCdAvisoRecebimento = "S";

// URL de Consulta dos Correios entregue à variavel $correios
$correios ="http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?"
."nCdEmpresa=$nCdEmpresa&"
."sDsSenha=$sDsSenha&"
."sCepOrigem=$sCepOrigem&"
."sCepDestino=$sCepDestino&"
."nVlPeso=$nVlPeso&"
."nCdFormato=$nCdFormato&"
."nVlComprimento=$nVlComprimento&"
."nVlAltura=$nVlAltura&"
."nVlLargura=$nVlLargura&"
."sCdMaoPropria=$sCdMaoPropria&"
."nVlValorDeclarado=$nVlValorDeclarado&"
."sCdAvisoRecebimento=$sCdAvisoRecebimento&"
."nCdServico=$nCdServico&"
."nVlDiametro=$nVlDiametro&"
."StrRetorno=xml";

  
$dados_correios = simplexml_load_file($correios);
//print_r($dados_correios);
print "<p>";

$total = $dados_correios->xpath('cServico/Valor'); 
$total = floatval(str_replace(',', '.', $total[0]));
$PrazoEntrega = $dados_correios->xpath('cServico/PrazoEntrega');   
$erros = $dados_correios->xpath('cServico/Erro');   
$ValorAvisoRecebimento = $dados_correios->xpath('cServico/ValorAvisoRecebimento');   


if ($erros[0] != 0)
   {
       print $erros[0];
       // Tentar outro webservice
   }
else 
   { 
                print "O valor do envio por ";
              print $nome_servico;
              print " será de: R$";
              print number_format($total, 2, ',', '.');
              print "<br>e o prazo de entrega será de ";
              print $PrazoEntrega[0];
              print " dia(s) úteis";
              print "<p>";
              print "Valor da compra sem o frete R$ ";
              print number_format($preco_total, 2, ',', '.');
              print "<p>"; 
              $valor_final = $total + $preco_total;
              print "Valor da compra com o frete R$ ";
              print number_format($valor_final, 2, ',', '.');               

   }

// Neste exemplo estou colocando apenas PAC e SEDEX
switch ($nCdServico) {
case 41106:
$nome_servico = " PAC ";
break;
case 40010:
$nome_servico = " SEDEX ";
break;
}
?>

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...