Ir para conteúdo
Celso Leandro Palma

Frete Correios PHP + Webservice

Recommended Posts

Olá, eu estou com uma bela dúvida aqui.

 

Estou a realizar o cálculo de frete dos correios.

 

Após várias pesquisas, encontrei alguns métodos de como obter respostas dos correios e todos até que funcionam relativamente bem.

 

O meu grande problema é o seguinte:

 

Se em meu Carrinho possui 1 único produto o valor retornado vem certinho, porém se o meu carrinho possuí mais de um produto, como eu posso realizar corretamente o cálculo?

 

Vamos aos exemplos:

 

Se eu estiver em um site (Exemplo: http://www.ultrafarma.com.br), seleciono 1 produto qualquer (no caso: http://www.ultrafarma.com.br/produto/detalhes-18334/centrum_select_com_150_comprimidos.html), digito o CEP: 13012-000, ele me retornou a seguinte informação:

Entrega Expressa: de 2 a 3 dias úteis - Via Sedex | Frete: R$ 6,33

 

Show de bola até aí... Se eu aumento de 1 produto, para 2 produtos, o valor ficará R$ 10,26, se eu aumento para 10 produtos, o valor será de R$ 15,39.

 

Ou seja o cálculo não é feito sobre 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10

Mas sim pelo volume da caixa (Volume) para o envio Certo?

 

1ª Pergunta é: como que se realize este cálculo do volume?

Obviamente que neste exemplo eu utilizei uma forma simples, ou seja, ele calculou o mesmo produto 10x, mas e se no caso fossem 10 produtos totalmente diferentes, como adequar o cálculo por volume?

 

2ª EU percebi, que na parte superior do carrinho deles, eles informam a quantidade de gramas e se eu selecionar 1 produto ele me dá o resultado de 290 gramas;

Se eu seleciono 10 produtos ele me dá 2.900 gramas (óbivio)

Sabemos pela documentação dos correios, que o peso MÁXIMO estipulado por eles, é de 30 Kg (30.000 Gramas), sendo assim, se selecionamos mais de 103 produtos, a quantidade em peso ultrapassaria a quantidade permitida pelos correios...

Como solucionar isso?

 

Vamos supor que, eu tenha 6 produtos:

1 - 30 Kg

2 - 15 kg

3 - 16 Kg

4 - 8 Kg

5 - 11 kg

6 - 11 Kg

Total: 91 Kg

 

Em meu carrinho, como que eu posso distribuir isso de uma forma correta para que a requisição dê o valor correto (ou muito aproximado do correto) como resposta?

 

A mesma pergunta vale para os outros quesitos, que são, profundidade, largura e altura?

 

Como resolver isso?

 

Fico no aguardo e agradeço a quem puder me auxiliar.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você ler o manual dos correios verá que o cálculo leva em conta 2 coisas:

1 - Peso;

2 - Cubagem

Prevalecerá o que tiver maior valor. Por este motivo você deve passar para os correios o peso total do pacote bem como as dimensões dele. Lembrando que o peso máximo que os correios transportam é de 30kg e existem limitações no tamanho do pacote também, estas informações você vai encontrar em:

http://www.correios.com.br/para-voce/correios-de-a-a-z/pdf/calculador-remoto-de-precos-e-prazos/manual-de-implementacao-do-calculo-remoto-de-precos-e-prazos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você ler o manual dos correios verá que o cálculo leva em conta 2 coisas:

1 - Peso;

2 - Cubagem

Prevalecerá o que tiver maior valor. Por este motivo você deve passar para os correios o peso total do pacote bem como as dimensões dele. Lembrando que o peso máximo que os correios transportam é de 30kg e existem limitações no tamanho do pacote também, estas informações você vai encontrar em:

http://www.correios.com.br/para-voce/correios-de-a-a-z/pdf/calculador-remoto-de-precos-e-prazos/manual-de-implementacao-do-calculo-remoto-de-precos-e-prazos

Olá ESerra, isso sim, eu tenho acesso a estas informações e já me debrucei sobre este manual..

 

A questão, não é o que ele pega e suas limitações, isto já está mais do que esclarecido. O que eu preciso saber é como fazer o sistema se comportar quando se trata mais do que 1 produto... e como gerar o valor mais aproximado possível, para que não tenha tanto problema ao cliente, quando o valor total do peso e cubagem for ultrapassado por conta de ter vários produtos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neste caso basta usar o raciocínio lógico...

 

1 - 30 Kg

2 - 15 kg

3 - 16 Kg

4 - 8 Kg

5 - 11 kg

6 - 11 Kg

Total: 91 Kg

 

Pegue o valor total e divida por 30 (peso máximo), você terá 3,alguma_coisa, multiplique a parte inteira (3) por 30, terá 90, subtraia o total (91) pelo que encontrou (90), terá 1.

Então você sabe que terá que calcular o valor total do frete baseado em:

30 kg e pegar o valor e multiplicar por 3 (já que serão 3 pacotes de 30kg).

1 kg (que será o "quebrado").

 

Quanto as dimensões, novamente basta usar a cabeça, como você monta um pacote que contêm vários tamanhos diferentes? Usando o bom senso você vai começar colocando embaixo o pacote que for mais largo e mais comprido, pronto, você já tem 2 dimensões para enviar aos correios, a altura do pacote será o somatório do total das alturas de todos os produtos. Sempre respeitando o que prevê o manual dos correios.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por guinigri
      Boa tarde, preciso passar o valor do frete exibido da API dos correios para o pag seguro mas não estou conseguindo!
      Exemplo:
       
      O cliente entra no meu site add um produto ao carrinho e verifica o frete no próprio carrinho, seleciona se quer PAC ou SEDEX, e quando apertar no botão de pagamento do Pagseguro, ele envia o valor do frete selecionado para a API do pagseguro
       
      Segue os Codigos:
       
      --> FORM DO FRETE COM RETORNO DO VALOR:

       
      <form method="post" action="#" class="navbar-form navbar-left" role="textbox" id="t1" name="t1">                          <div class="form-group">          Simular frete: <input type="text" class="form-control" name="frete" placeholder="Frete" required id="frete">             <input type="hidden" name="vldeclarado" value="<?php echo $exibir['preco'];?>" />         </div>                                     <button class="btn btn-success" type="submit" name="submit">             <span class="glyphicon glyphicon-search"></span>                        </button>                                  </form>                          <?php             if($_POST):?>                 <div class="row">             <div class="col-sm-12" style="margin-top: 10px; margin-bottom: 0px; border-style: none; border-top: none; border-color: #CBCBCB; border-width: 3px;">                                  <?php             $frete = trim($_POST['frete']);             //echo "<h3>{$frete}</h3>";               require_once 'frete.php';             $table = frete( $frete );               echo $table;?>                                </div></div><?php     endif;//POST                              ?> --> API DO PAGSEGURO:
      <form method="post" target="pagseguro" action="https://pagseguro.uol.com.br/v2/checkout/payment.html">                        <!-- Campos obrigatórios -->           <input name="receiverEmail" type="hidden" value="EMAIL@gmail.com">              <input name="currency" type="hidden" value="BRL">             <!-- Itens do pagamento (ao menos um item é obrigatório) -->         <?php              $i = 1;         do{             foreach ($_SESSION['carrinho'] as $id_prod => $qnt)  {                 $code_prod = $conexao->query("SELECT * FROM produtos where id = '$id_prod'");         $exi = $code_prod->fetch(PDO::FETCH_ASSOC);                 $prod = $exi['produto'];                 $precouni = number_format(($exi['preco']),2,'.',',');                          ?>                   <input name="itemId<?php echo $i; ?>" type="hidden" value="<?php echo $id_prod;?>">                   <input name="itemDescription<?php echo $i; ?>" type="hidden" value="<?php echo $prod; ?>">                   <input name="itemAmount<?php echo $i; ?>" type="hidden" value="<?php echo $precouni; ?>">                   <input name="itemQuantity<?php echo $i; ?>" type="hidden" value="<?php echo $qnt; ?>">                                                   <input name="itemWeight<?php echo $i; ?>" type="hidden" value="0">         <?php         $i++;              }                      } while($i <= count($_SESSION['carrinho'])); ?>                     <input name="itemShippingCost1" type="hidden" value="300"> (VALOR DO FRETE AQUI)                                    <!-- Informações de frete (opcionais) -->           <input name="shippingType" type="hidden" value="">  (TIPO DE FRETE SELECIONADO AQUI) Desculpe se ficou grande, se alguem puder me ajudar ficaria grato!
       
    • Por IgorWeldt
      Bom dia, galera.
       
      Essa é a minha primeira postagem 
       
      Seguinte, estou desenvolvendo um website simples de compra, onde o usuário fará o pagamento pela API do PagSeguro, o problema é que não estou conseguindo usar a calculadora de frete do Correios.
       
      Encontrei diversos códios prontos pela internet, porém, nenhum funciona.
       
      Minha página fica carregando e não sai disso.
       
      Falta basicamente isso para finalizar o projeto, alguém pode me dar uma luz?
       
      <?php $parametros = array(); // Código e senha da empresa, se você tiver contrato com os correios, se não tiver deixe vazio. $parametros['nCdEmpresa'] = ''; $parametros['sDsSenha'] = ''; // CEP de origem e destino. Esse parametro precisa ser numérico, sem "-" (hífen) espaços ou algo diferente de um número. $parametros['sCepOrigem'] = '81810110'; $parametros['sCepDestino'] = '80050530'; // O peso do produto deverá ser enviado em quilogramas, leve em consideração que isso deverá incluir o peso da embalagem. $parametros['nVlPeso'] = '1'; // O formato tem apenas duas opções: 1 para caixa / pacote e 2 para rolo/prisma. $parametros['nCdFormato'] = '1'; // O comprimento, altura, largura e diametro deverá ser informado em centímetros e somente números $parametros['nVlComprimento'] = '16'; $parametros['nVlAltura'] = '5'; $parametros['nVlLargura'] = '15'; $parametros['nVlDiametro'] = '0'; // Aqui você informa se quer que a encomenda deva ser entregue somente para uma determinada pessoa após confirmação por RG. Use "s" e "n". $parametros['sCdMaoPropria'] = 'n'; // O valor declarado serve para o caso de sua encomenda extraviar, então você poderá recuperar o valor dela. Vale lembrar que o valor da encomenda interfere no valor do frete. Se não quiser declarar pode passar 0 (zero). $parametros['nVlValorDeclarado'] = '200'; // Se você quer ser avisado sobre a entrega da encomenda. Para não avisar use "n", para avisar use "s". $parametros['sCdAvisoRecebimento'] = 'n'; // Formato no qual a consulta será retornada, podendo ser: Popup – mostra uma janela pop-up | URL – envia os dados via post para a URL informada | XML – Retorna a resposta em XML $parametros['StrRetorno'] = 'xml'; // Código do Serviço, pode ser apenas um ou mais. Para mais de um apenas separe por virgula. $parametros['nCdServico'] = '40010,41106'; $parametros = http_build_query($parametros); $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx'; $curl = curl_init($url.'?'.$parametros); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $dados = curl_exec($curl); $dados = simplexml_load_string($dados); ?> <html> <head> <title>Frete Correios Testes</title> </head> <body> <h1>Calculadora de frete dos Correios</h1> <?php foreach($dados->cServico as $linhas) { if($linhas->Erro == 0) { echo $linhas->Codigo.'</br>'; echo $linhas->Valor .'</br>'; echo $linhas->PrazoEntrega.' Dias </br>'; }else { echo $linhas->MsgErro; } echo '<hr>'; } ?> </body> </html>  
      Obrigado à todos!
    • Por luizfabianochaves
      bom dia..
       
      preciso fazer o calculo do prazo medio de recebimento da minha empresa, em relação ao periodo do ano passado.
      já tenho a soma de tudo o que recebi com 30, 60, 90, 120 e mais de 120 dias.. como calcular o prazo medio do pl sql com essas informações?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.