Calculando fretes em SEDEX com ASP.NET
Walter Amorim (e-mail) é programador em ASP.net e VB.net desde 2003. Atualmente trabalha como Programador Web na agência AM4, em Barra Mansa/RJ. É cursando de Engenharia da Computação do Centro Universitário de Barra Mansa, unidade Cicuta (UBM-Cicuta).
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.