No artigo de hoje vamos demonstrar em como consultar informações de um CNPJ via WebService.
Pessoal, antes de começarmos apenas 2 observações. A primeira é que a TOTVS já possui configurações para preencher no cadastro de Fornecedor e CNPJ, se quiser ver como, segue o link do TDN: https://tdn.totvs.com/pages/releaseview.action?pageId=581873683
A segunda é que essa consulta é oficial do link https://www.receitaws.com.br/v1/cnpj/00000000000000 , onde os zeros no fim é o número do CNPJ, por exemplo 00.000.000/0000-00 . Porém se você quiser ver dados de pessoa física ou o score e inadimplências ai seria interessante fazer uma integração com a SERASA ou SOPHUS (nós já fizemos com a SOPHUS, segue o link com tutorial – https://terminaldeinformacao.com/2020/12/10/como-integrar-protheus-com-a-sophus/ ).
Agora que as observações já foram feitas, abaixo um descritivo da lógica feita no programa:
- Recebe o CNPJ por parâmetro
- Via FWRest é feito a comunicação com a URL do receitaws.com.br
- A string JSON, nós transformamos em um objeto com JSONObject
- Definimos um Array como Retorno os dados desse objeto (esse array tem 16 posições que estão documentadas no Protheus.DOC da função zBusCNPJ)
Abaixo como ficou a função:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zBusCNPJ
(long_description)
@type Function
@author Atilio
@since 18/12/2022
@version version
@param cCNPJ, Caractere, Número do CNPJ a ser consultado
@return aDados, Array, Retorna um array com dados do cnpj consultado (veja as posições na observação abaixo)
@example
aDados := u_zBusCNPJ("00.000.000/0000-00")
If aDados[01]
// Deu certo a consulta
EndIf
@obs As posições do aDados são:
[01] Se deu certo a consulta (.T.) ou (.F.)
[02] Data de Abertura
[03] Situação
[04] Razão Social
[05] Nome Fantasia
[06] Porte
[07] Natureza Juridica
[08] Endereço
[09] Número
[10] Cidade
[11] Estado
[12] CEP
[13] eMail
[14] Telefone
[15] CNPJ
[16] Última Atualização
A consulta é feita no site: https://www.receitaws.com.br/v1/cnpj/00000000000000
/*/
User Function zBusCNPJ(cCNPJ)
Local aArea := FWGetArea()
Local aDados := Array(16)
Local aHeader := {}
Local oRestClient := FWRest():New("https://www.receitaws.com.br/v1")
Local cResultado := ""
Local jResultado := Nil
Local cError := ""
Default cCNPJ := ""
//Define a primeira posição como .F. default
aDados[01] := .F.
//Retira caracteres especiais
cCNPJ := StrTran(cCNPJ, ".", "")
cCNPJ := StrTran(cCNPJ, "/", "")
cCNPJ := StrTran(cCNPJ, "-", "")
//Se veio CNPJ e tem 14 caracteres
If ! Empty(cCNPJ) .And. Len(cCNPJ) == 14
//Adiciona os headers que serão enviados via WS
aAdd(aHeader,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')')
aAdd(aHeader,'Content-Type: application/json; charset=utf-8')
//Define a url e aciona o método GET
oRestClient:setPath("/cnpj/" + cCNPJ)
If oRestClient:Get(aHeader)
//Pega o resultado
cResultado := DecodeUTF8(oRestClient:cResult, "cp1252")
jResultado := JsonObject():New()
cError := jResultado:FromJson(cResultado)
//Se não houve erros
If Empty(cError) .And. jResultado:GetJsonObject('status') != "ERROR"
aDados[01] := .T.
aDados[02] := jResultado:GetJsonObject('abertura')
aDados[03] := jResultado:GetJsonObject('situacao')
aDados[04] := jResultado:GetJsonObject('nome')
aDados[05] := jResultado:GetJsonObject('fantasia')
aDados[06] := jResultado:GetJsonObject('porte')
aDados[07] := jResultado:GetJsonObject('natureza_juridica')
aDados[08] := jResultado:GetJsonObject('logradouro')
aDados[09] := jResultado:GetJsonObject('numero')
aDados[10] := jResultado:GetJsonObject('municipio')
aDados[11] := jResultado:GetJsonObject('uf')
aDados[12] := jResultado:GetJsonObject('cep')
aDados[13] := jResultado:GetJsonObject('email')
aDados[14] := jResultado:GetJsonObject('telefone')
aDados[15] := jResultado:GetJsonObject('cnpj')
aDados[16] := jResultado:GetJsonObject('ultima_atualizacao')
EndIf
EndIf
EndIf
FWRestArea(aArea)
Return aDados
Ai para fazermos o teste é bem simples, por exemplo:
User Function zTstCNPJ()
Local aDados := {}
Local cMensagem := ""
aDados := u_zBusCNPJ("28.671.016/0001-45")
If aDados[1]
cMensagem += "Data de Abertura: " + aDados[02] + " " + CRLF
cMensagem += "Situação: " + aDados[03] + " " + CRLF
cMensagem += "Nome Fantasia: " + aDados[05] + " " + CRLF
cMensagem += "Porte: " + aDados[06] + " " + CRLF
cMensagem += "Natureza Juridica: " + aDados[07] + " " + CRLF
cMensagem += "Cidade: " + aDados[10] + " " + CRLF
cMensagem += "Estado: " + aDados[11] + " " + CRLF
cMensagem += "Última Atualização: " + aDados[16] + " " + CRLF
FWAlertInfo(cMensagem, "Dados do CNPJ")
EndIf
Return
No teste acima, é exibido uma mensagem de teste, conforme abaixo:
Bom pessoal, por hoje é só.
Abraços e até a próxima.

Pena que o site receitaws não possui a informação de Inscrição Estadual.
Estou desenvolvendo meu pelo cnpjws.com.br
Fala Damião, tudo joia?
Opa não conhecia esse cnpj.ws , depois vou dar uma estudada.
Grande abraço.
Bom dia, função top. Vai me ajudar no cadastro de novos clientes, você é fera Dan
Fala Tiago, tudo joia?
Opa, obrigado pelo comentário é muita gentileza e generosidade sua.
Abraços.