Calcular SEDEX em tempo real pelos Correios

Com esta classe é possível calcular em tempo real (online) o valor do SEDEX entre 2 CEPs através do site dos Correios.

Esta classe suporta os seguintes serviços:

- SEDEX
- SEDEX Hoje
- SEDEX 10
- SEDEX a Cobrar

Este código é muito útil para sites de comércio eletrônico.

<%
'=======================================================
'CLASSE SEDEX
'=======================================================
Class Sedex
	'-----------------------------------------------------
	'Funcao: doCalculoSedex(ByVal ServicoCodigo, ByVal CepOrigem, ByVal CepDestino, ByVal Peso, ByVal MaoPropria, ByVal ValorDeclarado, ByVal AvisoRecebimento)
	'Sinopse: Retorna Lista de Indicadores Financeiros
	'Parâmetros:
	'	ServicoCodigo: Código do tipo de entrega que será calculada
	'				   O valores possíveis são:
	'					- 40010 (SEDEX)
	'					- 40290 (SEDEX Hoje)
	'					- 40215 (SEDEX 10)
	'					- 40045 (SEDEX a Cobrar)
	'					Valor padrão é: 40010 
	'	CepOrigem: Cep de Origem no formato XXXXX-XXX
	'	CepDestino: Cep de Destino no formato XXXXX-XXX
	'	Peso: Peso da remessa limite de 30
	'	MaoPropria: Serviço de Mão Própria(S/N)
	'				Valor padrão é: N
	'	ValorDeclarado: Serviço de seguro com valor declarado
	'	AvisoRecebimento: Serviço de Aviso de Recebimento(S/N)
	'				Valor padrão é: N
	'Retorno: Objeto SedexInfo
	'Autor: Gabriel Fróes - www.codigofonte.com.br
	'-----------------------------------------------------
	Function doCalculoSedex(ByVal ServicoCodigo, ByVal CepOrigem, ByVal CepDestino, ByVal Peso, ByVal MaoPropria, ByVal ValorDeclarado, ByVal AvisoRecebimento)
		'Declaração das variáveis/objetos
	    Dim Retorno
	    Dim URL
	    Dim objXmlHttp
	    Dim objXmlDoc
	    'Inicialização dos objetos/variáveis
	    Set objXmlHttp		= Server.CreateObject("MSXML2.XMLHTTP")
	    Set objXmlDoc		= Server.CreateObject("MSXML2.DOMDocument")
	    Set doCalculoSedex	= New SedexInfo
	    
	    'Validando as variáveis
	    If ServicoCodigo = "" Then
			ServicoCodigo = 40010
		End If
		Peso = Replace(Peso, ",", ".")
		If MaoPropria = "" Then
			MaoPropria = "N"
		End If
		ValorDeclarado = Replace(ValorDeclarado, ",", ".")
		If AvisoRecebimento = "" Then
			AvisoRecebimento = "N"
		End If
		
	    'Montando a URL para busca no site
	    URL =		"http://www.correios.com.br/encomendas/precos/calculo.cfm?resposta=Xml"
	    URL = URL & "&servico="				& ServicoCodigo
	    URL = URL & "&cepOrigem="			& CepOrigem
	    URL = URL & "&cepDestino="			& CepDestino
	    URL = URL & "&peso="				& Peso
	    URL = URL & "&MaoPropria="			& MaoPropria
	    URL = URL & "&valorDeclarado="		& ValorDeclarado
	    URL = URL & "&avisoRecebimento="	& AvisoRecebimento
		objXMLHttp.Open "GET", URL, False
		objXMLHttp.Send
		'Verificando se a busca foi bem sucedida
		If objXmlHttp.statusText = "OK" Then
			objXmlDoc.loadXML(objXmlHttp.responseText)		
			'Verificando se o retorno foi bem sucediido
			If TypeName(objXmlDoc) = "DOMDocument" Then
				doCalculoSedex.Versao				= objXmlDoc.selectSingleNode("//calculo_precos//versao_arquivo").text
				doCalculoSedex.ServicoCodigo		= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//servico").text
				doCalculoSedex.ServicoNome			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//servico_nome").text
				doCalculoSedex.UFOrigem				= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//uf_origem").text
				doCalculoSedex.LocalOrigem			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//local_origem").text
				doCalculoSedex.CEPOrigem			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//cep_origem").text
				doCalculoSedex.UFDestino			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//uf_destino").text
				doCalculoSedex.LocalDestino			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//local_destino").text
				doCalculoSedex.CEPDestino			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//cep_destino").text
				doCalculoSedex.Peso					= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//peso").text
				doCalculoSedex.MaoPropria			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//mao_propria").text
				doCalculoSedex.AvisoRecebimento		= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//aviso_recebimento").text
				doCalculoSedex.ValorDeclarado		= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//valor_declarado").text
				doCalculoSedex.TarifaValorDeclarado	= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//tarifa_valor_declarado").text
				doCalculoSedex.PrecoPostal			= objXmlDoc.selectSingleNode("//calculo_precos//dados_postais//preco_postal").text
				doCalculoSedex.ErroCodigo			= objXmlDoc.selectSingleNode("//calculo_precos//erro//codigo").text
				doCalculoSedex.ErroDescricao		= objXmlDoc.selectSingleNode("//calculo_precos//erro//descricao").text
			Else
				doCalculoSedex.ErroCodigo = "1001"
				doCalculoSedex.ErroDescricao = "Não foi possível consultar à base dos correios neste momento."
			End If
		Else
			doCalculoSedex.ErroCodigo = objXmlHttp.status
			doCalculoSedex.ErroDescricao = objXmlHttp.statusText
		End If
    
	    'Destruindo os objetos
	    Set objXmlDoc	= Nothing
	    Set objXmlHttp	= Nothing
	End Function
End Class

'-----------------------------------------------------
'Classe com os Atributos do Sedex
'-----------------------------------------------------
Class SedexInfo
	Public Versao
	Public ServicoCodigo
	Public ServicoNome
	Public UFOrigem
	Public LocalOrigem
	Public CEPOrigem
	Public UFDestino
	Public LocalDestino
	Public CEPDestino
	Public Peso
	Public MaoPropria
	Public AvisoRecebimento
	Public ValorDeclarado
	Public TarifaValorDeclarado
	Public PrecoPostal
	Public ErroCodigo
	Public ErroDescricao
End Class

'-----------------------------------------------------
'EXEMPLO DE CHAMADA
'-----------------------------------------------------
Dim objSedex
Dim objInfo
Set objSedex = New Sedex
Set objInfo = New SedexInfo
Set objInfo = objSedex.doCalculoSedex("", "02401-200", "90110-170", 30, "N", "", "N")
If objInfo.ErroCodigo = "0" Then
	Response.Write "Serviço: <b>" & objInfo.ServicoNome & "</b><br />"
	Response.Write "UF Origem: <b>" & objInfo.UFOrigem & "</b><br />"
	Response.Write "Local Origem: <b>" & objInfo.LocalOrigem & "</b><br />"
	Response.Write "CEP Origem: <b>" & objInfo.CEPOrigem & "</b><hr />"
	Response.Write "UF Destino: <b>" & objInfo.UFDestino & "</b><br />"
	Response.Write "Local Destino: <b>" & objInfo.LocalDestino & "</b><br />"
	Response.Write "CEP Destino: <b>" & objInfo.CEPDestino & "</b><hr />"
	Response.Write "Peso: <b>" & objInfo.Peso & "</b><br />"
	Response.Write "Mao Propria: <b>" & objInfo.MaoPropria & "</b><br />"
	Response.Write "Valor Declarado: <b>" & objInfo.ValorDeclarado & "</b><br />"
	Response.Write "Tarifa Valor Declarado: <b>" & objInfo.TarifaValorDeclarado & "</b><br />"
	Response.Write "Preço Postal: <b>" & objInfo.PrecoPostal & "</b><br />"
Else
	Response.Write objInfo.ErroDescricao
End If
Set objInfo = Nothing
Set objSedex = Nothing
%>

Nós queremos saber sua opinião aqui