Calculando frete com Web-Service dos Correios

Muito utilizado, principalmente, em lojas virtuais, o cálculo de frete é uma funcionalidade bastante importante para todo e qualquer sistema. Nesse artigo veremos como usufruir do Web-Service dos Correios e fazer o cálculo de frete para um determinado peso, local e tipo de frete. Pelo Web-Service é possível consultar SEDEX, e-SEDEX e PAC. Lembrando que, para o tipo e-SEDEX e outros, a empresa deve ter um contrato com os Correios para utilizar essa modalidade. Isso será mostrado como informar o login dos Correios antes de fazer a consulta.


Antes de começar, veja abaixo as formas de consulta que os Correios dispõe (retirado do site):

Forma de acesso e respostaDefiniçãoExemplos de usoProtocolos de Acesso e de Resposta
WebserviceA consulta utiliza a tecnologia webservices – coleção de protocolos e padrões usados para troca de informações entre aplicações Internet.Lojas virtuais 
Sistemas corporativos
Acesso e resposta via XML, SOAP e WSDL - protocolos dewebservices
Resultado XMLA consulta retorna os dados em formato XML, para livre tratamento das informações pelo cliente.Lojas virtuais 
Sites de empresas
Acesso via post
Resposta padrão XML
Resultado página do clienteA consulta transfere as informações de resposta para uma página do cliente, por ele especificada.Sites de empresasAcesso via post 
Resposta via get
Resultado página dos CorreiosA resposta vem numa página dos Correios, em formato de página pop-up.Call-centersAcesso via post 
Resposta em página dos Correios
Conforme explicado, vamos utilizar o Web-Service para consumir e obter a resposta desejada. Nesse link tem o manual com maiores detalhes acerca do uso. Vamos a implementação!

Crie/Abra um Web Site e clique com o direito sobre o projeto para abrir o menu. Escolha a opção Add Web Reference... .


Informe a URL http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx e clique em Go. Aguarde a realização da busca pelo Web-Service, renomeie o serviço (caso deseje) e escolha Add Reference.


Veja que em seu projeto irá surgir uma pasta nova denominada App_WebReferences e seu web.config terá uma nova entrada. Agora, preparemos o seguinte método (são apenas sugestões, pode melhorá-la ou adequar a sua necessidade):


private string ConsultaWebService()
    {
        // Dados da empresa, se tiver contrato com os Correios
        string nCdEmpresa = string.Empty;
        string sDsSenha = string.Empty;
        // Código do tipo de frete - por padrão deixei o SEDEX
        string nCdServico = "40010";
        // Cep de origem e destino - apenas números
        string sCepOrigem = "40280000";
        string sCepDestino = "40280000";
        // Peso total da encomenda - por padrão deixei 1kg
        string nVlPeso = "1";
        // Formato da encomenda - por padrão deixei caixa
        int nCdFormato = 1;
        // Para encomenda do tipo PAC, deve-se preencher a dimensão da embalagem
        decimal nVlComprimento = 0;
        decimal nVlAltura = 0;
        decimal nVlLargura = 0;
        decimal nVlDiametro = 0;
        // Informa se é por mão própria - por padrão deixei Não
        string sCdMaoPropria = "N";
        // Valor declarado - por padrão não informo
        decimal nVlValorDeclarado = 0;
        // Se desejo recebr aviso de recebimento - por padrão não quero
        string sCdAvisoRecebimento = "N";


        // Instancio o web-service
        Correios.CalcPrecoPrazoWS webServiceCorreios = new Correios.CalcPrecoPrazoWS();


        // Efetuo a requisição
        Correios.cResultado retornoCorreios = webServiceCorreios.CalcPrecoPrazo(nCdEmpresa, sDsSenha, nCdServico, sCepOrigem, sCepDestino, nVlPeso, nCdFormato, nVlComprimento, nVlAltura, nVlLargura, nVlDiametro, sCdMaoPropria, nVlValorDeclarado, sCdAvisoRecebimento);


        // Verifico se há retorno
        if (retornoCorreios.Servicos.Length > 0)
        {
            // Se deu tudo certo, então retorna o valor
            if (retornoCorreios.Servicos[0].Erro == "0")
                return "R$ " + retornoCorreios.Servicos[0].Valor;
            else
                return retornoCorreios.Servicos[0].MsgErro;
        }
        else
            return "NÃO FOI POSSÍVEL CONSULTAR O SERVIÇO DESEJADO!";


    }


No caso, o array de serviços veio apenas um pois informando na variável nCdServico que era para consultar apenas SEDEX. Pode ser mais de um numa consulta separados por vírgula, exemplo "40010,81019".

A tabela de serviços disponíveis são:

Código  Serviço
41106  PAC sem contrato
40010  SEDEX sem contrato
40045  SEDEX a Cobrar, sem contrato
40215  SEDEX 10, sem contrato
40290  SEDEX Hoje, sem contrato
40096  SEDEX com contrato
40436  SEDEX com contrato
40444  SEDEX com contrato
81019  e-SEDEX, com contrato
41068  PAC com contrato


Essas e outras informações você encontra no manual dos Correios. Isso possibilita e facilita bastante ao programador na consulta e obtenção dessa informação. Nunca escrevi tanto a palavra Correios em minha vida... Té!

7 comentários:

Anônimo disse...

Agradeço as informações foi de grande ajuda !

Pablo Garcia disse...

Ola,

segue um serviço muito bom e dependendo do volume de acesso é gratuito.

http://www.wscepbrasil.com.br

Att

Anônimo disse...

Realmente funciona ok valeu! Porém, acionado via
client (JS Event) teremos 2 request's: 1 para o método do servidor aspx.net no qual instancia CalcPrecoPrazoWS e o outro para o webservice do correio propriamente dito. Via $.Ajax teriamos apenas 1 request. ou seja JS Event -> Correio.

Anônimo disse...

Parabéns muito bom, vou testa aqui mais já da pra ver a qualidade muito obrigado.

iMetrica disse...

Parabéns, funcionando!

Anônimo disse...

Foi de grande ajuda. Obrigado!

Jones disse...

Cara foi de grande ajuda o seu código, olhei em muitos lugares mas consegui sanar minhas dúvidas com o seu código aqui. Grato

Postar um comentário