none
Busca de CNPJ via Webservice RRS feed

Respostas

  • Boas Thiago,

    Aqui vai o código que tens que colocar no plugin:

    public class WebServiceCall : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationService service = (IOrganizationService)serviceProvider.GetService(typeof(IOrganizationService));
    
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    Entity entity = (Entity)context.InputParameters["Target"];
    
                    if (entity.LogicalName != "account")
                        return;
    
                    try
                    {
                        string requestUrl = "https://wooki.com.br/api/v1/cnpj/receitafederal?numero=" + entity["new_cnpj"] + "&usuario=teste@wooki.com.br&senha=teste";
    
                        HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
                        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                        {
                            if (response.StatusCode != HttpStatusCode.OK)
                                throw new Exception(String.Format("Server error (HTTP {0}: {1}).", response.StatusCode, response.StatusDescription));
    
                            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(CNPJ));
                            object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
                            CNPJ jsonResponse = objResponse as CNPJ;
    
                            if (entity.Attributes.Contains("new_datasituacaocadastral"))
                            {
                                entity.Attributes["new_datasituacaocadastral"] = jsonResponse.DataSituacaoCadastral;
                            }
                            else
                            {
                                entity.Attributes.Add("new_datasituacaocadastral", jsonResponse.DataSituacaoCadastral);
                            }
                        }
                    }
                    catch (FaultException<OrganizationServiceFault> ex)
                    {
                        throw new InvalidPluginExecutionException("An error occurred in the FollupupPlugin plug-in.", ex);
                    }
                    catch (Exception ex)
                    {
                        tracingService.Trace("FollowupPlugin: {0}", ex.ToString());
                        throw;
                    }
                }
            }
        }
    
        [DataContract]
        public class CNPJ
        {
            [DataMember(Name = "data_situacao_cadastral")]
            public string DataSituacaoCadastral { get; set; }
            [DataMember(Name = "aprovado_por")]
            public string AprovadoPor { get; set; }
            [DataMember(Name = "sites")]
            public string[] Sites { get; set; }
        }
    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.

    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP domingo, 31 de agosto de 2014 01:05
    • Marcado como Resposta Thiago_Lima quarta-feira, 3 de setembro de 2014 16:14
    domingo, 31 de agosto de 2014 01:05
  • Boas Thiago,

    Então é assim este código tem dois passos a leitura da resposta do WS:

     DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(CNPJ));
     object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
     CNPJ jsonResponse = objResponse as CNPJ;

    No objecto jsonResponse vai ter os campos retornados pelo WS mas eu coloquei apenas alguns campos:

    [DataContract]
    public class CNPJ
    {
        [DataMember(Name = "data_situacao_cadastral")]
        public string DataSituacaoCadastral { get; set; }
    }

    Para adicionares mais campos do retorno do WS vais ter que acrescentar mais propriedades e mapeá-las com o nome que vem do WS no atributo DataMember, onde colocas no Name o nome do campo do retorno do WS.

    Depois para afectares os campos do CRM basta fazeres vários IFs daqueles que eu coloquei:

    if (entity.Attributes.Contains("new_datasituacaocadastral")) { entity.Attributes["new_datasituacaocadastral"] = jsonResponse.DataSituacaoCadastral; } else { entity.Attributes.Add("new_datasituacaocadastral", jsonResponse.DataSituacaoCadastral); }

    Que basicamente vê se na entidade tem um determinado campo caso não tenha acrescenta senão actualiza o valor. Neste caso estou a considerar que tens um campo new_datasituacaocadastral no CRM.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quarta-feira, 3 de setembro de 2014 09:07
    • Marcado como Resposta Thiago_Lima quarta-feira, 3 de setembro de 2014 16:15
    quarta-feira, 3 de setembro de 2014 09:07

Todas as Respostas

  • Boas Thiago,

    A resposta aparentemente é simples, só que apanhei algumas contrariedades, ontem a noite consegui escrever o programa para chamar o webservice e correu tudo bem, o pior é que o CRM não deixa efectuares chamadas cross-domain. Para isso também há solução que é usares JSONP, o problema é que ao dizer que é em JSONP ele fica a espera que o formato seja JSON o que não é caso, pois o WebService que referes apenas está a retornar XML e não consegui que ele retornasse JSON, ou seja, ele consegue efectuar a chamada dá 200 OK mas como ele está a espera de JSON dá erro.

    Código que usei:

    function loadPage(){
    	$.ajax({
    		type: "GET",
    		url: "http://ws.fontededados.com.br/consulta.asmx/SituacaoCadastralPJ?login=teste&senha=teste&cnpj=00000000000191",
    		contentType: "application/json; charset=utf-8",
    		dataType: "jsonp",
    		success: function (data) {
    			alert(data);
    		},
    		error: function(e){
    			alert(e.statusText);              
    		}		
    	});
    }

    Este código é o que está a fazer a chamada ultrapassando o problema do cross-domain mas que por retornar XML ele não consegue entrar no success mas sim no error, aqui eu contactava quem cuida do WebService para ver se tem alguma solução, o que podes testar é se tens problemas de cross domain:

    function loadPage(){
    	$.ajax({
    		type: "POST",
    		url: "http://ws.fontededados.com.br/consulta.asmx/SituacaoCadastralPJ",
    		data: {login:'teste', senha:'teste',cnpj:'00000000000191'},
    		contentType: "application/json; charset=utf-8",
    		dataType: "json",
    		success: function (data) {
    			alert(data);
    		},
    		error: function(e){
    			alert(e.statusText);              
    		}		
    	});
    }

    Este códgio ignora os problemas de cross-domain, caso recebas um alert com a string "No-Transport" é porque tens que usar o primeiro código. Pedia-te para testares tu para ver o comportamento.

    Para experimentares este código, tens que adicionar as bibliotecas jquery e json2.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011


    • Sugerido como Resposta Azevedo PedroMVP terça-feira, 19 de agosto de 2014 14:29
    • Editado Azevedo PedroMVP terça-feira, 19 de agosto de 2014 14:42 Mais informações
    terça-feira, 19 de agosto de 2014 14:29
  • Boas Pedro, obrigado por responder !

    O primeiro código me retornou um " success " e o segundo um "error" 

    com base no success eu poderia extrair as informações ?

    terça-feira, 19 de agosto de 2014 17:30
  • Encontrei outro Webservice que retorna em JSON, não seria mais viavel para adaptar ao seu código ? como tratar as informações ?

    https://wooki.com.br/api/v1/cnpj/receitafederal?usuario=teste@wooki.com.br&senha=teste&numero=00000000000191

    A requisição acima irá realizar uma consulta de situação cadastral na Receita Federal.
     Os dados virão no formato JSON por padrão. 



    • Editado Thiago_Lima terça-feira, 19 de agosto de 2014 18:00 .
    terça-feira, 19 de agosto de 2014 17:57
  • Boas Thiago,

    Eu neste momento não estou ao pé de um PC para testar mas em teoria ficaria assim:

    function loadPage(){
    	$.ajax({
    		type: "GET",
    		url: "https://wooki.com.br/api/v1/cnpj/receitafederal?usuario=teste@wooki.com.br&senha=teste&numero=00000000000191",
    		contentType: "application/json; charset=utf-8",
    		dataType: "jsonp",
    		success: function (data) {
    			alert(data);
    		},
    		error: function(e){
    			alert("Unavailable");              
    		}		
    	});
    }

    O problema é que nunca é pacifico estas chamadas, mas verifica que funciona que amanhã eu passo o código para extrair a informação. Se não funcionar vamos ter que ter outra estratégia. Qual é o seu ambiente? Qual a versão do CRM e se é on-premise ou online.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    quarta-feira, 20 de agosto de 2014 16:19
  • Ola Pedro !

    este ultimo código me retornou um Unavailable


    uso a plataforma Online 2013, versão 6.1.0.1043 

    em relação ao ambiente, o que seria em especifico ?

    quarta-feira, 20 de agosto de 2014 16:48
  • Boas Thiago,

    Infelizmente este WebService não permite chamadas JSONP (se vires pelo Ferramentas do browser vais ver que ele consegue efectuar a chamada mas a resposta não é conforme com o formato JSONP), quando se trata de chamadas cross-domain é sempre muito complicado. Eu estava a perguntar pelo ambiente se era online ou on-premise porque se fosse on-premise poderíamos realizar um WebService local que chamava estes WebServices sendo assim e caso não encontres outro WebSevice com esta informação tens duas opções que é realizar as chamadas pelo código C#, essas duas opções ou é por plugin ou em actividade customizada de workflow, a chamada é semelhante.

    A seguir tens o código de chamada dentro de uma actividade customizada de workflow:

    public sealed partial class DistanceCalculator : CodeActivity
        {
            protected override void Execute(CodeActivityContext executionContext)
            {
                IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
                IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
    
                string requestUrl = "https://wooki.com.br/api/v1/cnpj/receitafederal?numero=" + this.startingCNPJ.Get(executionContext) + "&usuario=teste@wooki.com.br&senha=teste";
    
                HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    if (response.StatusCode != HttpStatusCode.OK)
                        throw new Exception(String.Format("Server error (HTTP {0}: {1}).", response.StatusCode, response.StatusDescription));
    
                    DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(CNPJ));
                    object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
                    CNPJ jsonResponse = objResponse as CNPJ;
    
                    this.DataSituacaoCadastral.Set(executionContext, jsonResponse.DataSituacaoCadastral);
                }            
            }
    
            [RequiredArgument]
            [Input("Starting CNPJ")]
            public InArgument<string> startingCNPJ { get; set; }
    
            [Output("DataSituacaoCadastral")]
            public OutArgument<string> DataSituacaoCadastral { get; set; }
        }
    
        [DataContract]
        public class CNPJ
        {
            [DataMember(Name = "data_situacao_cadastral")]
            public string DataSituacaoCadastral { get; set; }
            [DataMember(Name = "aprovado_por")]
            public string AprovadoPor { get; set; }
            [DataMember(Name = "sites")]
            public string[] Sites { get; set; }
        }

    Aqui só fiz parte do código por exemplo a class CNPJ podes colocar todos os outros campos que o WebService retorna. Se quiseres fazer num plugin a chamada ao WebService é igual.

    A grande diferença aqui é que o utilizador não vai ver o resultado no imediato no ecrã. É apenas uma solução se encontrares outros WebServices coloca aqui para experimentarmos.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP segunda-feira, 25 de agosto de 2014 09:41
    • Marcado como Resposta Thiago_Lima segunda-feira, 25 de agosto de 2014 13:47
    • Não Marcado como Resposta Thiago_Lima quinta-feira, 28 de agosto de 2014 19:15
    segunda-feira, 25 de agosto de 2014 09:40
  • ainda preciso instalar o Visual Studio para tratar esses códigos em C#, ai vou testar o que você postou e já retorno.
    quinta-feira, 28 de agosto de 2014 19:12
  • Boas Thiago,

    Aqui vai o código que tens que colocar no plugin:

    public class WebServiceCall : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationService service = (IOrganizationService)serviceProvider.GetService(typeof(IOrganizationService));
    
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    Entity entity = (Entity)context.InputParameters["Target"];
    
                    if (entity.LogicalName != "account")
                        return;
    
                    try
                    {
                        string requestUrl = "https://wooki.com.br/api/v1/cnpj/receitafederal?numero=" + entity["new_cnpj"] + "&usuario=teste@wooki.com.br&senha=teste";
    
                        HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
                        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                        {
                            if (response.StatusCode != HttpStatusCode.OK)
                                throw new Exception(String.Format("Server error (HTTP {0}: {1}).", response.StatusCode, response.StatusDescription));
    
                            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(CNPJ));
                            object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
                            CNPJ jsonResponse = objResponse as CNPJ;
    
                            if (entity.Attributes.Contains("new_datasituacaocadastral"))
                            {
                                entity.Attributes["new_datasituacaocadastral"] = jsonResponse.DataSituacaoCadastral;
                            }
                            else
                            {
                                entity.Attributes.Add("new_datasituacaocadastral", jsonResponse.DataSituacaoCadastral);
                            }
                        }
                    }
                    catch (FaultException<OrganizationServiceFault> ex)
                    {
                        throw new InvalidPluginExecutionException("An error occurred in the FollupupPlugin plug-in.", ex);
                    }
                    catch (Exception ex)
                    {
                        tracingService.Trace("FollowupPlugin: {0}", ex.ToString());
                        throw;
                    }
                }
            }
        }
    
        [DataContract]
        public class CNPJ
        {
            [DataMember(Name = "data_situacao_cadastral")]
            public string DataSituacaoCadastral { get; set; }
            [DataMember(Name = "aprovado_por")]
            public string AprovadoPor { get; set; }
            [DataMember(Name = "sites")]
            public string[] Sites { get; set; }
        }
    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.

    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP domingo, 31 de agosto de 2014 01:05
    • Marcado como Resposta Thiago_Lima quarta-feira, 3 de setembro de 2014 16:14
    domingo, 31 de agosto de 2014 01:05
  • Ola pedro registrei o Plugin, só me tira uma duvida

    em que parte eu posso tratar o retorno da pesquisa e configura-lo em um campo do CRM ?

    terça-feira, 2 de setembro de 2014 18:51
  • Boas Thiago,

    Então é assim este código tem dois passos a leitura da resposta do WS:

     DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(CNPJ));
     object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
     CNPJ jsonResponse = objResponse as CNPJ;

    No objecto jsonResponse vai ter os campos retornados pelo WS mas eu coloquei apenas alguns campos:

    [DataContract]
    public class CNPJ
    {
        [DataMember(Name = "data_situacao_cadastral")]
        public string DataSituacaoCadastral { get; set; }
    }

    Para adicionares mais campos do retorno do WS vais ter que acrescentar mais propriedades e mapeá-las com o nome que vem do WS no atributo DataMember, onde colocas no Name o nome do campo do retorno do WS.

    Depois para afectares os campos do CRM basta fazeres vários IFs daqueles que eu coloquei:

    if (entity.Attributes.Contains("new_datasituacaocadastral")) { entity.Attributes["new_datasituacaocadastral"] = jsonResponse.DataSituacaoCadastral; } else { entity.Attributes.Add("new_datasituacaocadastral", jsonResponse.DataSituacaoCadastral); }

    Que basicamente vê se na entidade tem um determinado campo caso não tenha acrescenta senão actualiza o valor. Neste caso estou a considerar que tens um campo new_datasituacaocadastral no CRM.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quarta-feira, 3 de setembro de 2014 09:07
    • Marcado como Resposta Thiago_Lima quarta-feira, 3 de setembro de 2014 16:15
    quarta-feira, 3 de setembro de 2014 09:07
  • Boas Pedro agora entendi,

    E como eu faço para testar o Plugin, basta criar uma conta e preencher o CNPJ com 00000000000191 ??

    quarta-feira, 3 de setembro de 2014 12:47
  • Boas Thiago,

    Depende em que mensagem você se registou, se foi no create é quando cria uma conta, se foi no update é em cada atualização ele vai verificar e atualizar.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011


    quarta-feira, 3 de setembro de 2014 13:05
  • Boas Pedro, Funcionou Perfeitamente !

    agradeço sua paciência e atenção neste caso, me ajudou bastante !



    • Editado Thiago_Lima sexta-feira, 12 de junho de 2015 13:19
    quarta-feira, 3 de setembro de 2014 16:14
  • Olá,

    Porque não usa as WS da Hub do Desenvolvedor?

    Eles possuem diversas WS de CPF e CNPJ e você as configura conforme a sua necessidade e fácil de usar.

    Os preços deste site são muito mais acessíveis e tem o mesmo resultado, acredito que vale a pena conferir e testar.

    Caso você tenha alguma dúvida, eles possuem um ótimo atendimento via chat ou e-mail.

    Segue o site:

    https://www.hubdodesenvolvedor.com.br

    Espero ter ajudado

    Att.
    terça-feira, 19 de junho de 2018 13:56
  • Ola Eduardo, 

    obrigado pela dica, duvida antiga essa e na epoca funciounou bem o modelo indicado pelo Pedro

    nao conhecia o hub do desenvolvedor, vou da uma olhada
    sexta-feira, 13 de julho de 2018 13:48