PagSeguro
Canais iMasters

.NET + E-commerce

Calculando fretes em SEDEX com ASP.NET

Olá pessoal ! Neste artigo iremos tratar sobre o cálculo de tarifas do SEDEX dos Correios, utilizado ASP.NET.

Os Correios disponibilizam em seu site um serviço para cálculo de tarifas. Tente acessar http://www.correios.com.br/encomendas/precos/ e confira como funciona o cálculo. Todo nosso cálculo será dinâmico, utilizando esse serviço.

Nem preciso explicar a importância desse tipo de ferramenta quando trabalhamos com e-Commerce, tendo em vista que a maioria dos comércios eletrônicos trabalham com Sedex, devido à sua agilidade e segurança.

O cálculo da tarifa depende, principalmente, dos CEPs de origem e destino e, claro, do peso do pacote.

Pois bem. Comecemos à programar!

Criaremos uma função que irá se conectar ao serviço de cálculo dos Correios:

Public Function CalculaSedex(ByVal cepOrigem As String, ByVal cepDestino As String, _
                           ByVal peso As Decimal, ByVal MaoPropria As Boolean, _
                           ByVal avisoRecebimento As Boolean, _
                           Optional ByVal valorDeclarado As Decimal = 0.0) As Decimal
'Cria uma requisição ao service dos correios, com os dados informados
Dim Req As Net.WebRequest = Net.WebRequest.Create( _
      "http://www.correios.com.br/encomendas/precos/calculo.cfm?" & _
       "cepOrigem=" & cepOrigem & "&cepDestino=" & cepDestino & _
       "&peso=" & peso.ToString.Replace(",", ".") & "&resposta=xml")
     Dim Resp As Net.WebResponse = Req.GetResponse()
     Dim sr As New IO.StreamReader(Resp.GetResponseStream(), Text.Encoding.UTF7)
     Dim ds As New Data.DataSet
     'Coloca os dados recebidos em um DataSet
     ds.ReadXml(sr)
     sr.Close()
     Resp.Close()
     If ds.Tables("erro").Rows(0).Item("codigo") <> 0 Then
        Throw (New Exception(ds.Tables("erro").Rows(0).Item("descricao").ToString))
     Else
        CalculaSedex = _  ds.Tables("Dados_Postais").Rows(0).Item("preco_postal").ToString.Replace(".", ",")
     End If
End Function

Essa função, apesar de parecer assustadora, é bem simples. Ela recebe os seguintes parâmetros:

1 - cepOrigem: O CEP de origem da encomenda (ex. CEP da loja)
2 – cepDestino: O CEP de destino da encomenda (CEP do cliente)
3 – peso: Peso da encomenda em quilos. (ex. 0.5 para meio quilo)
4 – MaoPropria: Especifica se a encomenda deverá ser obrigatoriamente entregue ao destinatário (true/false)
5 – avisoRecebimento: Especifica se a loja deseja receber um comprovante de
que a mercadoria foi entregue (true/false)
6 – valorDeclarado: Opcional. Define o valor da mercadoria. O padrão é R$0,00.
                                  
Ela envia as informações através de uma requisição a uma página dos Correios que devolve, em XML, o preço do Sedex. Esse XML é passado à um dataset, de onde recuperamos os dados.

A função também gera uma exceção, caso ocorra algum erro ao fazer o cálculo (por exemplo, o cliente digitar um CEP inválido).

Poderíamos, por exemplo, chamá-la assim: CalculaSedex("27330680", "28110330", 2.4, False, True, 120.5)

Essa chamada iria nos retornar a tarifa de R$11,50.

Veja como fica a página completa:

<%@ Page Language="VB" Culture="pt-BR"%>
<Script language="VB" runat="server">
Private Sub cmdCalcular_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        'Iremos calcular o preço do SEDEX aqui.
        'Supondo que o CEP da loja seja 27330680,
        'que o peso do produto é de 1 quilo e 230 gramas,
        'que voce é pão duro e não quer usar o serviço de Mão Própria,
        'que você deseja receber um aviso de entrega da mercadoria,
        'e que a mercadoria vale R$120,40.
        Try
          Dim preco As Decimal = CalculaSedex("27330680", txtCEPDestino.Text, 1.23, _
    False, True, 120.5)
            lblResultado.Text = "O valor do frete é " & FormatCurrency(preco)
        Catch ex As Exception
            lblResultado.Text = ex.Message
        End Try
End Sub

Public Function CalculaSedex(ByVal cepOrigem As String, ByVal cepDestino As String, _
                         ByVal peso As Decimal, ByVal MaoPropria As Boolean, _
                         ByVal avisoRecebimento As Boolean, _
                         Optional ByVal valorDeclarado As Decimal = 0.0) As Decimal
        'Cria uma requisição ao service dos correios, com os dados informados
        Dim Req As Net.WebRequest = Net.WebRequest.Create( _
        "http://www.correios.com.br/encomendas/precos/calculo.cfm?" & _
        "cepOrigem=" & cepOrigem & "&cepDestino=" & cepDestino & _
        "&peso=" & peso.ToString.Replace(",", ".") & "&resposta=xml")
        Dim Resp As Net.WebResponse = Req.GetResponse()
        Dim sr As New IO.StreamReader(Resp.GetResponseStream(), Text.Encoding.UTF7)
        Dim ds As New Data.DataSet
        'Coloca os dados recebidos em um DataSet
        ds.ReadXml(sr)
        sr.Close()
        Resp.Close()
        If ds.Tables("erro").Rows(0).Item("codigo") <> 0 Then
           Throw (New Exception(ds.Tables("erro").Rows(0).Item("descricao").ToString))
        Else
           CalculaSedex = _ ds.Tables("Dados_Postais").Rows(0).Item("preco_postal").ToString.Replace(".", ",")
        End If
End Function
</Script>
<html><head><title>SEDEX</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form runat="server" id="frm">
    Calcular Frete:<br /><br />
    Informe no campo abaixo o seu CEP e clique no botão Calcular:
    <br />
    <asp:TextBox ID="txtCEPDestino" runat="server" Width="69px" MaxLength="8"
OnTextChanged="cmdCalcular_Click"></asp:TextBox>
    <asp:Button ID="cmdCalcular" runat="server" OnClick="cmdCalcular_Click"
Text="Calcular" /><br /><br />
    <asp:Label ID="lblResultado" runat="server" Font-Bold="True"></asp:Label>
</form></body></html>

Você pode ver o exemplo rodando neste link. Caso queira baixar o exemplo completo, clique aqui.

É isso pessoal. Caso você tenha alguma dúvida, entre em contato comigo pelo e-mail nao.faca.spam@walteram.com.br. Irei ajudá-lo com a maior alegria.


Comente também

13 Comentários

Rafael Capucho
Rafael Capucho

Maravilhoso artigo,
mas isso é seguro? ou sejá é seguro que a página dos correios nunca irá mudar deixando assim meu store ao vento?

outra coisa, porque você não pede para outros colunistas de outras linguagems transcrever o mesmo código em outra linguagem, como por exemplo Coldfusion/PHP

até mais, abraços.

Raphael Augusto Ferroni Cardoso
Raphael Augusto Ferroni Cardoso

Muito boa a materia. Muita gente me pergunta como fazer o calculo do frete e até tenho o script só que em ASP. Mais esse em ASP.Net seria legal para determinadas situaçoes. Parabens.

Walter Amorim
Walter Amorim

Primeiramente, obrigado.
Rafael, irei ver se acho outros programadores que traduzam para PHP e CF como voce me pediu.
Quanto ao service dos Correios, acredito que tantas pessoas usam esse serviço que acho difícil que ele saia do ar.
Eu mesmo uso ele à um bom tempo. E caso ocorra alguma alteração, rapidamente informarei aqui.

Felipe Alencar Magalhães
Felipe Alencar Magalhães

Esse código aí é um adianto pra vida de muitos programadores.
Parabnéns cara, mais uma matéria arrebentando cara!
ps.: gostei da idéia do Rafael de haver uma tradução para outras linguagens como CF / PHP / JSP
Vamos ver ses surgirão

Vitor Oliveira
Vitor Oliveira

Otimo matéria cara.. isso ajuda em muito!!! Parabéns!!

Walter Amorim
Walter Amorim

À galera que pediu a implementação do código em ColdFusion, aí está o artigo, publicado pelo nosso amigo Felipe Magalhães:
http://www.imasters.com.br/artigo/4330/coldfusion/sedex_em_coldfusion

Douglas Brucieri
Douglas Brucieri

Olá, teria outra forma de calcular o sedex sem usar o site dos correios, tipo o cara pegar essa tabela de tarifas para não depender do site dos correios?

Walter Amorim
Walter Amorim

Douglas, é claro que você poderia utilizar a tabela de cálculo, disponível nas agências dos Correios. Eu criei esse sistema justamente pra você nao precisar usar a tabela, pois ela é bem grande, e os valores variam de acordo com cada estado, região e faixa de peso. Agora imagina se esses parâmetros de cálculos forem alterados. Você terá que alterar toda a tabela, e rever o seu código. Utilizando o site dos Correios você não precisa se preocupar com isso. Se os parâmetros mudarem, não precisará alterar nada.

Douglas Brucieri
Douglas Brucieri

Caro, Walter...Eu entendi e concordo plenamente contigo, até implementei esse código em um site meu, porém quando o site dos correios tá sobrecarregado demora muito pra calcular, e as vezes nem consegue calcular esse é o problema. Você tem alguma sugestão?

Walter Amorim
Walter Amorim

Douglas, o ideal no seu case é vc ter uma alternativa para o cálculo. Tipo um valor padrão de acordo com a região, ou até mesmo utilizar a tabela de cálculo disponível na agencia dos Correios.

Douglas Brucieri
Douglas Brucieri

Ah beleza, o valor padrão eu não posso usar devido o peso dos produtos dos clientes variarem muito, porem poderia usar a tabela só que não encontrei no site dos correios já procurei por todo canto, parece que eles retiraram.

Valeu.

Walter Amorim
Walter Amorim

Douglas, eu acho que tenho essa tabela aí. Tenho que procurar. Se quiser, entre em contato comigo por e-mail que eu te mando.

Douglas Brucieri
Douglas Brucieri

Olá, eu te mandei um email, porem não obtive retorno, pra tu me mandar a tabela de fretes, porém tu sabe como posso ficar atualizando? pois não encontro ela no site dos correios. e gostaria de montar o sistema, ficaria mais seguro. obrigado.

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize