{"metadata":{"image":[],"title":"","description":""},"api":{"url":"","auth":"required","settings":"","results":{"codes":[]},"params":[]},"next":{"description":"","pages":[]},"title":"Endpoints","type":"basic","slug":"endpoints-api-abertura-contas","excerpt":"Informações de todos os endpoints disponíveis na API de Abertura de Contas da Gerencianet","body":"Nesta página você encontra todos os endpoints disponíveis na API Abertura de Contas da Gerencianet e informações de como utilizá-los corretamente, como por exemplo os escopos necessários para o consumo de cada rota e os detalhes de retorno dos mesmos.\n\nUtilize o sumário abaixo para navegar rapidamente entre os grupos de endpoints da API.\n\n**Sumário**\n1. [Cadastro Simplificado](#section-cadastro-simplificado)\n1.1 [Solicitar abertura de conta simplificada](#section-solicitar-abertura-de-conta-simplificada-)\n1.2 [Recuperar credenciais de uma conta simplificada](#section-recuperar-credenciais-de-uma-conta-simplificada-)\n1.3 [Recuperar certificado de uma conta simplificada](#section-recuperar-certificado-de-uma-conta-simplificada-)\n2. [Webhook](#section-webhook)\n 2.1 [Configurar webhook](#section-configurar-o-webhook)\n 2.2 [Detalhar webhook](#section-detalhar-webhook)\n 2.3 [Cancelar webhook](#section-cancelar-webhook)\n 2.4 [Listar webhooks](#section-listar-webhooks)\n\n\n## Tutorial API de Abertura de Contas da Gerencianet\n[block:html]\n{\n  \"html\": \"<iframe width=\\\"560\\\" height=\\\"315\\\" src=\\\"https://www.youtube.com/embed/uW78tu1xnSQ\\\" title=\\\"YouTube video player\\\" frameborder=\\\"0\\\" allow=\\\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\\\" allowfullscreen></iframe>\"\n}\n[/block]\n\n\n## Obter Autorização\n\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method post\\\">POST</span>\\n  \\t<span class=\\\"endpoint\\\">\\n        /oauth/token\\n    </span>\\n</div>\"\n}\n[/block]\nEste endpoint é utilizado para autorizar as credenciais de uma aplicação e obter os escopos que a aplicação possui para acessar os outros endpoints da API. É necessário que o certificado P12/PEM esteja presente na requisição de autorização a fim de que o *handshake* com o servidor da API seja permitido.\n\n### Exemplos de autorização utilizando o certificado .P12\n\nPara a utilização da API Abertura de Contas da Gerencianet é necessário que o cliente e o servidor se comuniquem em uma conexão verificada um com o outro. A verificação é feita pelo certificado bidirecional (.PEM ou .P12), isto é, o servidor e o cliente implementaram um certificado de chave privada e um certificado de chave pública que permite que um possa assegurar-se da identidade do outro.\n\nPor isso para fazer qualquer requisição HTTP à API Abertura de Contas da Gerencianet, incluindo a requisição de autorização junto ao OAuth2, é necessário que o certificado .P12, ou .PEM, esteja presente nos cabeçalhos da requisição.\n\nAbaixo, trazemos exemplos de como consumir a autorização da API Abertura de Contas da Gerencianet, incorporando esse certificado na requisição.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<?php //Desenvolvido pela Consultoria Técnica da Gerencianet\\n\\n$config = [\\n  \\\"certificado\\\" => \\\"./certificado.pem\\\",\\n  \\\"client_id\\\" => \\\"YOUR-CLIENT-ID\\\",\\n  \\\"client_secret\\\" => \\\"YOUR-CLIENT-SECRET\\\"\\n];\\n$autorizacao =  base64_encode($config[\\\"client_id\\\"] . \\\":\\\" . $config[\\\"client_secret\\\"]);\\n\\n$curl = curl_init();\\n\\ncurl_setopt_array($curl, array(\\n    CURLOPT_URL => \\\"https://apis.gerencianet.com.br/oauth/token\\\", // Rota base, homologação ou produção\\n    CURLOPT_RETURNTRANSFER => true,\\n    CURLOPT_ENCODING => \\\"\\\",\\n    CURLOPT_MAXREDIRS => 10,\\n    CURLOPT_TIMEOUT => 0,\\n    CURLOPT_FOLLOWLOCATION => true,\\n    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\\n    CURLOPT_CUSTOMREQUEST => \\\"POST\\\",\\n    CURLOPT_POSTFIELDS => '{\\\"grant_type\\\": \\\"client_credentials\\\"}',\\n    CURLOPT_SSLCERT => $config[\\\"certificado\\\"], // Caminho do certificado\\n    CURLOPT_SSLCERTPASSWD => \\\"\\\",\\n    CURLOPT_HTTPHEADER => array(\\n        \\\"Authorization: Basic $autorizacao\\\",\\n        \\\"Content-Type: application/json\\\"\\n    ),\\n));\\n\\n$response = curl_exec($curl);\\n\\ncurl_close($curl);\\n\\necho \\\"<pre>\\\";\\necho $response;\\necho \\\"</pre>\\\";\",\n      \"language\": \"php\"\n    },\n    {\n      \"code\": \"//Desenvolvido pela Consultoria Técnica da Gerencianet\\n\\n\\\"use strict\\\";\\nconst https = require(\\\"https\\\");\\nvar axios = require(\\\"axios\\\");\\nvar fs = require(\\\"fs\\\");\\n\\n//Insira o caminho de seu certificado .p12 dentro de seu projeto\\nvar certificado = fs.readFileSync(\\\"./certificado.p12\\\");\\n\\n//Insira os valores de suas credenciais em desenvolvimento do pix\\nvar credenciais = {\\n  client_id: \\\"YOUR-CLIENT-ID\\\",\\n  client_secret: \\\"YOUR-CLIENT-SECRET\\\",\\n};\\n\\nvar data = JSON.stringify({ grant_type: \\\"client_credentials\\\" });\\nvar data_credentials = credenciais.client_id + \\\":\\\" + credenciais.client_secret;\\n\\n// Codificando as credenciais em base64\\nvar auth = Buffer.from(data_credentials).toString(\\\"base64\\\");\\n\\nconst agent = new https.Agent({\\n  pfx: certificado,\\n  passphrase: \\\"\\\",\\n});\\n//Consumo em desenvolvimento da rota post oauth/token\\nvar config = {\\n  method: \\\"POST\\\",\\n  url: \\\"https://apis.gerencianet.com.br/oauth/token\\\",\\n  headers: {\\n    Authorization: \\\"Basic \\\" + auth,\\n    \\\"Content-Type\\\": \\\"application/json\\\",\\n  },\\n  httpsAgent: agent,\\n  data: data,\\n};\\n\\naxios(config)\\n  .then(function (response) {\\n    console.log(JSON.stringify(response.data));\\n  })\\n  .catch(function (error) {\\n    console.log(error);\\n  });\",\n      \"language\": \"javascript\",\n      \"name\": \"Node\"\n    },\n    {\n      \"code\": \"#Desenvolvido pela Consultoria Técnica da Gerencianet\\n\\nimport requests\\nimport base64\\n\\ncredentials = {\\n    \\\"client_id\\\": \\\"YOUR-CLIENT-ID\\\",\\n    \\\"client_secret\\\": \\\"YOUR-CLIENT-SECRET\\\",\\n}\\n\\ncertificado = './certificado.pem'  # A variável certificado é o diretório em que seu certificado em formato .pem deve ser inserido\\n\\nauth = base64.b64encode(\\n    (f\\\"{credentials['client_id']}:{credentials['client_secret']}\\\"\\n     ).encode()).decode()\\n\\nurl = \\\"https://apis.gerencianet.com.br/oauth/token\\\"  #Para ambiente de Desenvolvimento\\n\\npayload=\\\"{\\\\r\\\\n    \\\\\\\"grant_type\\\\\\\": \\\\\\\"client_credentials\\\\\\\"\\\\r\\\\n}\\\"\\nheaders = {\\n    'Authorization': f\\\"Basic {auth}\\\",\\n    'Content-Type': 'application/json'\\n}\\n\\nresponse = requests.request(\\\"POST\\\",\\n                            url,\\n                            headers=headers,\\n                            data=payload,\\n                            cert=certificado)\\n\\nprint(response.text)\",\n      \"language\": \"python\",\n      \"name\": \"Python\"\n    },\n    {\n      \"code\": \"//Desenvolvido pela Consultoria Técnica da Gerencianet\\n\\nusing System;\\nusing System.Security.Cryptography.X509Certificates;\\nusing System.Collections.Generic;\\nusing RestSharp;\\n\\nnamespace PixGerencianet\\n{\\n    class Authorize\\n    {\\n        public static string Base64Encode(string plainText)\\n        {\\n            var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);\\n            return System.Convert.ToBase64String(plainTextBytes);\\n        }\\n\\n        static void Main(string[] args)\\n        {\\n\\n            var credencials = new Dictionary<string, string>{\\n                {\\\"client_id\\\", \\\"YOUR-CLIENT-ID\\\"},\\n                {\\\"client_secret\\\", \\\"YOUR-CLIENT-SECRET\\\"}\\n            };\\n            var authorization = Base64Encode(credencials[\\\"client_id\\\"] + \\\":\\\" + credencials[\\\"client_secret\\\"]);\\n            var client = new RestSharp.RestClient(\\\"https://apis.gerencianet.com.br/oauth/token\\\");\\n            var request = new RestRequest(Method.POST);\\n\\n            X509Certificate2 uidCert = new X509Certificate2(\\\"./certificado.p12\\\", \\\"\\\");\\n            client.ClientCertificates = new X509CertificateCollection() { uidCert };\\n\\n            request.AddHeader(\\\"Authorization\\\", \\\"Basic \\\" + authorization);\\n            request.AddHeader(\\\"Content-Type\\\", \\\"application/json\\\");\\n            request.AddParameter(\\\"application/json\\\", \\\"{\\\\r\\\\n    \\\\\\\"grant_type\\\\\\\": \\\\\\\"client_credentials\\\\\\\"\\\\r\\\\n}\\\", ParameterType.RequestBody);\\n            \\n            IRestResponse restResponse = client.Execute(request);\\n            string response = restResponse.Content;\\n\\n            Console.WriteLine(response);\\n        }\\n    }\\n}\",\n      \"language\": \"csharp\"\n    },\n    {\n      \"code\": \"#Desenvolvido pela Consultoria Técnica da Gerencianet\\n\\nrequire \\\"uri\\\"\\nrequire \\\"net/http\\\"\\nrequire \\\"openssl\\\"\\n\\nclient_id = \\\"YOUR-CLIENT-ID\\\";\\nclient_secret = \\\"YOUR-CLIENT-SECRET\\\";\\n\\ncertfile = File.read(\\\"certificado.pem\\\") # A variável certfile é o diretório em que seu certificado em formato .pem deve ser inserido\\n\\nurl = URI(\\\"https://apis.gerencianet.com.br/oauth/token\\\") #Para ambiente de Desenvolvimento\\n\\nhttps = Net::HTTP.new(url.host, url.port);\\nhttps.use_ssl = true\\nhttps.cert = OpenSSL::X509::Certificate.new(certfile)\\nhttps.key = OpenSSL::PKey::RSA.new(certfile)\\n\\nrequest = Net::HTTP::Post.new(url)\\nrequest.basic_auth(client_id, client_secret)\\nrequest[\\\"Content-Type\\\"] = \\\"application/json\\\"\\nrequest.body = \\\"{\\\\r\\\\n    \\\\\\\"grant_type\\\\\\\": \\\\\\\"client_credentials\\\\\\\"\\\\r\\\\n}\\\"\\n\\nresponse = https.request(request)\\nputs response.read_body\",\n      \"language\": \"ruby\"\n    },\n    {\n      \"code\": \"//Desenvolvido pela Consultoria Técnica da Gerencianet\\n\\nimport java.io.BufferedReader;\\nimport java.io.InputStreamReader;\\nimport java.io.OutputStream;\\nimport java.net.URL;\\nimport java.util.Base64;\\n\\nimport javax.net.ssl.HttpsURLConnection;\\nimport javax.net.ssl.SSLSocketFactory;\\n\\npublic class Auth {\\n    public static void main(String[] args) throws Exception {\\n        String client_id = \\\"YOUR-CLIENT-ID\\\";\\n        String client_secret = \\\"YOUR-CLIENT-SECRET\\\";;\\n        String basicAuth = Base64.getEncoder().encodeToString(((client_id+':'+client_secret).getBytes()));\\n      \\n      \\t//Diretório em que seu certificado em formato .p12 deve ser inserido\\n        System.setProperty(\\\"javax.net.ssl.keyStore\\\", \\\"certificado.p12\\\"); \\n        SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();\\n        \\n        URL url = new URL (\\\"https://apis.gerencianet.com.br/oauth/token\\\"); //Para ambiente de Desenvolvimento              \\n        HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();\\n        conn.setDoOutput(true);\\n        conn.setRequestMethod(\\\"POST\\\");\\n        conn.setRequestProperty(\\\"Content-Type\\\", \\\"application/json\\\");\\n        conn.setRequestProperty(\\\"Authorization\\\", \\\"Basic \\\"+ basicAuth);\\n        conn.setSSLSocketFactory(sslsocketfactory);\\n        String input = \\\"{\\\\\\\"grant_type\\\\\\\": \\\\\\\"client_credentials\\\\\\\"}\\\";\\n       \\n        OutputStream os = conn.getOutputStream();\\n        os.write(input.getBytes());\\n        os.flush();\\t\\t\\n\\n        InputStreamReader reader = new InputStreamReader(conn.getInputStream());\\n        BufferedReader br = new BufferedReader(reader);\\n\\n        String response;\\n        while ((response = br.readLine()) != null) {\\n          System.out.println(response);\\n        }\\n        conn.disconnect();\\n\\n    }\\n}\",\n      \"language\": \"java\"\n    },\n    {\n      \"code\": \"//Desenvolvido pela Consultoria Técnica da Gerencianet\\npackage main\\n\\nimport (\\n  \\\"fmt\\\"\\n  \\\"strings\\\"\\n  \\\"net/http\\\"\\n  \\\"io/ioutil\\\"\\n  \\\"crypto/tls\\\"\\n)\\n\\nconst(\\n  client_id = \\\"YOUR-CLIENT-ID\\\"\\n  client_secret = \\\"YOUR-CLIENT-SECRET\\\"\\n)\\n\\nfunc main() {\\n\\n  url := \\\"https://apis.gerencianet.com.br/oauth/token\\\"// Rota base, homologação ou produção\\n  method := \\\"POST\\\"\\n\\n  payload := strings.NewReader(`{\\\"grant_type\\\": \\\"client_credentials\\\"}`)\\n\\n\\n  cert, _ := tls.LoadX509KeyPair(\\\"CA.crt.pem\\\", \\\"KEY.crt.pem\\\")// Seu certificado e chave privada gerada a partir dos comandos de conversão OpenSSL\\n\\n  client := &http.Client{\\n    Transport: &http.Transport{\\n        TLSClientConfig: &tls.Config{\\n            Certificates: []tls.Certificate{cert},\\n        },\\n    },\\n}\\n\\n  req, err := http.NewRequest(method, url, payload)\\n\\n  if err != nil {\\n    fmt.Println(err)\\n    return\\n  }\\n  req.SetBasicAuth(client_id, client_secret)\\n  req.Header.Add(\\\"Content-Type\\\", \\\"application/json\\\")\\n\\n  res, err := client.Do(req)\\n  if err != nil {\\n    fmt.Println(err)\\n    return\\n  }\\n  defer res.Body.Close()\\n\\n  body, err := ioutil.ReadAll(res.Body)\\n  if err != nil {\\n    fmt.Println(err)\\n    return\\n  }\\n  fmt.Println(string(body))\\n}\",\n      \"language\": \"go\"\n    }\n  ]\n}\n[/block]\n#### Exemplo de resposta da autorização\n\nO trecho de código abaixo representa um exemplo de resposta do OAuth à sua requisição de autorização.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n    \\\"access_token\\\": \\\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\\\",\\n    \\\"token_type\\\": \\\"Bearer\\\",\\n    \\\"expires_in\\\": 3600,\\n    \\\"scope\\\": \\\"gn.registration.write gn.registration.read gn.registration.webhook.write gn.registration.webhook.read\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"Resposta\"\n    }\n  ]\n}\n[/block]\n<br>\n\n## Rota base\n\n Rota base ou URL's base para ambientes, utilize a rota abaixo para realizar a comunicação da sua aplicação com o ambiente de produção oferecido pela Gerencianet.\n\n[block:parameters]\n{\n  \"data\": {\n    \"0-0\": \"**Produção**\",\n    \"0-1\": \"`https://apis.gerencianet.com.br/`\"\n  },\n  \"cols\": 2,\n  \"rows\": 1\n}\n[/block]\n<br>\n\n## Cadastro Simplificado\n\n### Solicitar abertura de conta simplificada.\n\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method post\\\">POST</span>\\n    <span class=\\\"endpoint\\\">/cadastro/conta-simplificada</span>\\n</div>\"\n}\n[/block]\nSolicita abertura de conta simplificada para integração. Os dados de entrada são dados referentes ao cliente final. Caso os dados de entrada sejam válidos, o cliente final receberá um link no qual poderá autorizar integração à uma conta Gerencianet.\n**Requer autorização para o escopo:** **`gn.registration.write`**\n[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Criação de conta/aplicação\",\n  \"body\": \"Caso o seu cliente final já tenha uma conta na Gerencianet, duas opções vão aparecer para ele:\\n* Criar uma aplicação na conta atual, onde você terá acesso às credenciais e definirá os escopos.\\n* Criar uma conta secundária para o cliente final com as configurações/acessos definidos em sua requisição.\"\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"warning\",\n  \"title\": \"Negação da abertura de conta\",\n  \"body\": \"Caso o seu cliente recuse o processo de abertura de conta, será necessário esperar  2 dias corridos até poder iniciar um novo processo. \\nObs: Não é retornado a informação caso o cliente negue o processo de abertura.\"\n}\n[/block]\n#### Requisição\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n  \\\"clienteFinal\\\": {\\n    \\\"cpf\\\": \\\"12345678900\\\",\\n    \\\"nomeCompleto\\\": \\\"Nome Exemplo\\\",\\n    \\\"dataNascimento\\\": \\\"13/08/2000\\\",\\n    \\\"nomeMae\\\": \\\"Exemplo de nome da mãe\\\",\\n    \\\"celular\\\": \\\"31987654321\\\",\\n    \\\"email\\\": \\\"emaildeexemplo:::at:::gerencianet.com.br\\\",\\n    \\\"endereco\\\": {\\n      \\\"cep\\\": \\\"35400000\\\",\\n      \\\"estado\\\": \\\"MG\\\",\\n      \\\"cidade\\\": \\\"Ouro Preto\\\",\\n      \\\"bairro\\\": \\\"Bairro exemplo\\\",\\n      \\\"logradouro\\\": \\\"Exemplo do nome da rua\\\",\\n      \\\"numero\\\": \\\"777\\\",\\n      \\\"complemento\\\": \\\"apto 101\\\"\\n    }\\n  },\\n  \\\"meioDeNotificacao\\\": [\\n    \\\"sms\\\",\\n    \\\"whatsapp\\\"\\n  ],\\n  \\\"escoposIntegrados\\\": [\\n    \\\"charge.write\\\",\\n    \\\"pix.send\\\"\\n  ]\\n}\",\n      \"language\": \"json\",\n      \"name\": \"Cliente final pessoa física\"\n    },\n    {\n      \"code\": \"{\\n  \\\"clienteFinal\\\": {\\n    \\\"cpf\\\": \\\"12345678900\\\",\\n    \\\"nomeCompleto\\\": \\\"Nome Exemplo\\\",\\n    \\\"dataNascimento\\\": \\\"13/08/2000\\\",\\n    \\\"nomeMae\\\": \\\"Exemplo de nome da mãe\\\",\\n    \\\"celular\\\": \\\"31987654321\\\",\\n    \\\"email\\\": \\\"[email protected]\\\",\\n    \\\"cnpj\\\": \\\"12345678901000\\\",\\n    \\\"razaoSocial\\\": \\\"Ongan Comércio LTDA\\\",\\n    \\\"endereco\\\": {\\n      \\\"cep\\\": \\\"35400000\\\",\\n      \\\"estado\\\": \\\"MG\\\",\\n      \\\"cidade\\\": \\\"Ouro Preto\\\",\\n      \\\"bairro\\\": \\\"Bairro exemplo\\\",\\n      \\\"logradouro\\\": \\\"Exemplo do nome da rua\\\",\\n      \\\"numero\\\": \\\"777\\\",\\n      \\\"complemento\\\": \\\"apto 101\\\"\\n    }\\n  },\\n  \\\"meioDeNotificacao\\\": [\\n    \\\"whatsapp\\\"\\n  ],\\n  \\\"escoposIntegrados\\\": [\\n    \\\"pix.write\\\",\\n    \\\"pix.read\\\",\\n    \\\"pix.send\\\"\\n  ]\\n}\",\n      \"language\": \"json\",\n      \"name\": \"Cliente final pessoa jurídica\"\n    }\n  ]\n}\n[/block]\nDados que podem ser utilizados na requisição de abertura de conta simplificada.\n\n<div class=\"tab2\">(*) Atributo obrigatório</div>\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Atributo\",\n    \"h-1\": \"Descrição\",\n    \"h-2\": \"Obrigatório\",\n    \"h-3\": \"Tipo\",\n    \"0-2\": \"Sim\",\n    \"1-2\": \"Sim\",\n    \"2-2\": \"Sim\",\n    \"1-3\": \"String\",\n    \"2-3\": \"String\",\n    \"0-3\": \"Object\",\n    \"0-0\": \"**clienteFinal**\",\n    \"1-0\": \"**meioDeNotificacao**\",\n    \"2-0\": \"**escoposIntegrados**\",\n    \"0-1\": \"Os campos aninhados sob o identificador **clienteFinal** organizam informações a respeito de dados do cliente final ao qual vai se gerar a conta.\\n\\nclienteFinal:\\n<div class=\\\"tab2\\\">`cpf*`// CPF do cliente final pessoa física. (String)\\n\\n`nomeCompleto*`// Nome completo do cliente final pessoa física.\\n(String)\\n\\n`dataNascimento*`// Data de nascimento do cliente final pessoa física.\\n(String No formato:\\n`DD/MM/AAAA`)\\n\\n`nomeMae`// Nome da mãe do cliente final pessoa física.\\n(String)\\n\\n`celular*`// Celular do cliente final.\\n(String)\\n\\n`email*`// E-mail do cliente final.\\n(String)\\n\\n`cnpj`// CNPJ do cliente final pessoa jurídica.\\n(String)\\n\\n`razaoSocial`// Razão social do cliente final pessoa jurídica.\\n(String)\\n\\n<br>\\n\\n`endereco`: //Endereço do cliente final.\\n(Object)\\n\\n<div class=\\\"tab2\\\">`cep*`// CEP do cliente final pessoa física.\\n(String)\\n\\n`estado*`// Estado do cliente final pessoa física.\\n(String)\\n\\nEnum: \\n`AC, AL, AP, AM, BA, CE, DF, ES, GO, MA, MT, MS, MG,`\\n\\n` PA, PB, PR, PE, PI, RJ, RN, RS, RO, RR, SC, SP, SE, TO`\\n\\n`cidade*`// Cidade do cliente final pessoa física.\\n(String)\\n\\n`bairro*`// Bairro do cliente final pessoa física.\\n(String)\\n\\n`logradouro*`//Logradouro do cliente final pessoa física.\\n(String)\\n\\n`numero*`//Número do cliente final pessoa física.\\n(String)\\n\\n`complemento`//Complemento do cliente final pessoa física.\\n(String)\\n</div>\\n</div>\",\n    \"1-1\": \"Meio pelo qual o cliente final receberá notificação para aprovar a solicitação.\\n\\nEnum:  `sms`, `whatsapp`\",\n    \"2-1\": \"Escopos de serviços que o integrador deseja acessar na conta do cliente final. Não é possível solicitar escopos de serviços não configurados para a aplicação do integrador solicitante.\\n\\nEnum:\\n `charge.write, cob.write, payloadlocation.write, payloadlocation.read,` \\n\\n`cob.read, pix.write, pix.read, pix.send, webhook.write, webhook.read,  `\\n\\n`gn.balance.read, gn.pix.evp.write, gn.pix.evp.read, gn.settings.write,`\\n\\n\\n` gn.settings.read, gn.barcode.read, gn.barcode.pay.write,gn.barcode.pay.read`\"\n  },\n  \"cols\": 4,\n  \"rows\": 3\n}\n[/block]\n#### Respostas\nAs respostas abaixo representam Sucesso(200) e Falhas/erros do consumo.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n  \\\"contaSimplificada\\\": {\\n    \\\"identificador\\\": \\\"92ccd29b-54c9-49fc-b8e8-717a3b373c5e\\\"\\n  }\\n}\",\n      \"language\": \"json\",\n      \"name\": \"200(Success)\"\n    },\n    {\n      \"code\": \"CPF inválido\\n{\\n  \\\"nome\\\": \\\"cpf_invalido\\\",\\n  \\\"mensagem\\\": \\\"O CPF é inválido.\\\"\\n}\\n\\nOu\\n\\nNome completo inválido\\n{\\n  \\\"nome\\\": \\\"nome_completo_invalido\\\",\\n  \\\"mensagem\\\": \\\"O nome completo não corresponde ao CPF do cliente final.\\\"\\n}\\n\\nOu\\n\\nMenoridade\\n\\n{\\n  \\\"nome\\\": \\\"menoridade\\\",\\n  \\\"mensagem\\\": \\\"O cliente final é menor de idade.\\\"\\n}\\n\\nOu\\n\\nData de nascimento inválida\\n{\\n  \\\"nome\\\": \\\"data_nascimento_invalida\\\",\\n  \\\"mensagem\\\": \\\"A data de nascimento não corresponde ao CPF do cliente final.\\\"\\n}\\n\\nOu\\n\\nNome da mãe inválido\\n{\\n  \\\"nome\\\": \\\"nome_mae_invalido\\\",\\n  \\\"mensagem\\\": \\\"O nome da mãe não corresponde ao CPF do cliente final.\\\"\\n}\\n\\nOu\\n\\nCelular inválido\\n{\\n  \\\"nome\\\": \\\"celular_invalido\\\",\\n  \\\"mensagem\\\": \\\"O celular é inválido.\\\"\\n}\\n\\nOu\\n\\nEmail inválido\\n{\\n  \\\"nome\\\": \\\"email_invalido\\\",\\n  \\\"mensagem\\\": \\\"O email é inválido.\\\"\\n}\\n\\nOu\\n\\nCEP inválido\\n{\\n  \\\"nome\\\": \\\"cep_invalido\\\",\\n  \\\"mensagem\\\": \\\"O CEP é inválido.\\\"\\n}\\n\\nOu\\n\\nCNPJ inválido\\n{\\n  \\\"nome\\\": \\\"cnpj_invalido\\\",\\n  \\\"mensagem\\\": \\\"O CNPJ é inválido.\\\"\\n}\\n\\nOu\\n\\nRazão social inválida\\n{\\n  \\\"nome\\\": \\\"razao_social_invalida\\\",\\n  \\\"mensagem\\\": \\\"A razão social não corresponde ao CNPJ do cliente final.\\\"\\n}\\n\\nOu\\n\\nNome completo inválido\\n{\\n  \\\"nome\\\": \\\"nomeCompleto_invalido\\\",\\n  \\\"mensagem\\\": \\\"ClienteFinal deve ter a propriedade obrigatória nomeCompleto.\\\"\\n}\\n\\nOu\\n\\nCPF inativo\\n{\\n  \\\"nome\\\": \\\"cpf_inativo\\\",\\n  \\\"mensagem\\\": \\\"O CPF está em situação cadastral inativa.\\\"\\n}\\n\\nOu\\n\\nCNPJ inativo\\n{\\n  \\\"nome\\\": \\\"cnpj_inativo\\\",\\n  \\\"mensagem\\\": \\\"O CNPJ está em situação cadastral inativa.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"400(Bad request)\"\n    },\n    {\n      \"code\": \"Este erro ocorre nas seguintes situações:\\n\\n* Certificado ou credenciais não existem;\\n* Certificado ou credenciais estão desativados;\\n* Certificado e credenciais não estão vinculados a mesma conta Gerencianet;\\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.\",\n      \"language\": \"json\",\n      \"name\": \"401(Unauthorized)\"\n    },\n    {\n      \"code\": \"Este erro ocorre nas seguintes situações:\\n\\n* Integrador solicita acesso a um escopo ao qual não tem permissão.\",\n      \"language\": \"json\",\n      \"name\": \"403(Forbidden)\"\n    },\n    {\n      \"code\": \"Celular cadastrado\\n{\\n  \\\"nome\\\": \\\"celular_cadastrado\\\",\\n  \\\"mensagem\\\": \\\"O celular é utilizado por outro cliente.\\\"\\n}\\n\\nOu\\n\\nEmail cadastrado\\n\\n{\\n  \\\"nome\\\": \\\"email_cadastrado\\\",\\n  \\\"mensagem\\\": \\\"O email é utilizado por outro cliente.\\\"\\n}\\n\\nOu\\n\\nSolicitação duplicada\\n{\\n  \\\"nome\\\": \\\"solicitacao_duplicada\\\",\\n  \\\"mensagem\\\": \\\"Já existe uma solicitação de abertura de conta aberta para este cliente final.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"409(Conflict)\"\n    },\n    {\n      \"code\": \"Precondition Failed. Este erro ocorre nas seguintes situações:\\n\\n* Integrador deve ter pelo menos um Webhook cadastrado.\\n{\\n  \\\"nome\\\": \\\"webhook_nao_cadastrado\\\",\\n  \\\"mensagem\\\": \\\"Sua conta não possui webhook cadastrado na API de Cadastro.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"412(Precondition Failed)\"\n    },\n    {\n      \"code\": \"Erro na aplicação\\n\\n{\\n  \\\"nome\\\": \\\"erro_aplicacao\\\",\\n  \\\"mensagem\\\": \\\"Ocorreu um erro na aplicação.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"500(Error)\"\n    }\n  ]\n}\n[/block]\n<br>\n\n### Recuperar credenciais de uma conta simplificada.\n\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method get\\\">GET</span>\\n    <span class=\\\"endpoint\\\">/cadastro/conta-simplificada/<span class=\\\"variable\\\">:identificador</span>/credenciais</span>\\n</div>\"\n}\n[/block]\nRecupera as credenciais `Client_Id` e `Client_Secret` para integrar à uma conta simplificada.\n\n**Requer autorização para o escopo:** **`gn.registration.read`**\n\n#### Requisição\n\n\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Atributo\",\n    \"h-1\": \"Descrição\",\n    \"h-2\": \"Obrigatório\",\n    \"0-2\": \"Sim\",\n    \"h-3\": \"Tipo\",\n    \"0-3\": \"String\",\n    \"0-0\": \"**identificador**\",\n    \"0-1\": \"Identificador da conta simplificada gerada.\"\n  },\n  \"cols\": 4,\n  \"rows\": 1\n}\n[/block]\n#### Respostas\nAs respostas abaixo representam Sucesso(200) e Falhas/erros do consumo.\n\n\n\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n  \\\"clientId\\\": \\\"92ccd29b-54c9-49fc-b8e8-717a3b373c5e\\\",\\n  \\\"clientSecret\\\": \\\"b2e9dcca-c46d-4b9b-89d2-c625949bea40\\\",\\n  \\\"conta\\\": {\\n    \\\"numero\\\": \\\"10000\\\"\\n  },\\n  \\\"escopos\\\": [\\n    \\\"pix.send\\\",\\n    \\\"cob.write\\\",\\n    \\\"webhook.read\\\"\\n  ],\\n  \\\"ativo\\\": true\\n}\",\n      \"language\": \"json\",\n      \"name\": \"200(Success)\"\n    },\n    {\n      \"code\": \"Este erro ocorre nas seguintes situações:\\n\\n* Certificado ou credenciais não existem;\\n* Certificado ou credenciais estão desativados;\\n* Certificado e credenciais não estão vinculados a mesma conta Gerencianet;\\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.\",\n      \"language\": \"json\",\n      \"name\": \"401(Unauthorized)\"\n    },\n    {\n      \"code\": \"Integrador tenta recuperar as credenciais de uma conta simplificada não criada por ele.\",\n      \"language\": \"json\",\n      \"name\": \"403(Forbidden)\"\n    },\n    {\n      \"code\": \"Precondition failed. Este erro ocorre nas seguintes situações:\\n\\n* A conta simplificada ainda não está pronta.\\n* Credenciais da conta simplificada não existem.\",\n      \"language\": \"json\",\n      \"name\": \"412(Precondition Failed)\"\n    },\n    {\n      \"code\": \"Erro na aplicação\\n{\\n  \\\"nome\\\": \\\"erro_aplicacao\\\",\\n  \\\"mensagem\\\": \\\"Ocorreu um erro na aplicação.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"500(Error)\"\n    }\n  ]\n}\n[/block]\n<br>\n\n### Recuperar certificado de uma conta simplificada.\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method get\\\">GET</span>\\n    <span class=\\\"endpoint\\\">/cadastro/conta-simplificada/<span class=\\\"variable\\\">:identificador</span>/certificado</span>\\n</div>\"\n}\n[/block]\nRecupera o certificado para integrar à uma conta simplificada.\n\n**Requer autorização para o escopo:** **`gn.registration.read`**\n\n#### Requisição\n\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Atributo\",\n    \"h-1\": \"Descrição\",\n    \"h-2\": \"Obrigatório\",\n    \"h-3\": \"Tipo\",\n    \"0-0\": \"**identificadorWebhook**\",\n    \"0-1\": \"Identificador da conta simplificada gerada.\",\n    \"0-2\": \"Sim\",\n    \"0-3\": \"String\"\n  },\n  \"cols\": 4,\n  \"rows\": 1\n}\n[/block]\n#### Respostas\nAs respostas abaixo representam Sucesso(200) e Falhas/erros do consumo.\n\n\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"\\\"string\\\"\",\n      \"language\": \"json\",\n      \"name\": \"200(Success)\"\n    },\n    {\n      \"code\": \"Este erro ocorre nas seguintes situações:\\n\\n* Certificado ou credenciais não existem;\\n* Certificado ou credenciais estão desativados;\\n* Certificado e credenciais não estão vinculados a mesma conta Gerencianet;\\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint;\",\n      \"language\": \"json\",\n      \"name\": \"401(Unauthorized)\"\n    },\n    {\n      \"code\": \" Integrador tenta recuperar o certificado de uma conta simplificada não criada por ele.\",\n      \"language\": \"json\",\n      \"name\": \"403(Forbidden)\"\n    },\n    {\n      \"code\": \"Precondition failed. Este erro ocorre nas seguintes situações:\\n\\n* A conta simplificada ainda não está pronta.\",\n      \"language\": \"json\",\n      \"name\": \"412(Precondition Failed)\"\n    },\n    {\n      \"code\": \"Erro na aplicação\\n\\n{\\n  \\\"nome\\\": \\\"erro_aplicacao\\\",\\n  \\\"mensagem\\\": \\\"Ocorreu um erro na aplicação.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"500(Error)\"\n    }\n  ]\n}\n[/block]\n\n## Webhook\n\nReúne endpoints para gerenciamento de notificações ao integrador.\n\n### Entendendo o padrão mTLS\n\nPor norma do Banco Central, será necessário a inserção de uma chave pública da Gerencianet em seu servidor para que a comunicação obedeça o padrão mTLS. Em seu domínio que representa o seu servidor, deverá ser feita uma configuração para exigir a chave pública (mTLS) que estamos disponibilizando para que ocorra a autenticação mútua.\n\nA Gerencianet irá fazer 2 requisições para o seu domínio (servidor):\n\n1. Primeira Requisição:  Vamos certificar que seu servidor esteja exigindo uma chave pública da Gerencianet. Isso será feito ao enviar uma requisição sem certificado e seu servidor não deverá aceitar a requisição. Uma vez respondido com a recusa será enviado a 2º requisição.\n2. Segunda Requisição: Enviaremos a notificação junto com a nossa chave pública, o seu servidor que deve conter a chave pública disponibilizada deverá realizar o \"Hand-Shake\" e assim a comunicação ser estabelecida.\n\nÉ necessário que o seu servidor tenha a versão mínima do TLS 1.2. Mais detalhes sobre o TLS [aqui](https://dev.gerencianet.com.br/docs/atualizacao-tls-12)\n\nEm seu servidor você deve configurar uma rota 'POST' com uma resposta padrão como uma string \"200\". Deve ser inserido o nosso certificado de produção ou homologação em seu servidor, abaixo temos alguns exemplos.\n\n\n[block:callout]\n{\n  \"type\": \"success\",\n  \"title\": \"Servidores dedicados\",\n  \"body\": \"Recomenda-se que você tenha um servidor dedicado para conseguir realizar as configurações do webhook, uma vez que é necessário ter acesso a alguns arquivos para realizar as configurações como nos exemplos abaixo.\"\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Hospedagens compartilhadas\",\n  \"body\": \"Para hospedagem em servidores compartilhados pode haver restrições relativas a inserção de certificados gerados por outra entidade, como o nosso CA por exemplo. Caso tenha problemas, orientamos a [abertura de um ticket](https://sistema.gerencianet.com.br/tickets/criar) informando como assunto: **mTLS em hospedagem compartilhada**  ou entre em contato pelo [nosso canal #api-abertura-contas no Discord](https://discord.gg/duNqYs24).  Analisaremos a situação para atuarmos em conjunto em seu auxílio.\"\n}\n[/block]\n### Exemplos de configurações de servidor\n\nPara configurar seu servidor, você precisará das chaves públicas da Gerencianet. Abaixo estão os endereços das chaves para os ambientes de Produção e Homologação. Essas chaves devem ser baixadas e dispostas em seu servidor.\n\n\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Ambiente\",\n    \"h-1\": \"URL da chave pública\",\n    \"0-0\": \"Produção\",\n    \"0-1\": \"`https://pix.gerencianet.com.br/webhooks/chain-pix-prod.crt`\",\n    \"1-0\": \"Homologação\",\n    \"1-1\": \"`https://pix.gerencianet.com.br/webhooks/chain-pix-sandbox.crt`\"\n  },\n  \"cols\": 2,\n  \"rows\": 2\n}\n[/block]\nOs trechos de código abaixo buscam exemplificar as configurações necessárias em seu servidor para que seja possível realizar o *hand-shake* com nossos servidores.\n\n\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"from flask import Flask, jsonify\\nimport ssl\\nimport json\\napp = Flask(__name__)\\n\\n\\[email protected](\\\"/\\\")\\ndef hello():\\n    return \\\"<h1 style='color:blue'>Hello There!</h1>\\\"\\n\\n\\[email protected](\\\"/\\\", methods=[\\\"PUT\\\"])\\ndef hello_put():\\n    response = {\\\"status\\\": 200}\\n    return jsonify(response)\\n\\n\\[email protected](\\\"/\\\", methods=[\\\"POST\\\"])\\ndef imprimir():\\n    imprime = print(request.json)\\n    data = request.json\\n    with open('data.txt', 'a') as outfile:\\n        outfile.write(\\\"\\\\n\\\")\\n        json.dump(data, outfile)\\n    return jsonify(imprime)\\n\\ndef hello_post():\\n    response = {\\\"status\\\": 200}\\n    return jsonify(response)\\n\\nif __name__ == \\\"__main__\\\":\\n    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)\\n    context.verify_mode = ssl.CERT_REQUIRED\\n    context.load_verify_locations('caminho-certificados/certificado-público-Gerencianet.crt')\\n    context.load_cert_chain(\\n        'caminho-certificados/server_ssl.crt.pem',\\n        'caminho-certificados/server_ssl.key.pem')\\n    app.run(ssl_context=context, host='0.0.0.0')\\n#Desenvolvido pela Consultoria Técnica da Gerencianet    \",\n      \"language\": \"python\",\n      \"name\": \"Python\"\n    },\n    {\n      \"code\": \"server {\\n    #\\n    # ...\\n    #\\n    listen [::]:443 ssl ipv6only=on;\\n    listen 443 ssl;\\n    ssl_certificate server_ssl.crt.pem;\\n    ssl_certificate_key server_ssl.key.pem;\\n    ssl_client_certificate /root/chain-pix-webhooks-prod.crt;\\n    ssl_verify_client optional;\\n    ssl_verify_depth 3;\\n    #\\n    # ...\\n    #\\n    location /webhook {\\n        if ($ssl_client_verify != SUCCESS) {\\n            return 403;\\n        }\\n        rewrite ^(.*)$ /webhook;\\n    }\\n}\\n#Desenvolvido pela Consultoria Técnica da Gerencianet\",\n      \"language\": \"http\",\n      \"name\": \"Nginx\"\n    },\n    {\n      \"code\": \"const express = require(\\\"express\\\");\\nconst fs = require(\\\"fs\\\");\\nconst https = require(\\\"https\\\");\\nvar logger = require('morgan');\\n\\nconst httpsOptions = {\\n  cert: fs.readFileSync(\\\"\\\"), // Certificado fullchain do dominio\\n  key: fs.readFileSync(\\\"/\\\"), // Chave privada do domínio\\n  ca: fs.readFileSync(\\\"\\\"),   // Certificado público da Gerencianet\\n  minVersion: \\\"TLSv1.2\\\",\\n  requestCert: true,\\n  rejectUnauthorized: false, //Mantenha como false para que os demais endpoints da API não rejeitem requisições sem MTLS\\n};\\n\\nconst app = express();\\nconst httpsServer = https.createServer(httpsOptions, app);\\nconst PORT = 443;\\n\\napp.use(logger('dev'));  // Comente essa linha caso não queira que seja exibido o log do servidor no seu console\\napp.use(express.json());\\napp.use(express.urlencoded({ extended: false }));\\n\\n// Endpoint para configuração do webhook, você precisa cadastrar https://SEUDOMINIO.com/webhook\\napp.post(\\\"/webhook\\\", (request, response) => {\\n    // Verifica se a requisição que chegou nesse endpoint foi autorizada\\n    if (request.socket.authorized) { \\n        response.status(200).end();\\n    } else {\\n        response.status(401).end();\\n    }\\n});\\n\\n// Endpoind para recepção do webhook tratando o /pix\\napp.post(\\\"/webhook/pix\\\", (request, response) => {\\n    if (request.socket.authorized){\\n        //Seu código tratando a callback\\n        /* EXEMPLO:\\n        var body = request.body;\\n        filePath = __dirname + \\\"/data.json\\\";\\n        fs.appendFile(filePath, JSON.stringify(body) + \\\"\\\\n\\\", function (err) {\\n            if (err) {\\n                console.log(err);\\n            } else {\\n                response.status(200).end();\\n            }\\n        })*/\\n        response.status(200).end();\\n    }else{\\n        response.status(401).end();\\n    }\\n});\\n\\nhttpsServer.listen(PORT, () =>\\n    console.log(`Express server currently running on port ${PORT}`)\\n);\\n#Desenvolvido pela Consultoria Técnica da Gerencianet\",\n      \"language\": \"javascript\",\n      \"name\": \"Node\"\n    },\n    {\n      \"code\": \"# ********************************************************************************* #\\n# Utilize o primeiro exemplo, caso queira requerir o certificado para autenticação  #\\n# mútua em qualquer rota do domínio indicado no VirtualHost.                        #\\n# Funciona bem para sub-domínios. Exemplo: https://www.webhook.seu_dominio.com.br   # \\n# ********************************************************************************* #\\n\\n<IfModule mod_ssl.c>\\n<VirtualHost *:443> # Porta HTTPS\\n    #\\n    # ...\\n    #\\n\\n    SSLCertificateFile /caminho_certificado/fullchain_ssl.pem #fullchain associado ao seu certificado SSL do domínio\\n    SSLCertificateKeyFile /caminho_certificado/privkey_ssl.pem #privkey associada ao seu certificado SSL do domínio\\n\\n    # mTLS Gerencianet\\n    SSLCACertificateFile /caminho_certificado/chain-pix-prod.crt  #Chave pública da Gerencianet\\n    SSLVerifyClient require\\n    SSLVerifyDepth 3\\n      \\n    # Tratando o /pix, redirecionando as requisições sempre para /webhook\\n    Alias \\\"/pix/\\\" \\\"/var/www/webhook/index.php\\\"\\n    Alias \\\"/pix\\\" \\\"/var/www/webhook/index.php\\\"\\n\\n    #\\n    # ...\\n    #\\n</VirtualHost>\\n</IfModule>\\n\\n\\n# ******************************************************************************** #\\n# Utilize o segundo exemplo, caso queira requerir o certificado para autenticação  #\\n# mútua em apenas uma rota do domínio indicado no VirtualHost.                     #\\n# Exemplo: https://www.seu_dominio.com.br/webhook/                                 #     \\n# ******************************************************************************** #\\n\\n<IfModule mod_ssl.c>\\n<VirtualHost *:443> # Porta HTTPS\\n    #\\n    # ...\\n    #\\n\\n    SSLCertificateFile /caminho_certificado/fullchain_ssl.pem #fullchain associado ao seu certificado SSL do domínio\\n    SSLCertificateKeyFile /caminho_certificado/privkey_ssl.pem #privkey associada ao seu certificado SSL do domínio\\n\\n    # mTLS Gerencianet\\n    SSLCACertificateFile /caminho_certificado/chain-pix-prod.crt  #Chave pública da Gerencianet\\n    SSLVerifyClient none\\n    SSLProtocol TLSv1.2\\n      \\n    <Location \\\"/webhook\\\">\\n        SSLVerifyClient require\\n        SSLVerifyDepth 3\\n    </Location>\\n    \\n    # Tratando o /pix, redirecionando as requisições sempre para /webhook\\n    Alias \\\"/webhook/pix/\\\" \\\"/var/www/webhook/index.php\\\"\\n    Alias \\\"/webhook/pix\\\" \\\"/var/www/webhook/index.php\\\"\\n\\n    #\\n    # ...\\n    #\\n</VirtualHost>\\n</IfModule>\\n\",\n      \"language\": \"cplusplus\",\n      \"name\": \"Apache\"\n    },\n    {\n      \"code\": \"# ********************************************************************************** #\\n# Para o funcionamento deste exemplo é necessário que seu servidor tenha configurado #\\n# o certificado do mTLS, com o direcionamento para este arquivo, e também com a      #\\n# tratativa do /pix. Assim como é feito em nosso exemplo de servidores Apache.       #\\n# ********************************************************************************** #\\n\\n<?php\\n\\nfunction resposta($status, $mensagem, $dados)\\n{\\n    $resposta['status'] = $status;\\n    $resposta['mensagem'] = $mensagem;\\n    $resposta['dados'] = $dados;\\n    $json_resposta = '<pre>' . json_encode($resposta, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</pre>';\\n\\n    header(\\\"HTTP/1.1 \\\" . $status);\\n    echo $json_resposta;\\n}\\n\\nfunction salvar($dados)\\n{\\n  \\t// Crie um arquivo .;json para salvar as informações\\n    $nomeArquivo = './dados.json';\\n    $dadosGravados = json_decode(file_get_contents($nomeArquivo), true);\\n    $arquivo = fopen($nomeArquivo, 'w');\\n\\n    // Incrementa as informações enviadas com o que já havia gravado\\n    array_push($dadosGravados, $dados);\\n\\n    if (fwrite($arquivo, json_encode($dadosGravados))) {\\n        resposta(200, \\\"Requisição realizada com sucesso!\\\", $dados);\\n    } else {\\n        resposta(300, \\\"Falha ao salvar os dados da requisição.\\\", $dados);\\n    }\\n\\n    fclose($arquivo);\\n}\\n\\nfunction requisicao($metodo, $body, $parametros)\\n{\\n    switch ($metodo) {\\n        case 'POST':\\n            salvar($body);\\n            break;\\n        case 'GET':\\n            resposta(200, \\\"Requisição realizada com sucesso!\\\", $body);\\n            break;\\n    }\\n}\\n\\n// Obtém o método HTTP, body e parâmetros da requisição\\n$metodo = $_SERVER['REQUEST_METHOD'];\\n$parametros = explode('/', trim($_SERVER['REQUEST_URI'], '/'));\\n$body = json_decode(file_get_contents('php://input'), true);\\n\\ntry {\\n    requisicao($metodo, $body, $parametros);\\n} catch (Exception $e) {\\n    resposta(400, $e->getMessage(), $e);\\n}\",\n      \"language\": \"php\",\n      \"name\": \"PHP\"\n    }\n  ]\n}\n[/block]\nPara ter um ter um SSL válido, você deve entrar em contato com uma Autoridade Certificadora e gerar a chave privada  `server_ssl.key.pem` e uma pública `server_ssl.crt.pem`, assim você valida a integridade da conexão. Você consegue realizar isso de forma gratuita utilizando um utilitário como o <a href=\"https://certbot.eff.org/\" target=\"_blank\">Certbot</a> por exemplo.\n\n<br>\n\n\n### Configurar o webhook\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method post\\\">POST</span>\\n    <span class=\\\"endpoint\\\">/cadastro/webhook</span>\\n</div>\"\n}\n[/block]\nConfigura webhook para a API Abertura de Contas.\n\n**Requer autorização para o escopo**: **`gn.registration.webhook.write`** \n\n#### Requisição\n\nDados para a configuração do webhook.\n\n\n\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n  \\\"webhookUrl\\\": \\\"https://gerencianet.com.br/meu-webhook\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"Adicionar Webhook\"\n    },\n    {\n      \"code\": \"{\\n  \\\"url\\\": \\\"https://gerencianet.com.br/meu-webhook\\\",\\n  \\\"chave\\\": \\\"92ecc0a8-9631-4601-a188-feacf8288c13\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"Editar Webhook\"\n    }\n  ]\n}\n[/block]\n<div class=\"tab2\">(*) Atributo obrigatório </div>\n[block:parameters]\n{\n  \"data\": {\n    \"0-0\": \"<b>webhookUrl</b>\",\n    \"h-0\": \"Atributo\",\n    \"h-1\": \"Descrição\",\n    \"h-2\": \"Obrigatório\",\n    \"h-3\": \"Tipo\",\n    \"0-2\": \"Sim\",\n    \"0-1\": \"Url para onde a notificação vai ser enviada\",\n    \"0-3\": \"String\\nexample: `https://gerencianet.com.br/meu-webhook`\",\n    \"1-0\": \"<b>identificadorWebhook</b>\",\n    \"1-1\": \"Chave identificadora do webhook\",\n    \"1-2\": \"Não\",\n    \"1-3\": \"String\\nexample: 92ecc0a8-9631-4601-a188-feacf8288c13\"\n  },\n  \"cols\": 4,\n  \"rows\": 2\n}\n[/block]\n#### Respostas\n\nAs respostas abaixo representam Sucesso(200) e Falhas/erros do consumo.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n  \\\"identificadorWebhook\\\": \\\"92ecc0a8-9631-4601-a188-feacf8288c13\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"200(Success)\"\n    },\n    {\n      \"code\": \"URL inválido\\n{\\n  \\\"nome\\\": \\\"url_webhook\\\",\\n  \\\"mensagem\\\": \\\"A URL informada para webhook é inválida.\\\"\\n}\\n\\nOu\\n\\nProtocolo inválido\\n{\\n  \\\"nome\\\": \\\"protocolo_da_url\\\",\\n  \\\"mensagem\\\": \\\"A URL do webhook deve usar o protocolo HTTPS.\\\"\\n}\\n\\nOu\\n\\nmTLS não configurado\\n\\n{\\n  \\\"nome\\\": \\\"mtls_nao_configurado\\\",\\n  \\\"mensagem\\\": \\\"A autenticação TLS mútua não está configurada no URL fornecido.\\\"\\n}\\n\\nOu\\n\\nURL inacessível\\n\\n{\\n  \\\"nome\\\": \\\"url_inacessivel\\\",\\n  \\\"mensagem\\\": \\\"A URL informada está inacessível.\\\"\\n}\\n\\nOu\\n\\nURL timeout\\n\\n{\\n  \\\"nome\\\": \\\"limite_de_tempo_atingido_para_url\\\",\\n  \\\"mensagem\\\": \\\"A URL informada atingiu o tempo limite de resposta.\\\"\\n}\\n\\nOu\\n\\nURL falhou com erro\\n\\n{\\n  \\\"nome\\\": \\\"url_falhou_com_erro\\\",\\n  \\\"mensagem\\\": \\\"A requisição na URL informada falhou com o erro.\\\"\\n}\\n\\nOu\\n\\nProtocolo não HTTPS\\n\\n{\\n  \\\"nome\\\": \\\"protocolo_da_url\\\",\\n  \\\"mensagem\\\": \\\"A URL do webhook deve usar o protocolo HTTPS.\\\"\\n}\\n\\nOu\\n\\nURL responde HTTP\\n\\n{\\n  \\\"nome\\\": \\\"erro_de_codigo\\\",\\n  \\\"mensagem\\\": \\\"A URL informada respondeu com o código HTTP.\\\"\\n}\\n\\nOu\\n\\nURL não responde\\n\\n{\\n  \\\"nome\\\": \\\"url_informada_nao_existe\\\",\\n  \\\"mensagem\\\": \\\"Não foi possível receber uma resposta da URL informada.\\\"\\n}\\n\\nOu\\n\\nWebhook não encontrado\\n\\n{\\n  \\\"nome\\\": \\\"chave_invalida\\\",\\n  \\\"mensagem\\\": \\\"Não foi possível encontrar um webhook com a chave informada.\\\"\\n}\\n\\nOu\\n\\nURL cadastrada\\n\\n{\\n  \\\"nome\\\": \\\"url_cadastrada\\\",\\n  \\\"mensagem\\\": \\\"A URL já foi cadastrada.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"400(Bad request)\"\n    },\n    {\n      \"code\": \"Este erro ocorre na seguinte situação:\\n\\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.\",\n      \"language\": \"json\",\n      \"name\": \"401(Unauthorized)\"\n    },\n    {\n      \"code\": \"{\\n  \\\"nome\\\": \\\"erro_aplicacao\\\",\\n  \\\"mensagem\\\": \\\"Ocorreu um erro na aplicação.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"500(Error)\"\n    }\n  ]\n}\n[/block]\n### Detalhar webhook\n\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method get\\\">GET</span>\\n    <span class=\\\"endpoint\\\">/cadastro/webhook/<span class=\\\"variable\\\">:identificadorWebhook</span></span>\\n</div>\"\n}\n[/block]\nDetalha webhook configurado para a API Abertura de Contas.\n\n**Requer autorização para o escopo**: **`gn.registration.webhook.read`** \n\n#### Requisição\n\nA requisição enviada para esse endpoint não precisa de um *body*, apenas os cabeçalhos de autorização, OAuth, parâmetro e o certificado da conta.\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Atributo\",\n    \"h-1\": \"Descrição\",\n    \"h-2\": \"Obrigatório\",\n    \"h-3\": \"Tipo\",\n    \"0-0\": \"<b>identificadorWebhook</b>\",\n    \"0-1\": \"Chave associada ao webhook\",\n    \"0-2\": \"Sim\",\n    \"0-3\": \"String\\nexample: 92ecc0a8-9631-4601-a188-feacf8288c13\"\n  },\n  \"cols\": 4,\n  \"rows\": 1\n}\n[/block]\n#### Respostas\n\nAs respostas abaixo representam Sucesso(200) e Falhas/erros do consumo.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n  \\\"webhookUrl\\\": \\\"https://gerencianet.com.br/meu-webhook\\\",\\n  \\\"identificadorWebhook\\\": \\\"92ecc0a8-9631-4601-a188-feacf8288c13\\\",\\n  \\\"criacao\\\": \\\"2021-10-26T11:23:35.000Z\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"200(Success)\"\n    },\n    {\n      \"code\": \"{\\n  \\\"nome\\\": \\\"identificador_webhook\\\",\\n  \\\"mensagem\\\": \\\"Não foi possível encontrar um webhook com o identificador webhook informado.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"400(Bad request)\"\n    },\n    {\n      \"code\": \"Unauthorized. Este erro ocorre na seguinte situação:\\n\\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.\",\n      \"language\": \"json\",\n      \"name\": \"401(Unauthorized)\"\n    },\n    {\n      \"code\": \"{\\n  \\\"nome\\\": \\\"erro_aplicacao\\\",\\n  \\\"mensagem\\\": \\\"Ocorreu um erro na aplicação.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"500(Error)\"\n    }\n  ]\n}\n[/block]\n### Cancelar webhook\n\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method delete\\\">DELETE</span>\\n    <span class=\\\"endpoint\\\">/cadastro/webhook/<span class=\\\"variable\\\">:identificadorWebhook</span></span>\\n</div>\"\n}\n[/block]\nCancela webhook configurado para a API Abertura de Contas.\n\n**Requer autorização para o escopo**: **`gn.registration.webhook.write`** \n\n#### Requisição\n\nA requisição enviada para esse endpoint não precisa de um *body*, apenas os cabeçalhos de autorização, OAuth, parâmetro e o certificado da conta.\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Atributo\",\n    \"h-1\": \"Descrição\",\n    \"h-2\": \"Obrigatório\",\n    \"h-3\": \"Tipo\",\n    \"0-0\": \"<b>identificadorWebhook</b>\",\n    \"0-1\": \"Chave associada ao webhook\",\n    \"0-2\": \"Sim\",\n    \"0-3\": \"String\\nexample: 92ecc0a8-9631-4601-a188-feacf8288c13\"\n  },\n  \"cols\": 4,\n  \"rows\": 1\n}\n[/block]\n#### Respostas\n\nAs respostas abaixo representam Sucesso(204) e Falhas/erros do consumo.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"No content \\n* Webhook configurado para cadastro foi cancelado.\",\n      \"language\": \"json\",\n      \"name\": \"204(Success)\"\n    },\n    {\n      \"code\": \"{\\n  \\\"nome\\\": \\\"identificador_webhook\\\",\\n  \\\"mensagem\\\": \\\"Não foi possível encontrar um webhook com o identificador webhook informado.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"400(Bad request)\"\n    },\n    {\n      \"code\": \"Unauthorized. Este erro ocorre na seguinte situação:\\n\\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.\",\n      \"language\": \"json\",\n      \"name\": \"401(Unauthorized)\"\n    },\n    {\n      \"code\": \"{\\n  \\\"nome\\\": \\\"erro_aplicacao\\\",\\n  \\\"mensagem\\\": \\\"Ocorreu um erro na aplicação.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"500(Error)\"\n    }\n  ]\n}\n[/block]\n\n### Listar webhooks\n\n[block:html]\n{\n  \"html\": \"<div class=\\\"gn-endpoint\\\">\\n    <span class=\\\"http-method get\\\">GET</span>\\n    <span class=\\\"endpoint\\\">/cadastro/webhooks</span>\\n</div>\"\n}\n[/block]\nLista webhooks configurados para a API Abertura de Contas.\n\n**Requer autorização para o escopo**: **`gn.registration.webhook.read`** \n\n#### Requisição\n\nA requisição enviada para esse endpoint não precisa de um *body*, apenas os cabeçalhos de autorização OAuth, parâmetros e o certificado da conta.\n\n\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Atributo\",\n    \"h-1\": \"Descrição\",\n    \"h-2\": \"Obrigatório\",\n    \"h-3\": \"Tipo\",\n    \"0-0\": \"<b>inicio</b>\",\n    \"1-0\": \"<b>fim</b>\",\n    \"2-0\": \"<b>paginacao.paginaAtual</b>\",\n    \"3-0\": \"<b>paginacao.itensPorPagina</b>\",\n    \"0-1\": \"Data inicial para listagem.\",\n    \"0-2\": \"Sim\",\n    \"0-3\": \"string($datetime)\\nExample : \\n2020-04-01T00:00:00.000Z\",\n    \"1-2\": \"Sim\",\n    \"1-1\": \"Data final para listagem.\",\n    \"1-3\": \"string($datetime)\\nExample : \\n2022-10-29T00:00:00.000Z\",\n    \"2-1\": \"Pagina atual listada.\",\n    \"3-1\": \"Quantidade listada por página.\",\n    \"2-2\": \"Não\",\n    \"3-2\": \"Não\",\n    \"2-3\": \"Integer\\nExample : 0\",\n    \"3-3\": \"String\\nExample : 10\"\n  },\n  \"cols\": 4,\n  \"rows\": 4\n}\n[/block]\n#### Respostas\n\nAs respostas abaixo representam Sucesso(200) e Falhas/erros do consumo.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"Success\\n{\\n  \\\"parametros\\\": {\\n    \\\"inicio\\\": \\\"2020-04-01T00:00:00.000Z\\\",\\n    \\\"fim\\\": \\\"2020-04-01T23:59:59.000Z\\\",\\n    \\\"paginacao\\\": {\\n      \\\"paginaAtual\\\": 0,\\n      \\\"itensPorPagina\\\": 100,\\n      \\\"quantidadeDePaginas\\\": 1,\\n      \\\"quantidadeTotalDeItens\\\": 1\\n    }\\n  },\\n  \\\"webhooks\\\": [\\n    {\\n      \\\"webhookUrl\\\": \\\"https://gerencianet.com.br/meu-webhook\\\",\\n      \\\"identificadorWebhook\\\": \\\"92ecc0a8-9631-4601-a188-feacf8288c13\\\",\\n      \\\"criacao\\\": \\\"2021-10-26T11:23:35.000Z\\\"\\n    }\\n  ]\\n}\",\n      \"language\": \"json\",\n      \"name\": \"200(Success)\"\n    },\n    {\n      \"code\": \"{\\n  \\\"nome\\\": \\\"data_invalida\\\",\\n  \\\"mensagem\\\": \\\"Campo de data fim deve ser maior ou igual ao campo de data inicio.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"400(Bad request)\"\n    },\n    {\n      \"code\": \"Unauthorized. Este erro ocorre na seguinte situação:\\n\\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.\",\n      \"language\": \"json\",\n      \"name\": \"401(Unauthorized)\"\n    },\n    {\n      \"code\": \"{\\n  \\\"nome\\\": \\\"erro_aplicacao\\\",\\n  \\\"mensagem\\\": \\\"Ocorreu um erro na aplicação.\\\"\\n}\",\n      \"language\": \"json\",\n      \"name\": \"500(Error)\"\n    }\n  ]\n}\n[/block]","updates":[],"order":1,"isReference":false,"hidden":false,"sync_unique":"","link_url":"","link_external":false,"_id":"61473399546c3300799bbab5","createdAt":"2021-09-19T12:56:57.596Z","user":"5e8b36bc27ee9b00181b36bf","category":{"sync":{"isSync":false,"url":""},"pages":[],"title":"API Abertura Contas","slug":"gn-cadastro-api","order":2,"from_sync":false,"reference":false,"_id":"61473375119247002a9c14d7","createdAt":"2021-09-19T12:56:21.578Z","version":"606f2ca7c5ba9100787834c6","project":"575aeffae12cf20e002f306c","__v":0},"version":{"version":"1.1.0","version_clean":"1.1.0","codename":"2021","is_stable":true,"is_beta":false,"is_hidden":false,"is_deprecated":false,"categories":["606f2ca6c5ba91007878342b","575af039a083950e004487f7","575af5c7ba4ed70e000ca288","606f2ca6c5ba91007878342c","606f2ca6c5ba91007878342d","606f2ca6c5ba91007878342e","606f2ca6c5ba91007878342f","5761a63d207db7170022fc14","5761b9a2b65324200072d79e","576832939f0bf4190014ffdf","576832c09f0bf4190014ffe1","576832cba151c10e004316f0","576832d5bb15f40e00a288ec","576832e107b1f30e0039c645","606f2ca6c5ba910078783430","606f2ca6c5ba910078783431","5783f78c5cbce30e0074e2b7","606f2ca6c5ba910078783432","606f2ca6c5ba910078783433","606f2ca6c5ba910078783434","606f2ca6c5ba910078783435","606f2ca6c5ba910078783436","606f2ca6c5ba910078783437","578529f887c9280e0090394b","606f2ca6c5ba910078783438","606f2ca6c5ba910078783439","606f2ca6c5ba91007878343a","606f2ca6c5ba91007878343b","606f2ca6c5ba91007878343c","606f2ca6c5ba91007878343d","606f2ca6c5ba91007878343e","606f2ca6c5ba91007878343f","606f2ca6c5ba910078783440","606f2ca6c5ba910078783441","60d61f026ddc3901a32ee5f1","60ec37c637005f015e54174e","61473375119247002a9c14d7","6283a3819575c60045513ea2"],"_id":"606f2ca7c5ba9100787834c6","project":"575aeffae12cf20e002f306c","createdAt":"2016-06-10T16:51:06.080Z","releaseDate":"2016-06-10T16:51:06.080Z","__v":4,"forked_from":"575aeffae12cf20e002f306f"},"project":"575aeffae12cf20e002f306c","__v":0,"parentDoc":null}

Endpoints

Informações de todos os endpoints disponíveis na API de Abertura de Contas da Gerencianet

Nesta página você encontra todos os endpoints disponíveis na API Abertura de Contas da Gerencianet e informações de como utilizá-los corretamente, como por exemplo os escopos necessários para o consumo de cada rota e os detalhes de retorno dos mesmos. Utilize o sumário abaixo para navegar rapidamente entre os grupos de endpoints da API. **Sumário** 1. [Cadastro Simplificado](#section-cadastro-simplificado) 1.1 [Solicitar abertura de conta simplificada](#section-solicitar-abertura-de-conta-simplificada-) 1.2 [Recuperar credenciais de uma conta simplificada](#section-recuperar-credenciais-de-uma-conta-simplificada-) 1.3 [Recuperar certificado de uma conta simplificada](#section-recuperar-certificado-de-uma-conta-simplificada-) 2. [Webhook](#section-webhook) 2.1 [Configurar webhook](#section-configurar-o-webhook) 2.2 [Detalhar webhook](#section-detalhar-webhook) 2.3 [Cancelar webhook](#section-cancelar-webhook) 2.4 [Listar webhooks](#section-listar-webhooks) ## Tutorial API de Abertura de Contas da Gerencianet [block:html] { "html": "<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/uW78tu1xnSQ\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>" } [/block] ## Obter Autorização [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method post\">POST</span>\n \t<span class=\"endpoint\">\n /oauth/token\n </span>\n</div>" } [/block] Este endpoint é utilizado para autorizar as credenciais de uma aplicação e obter os escopos que a aplicação possui para acessar os outros endpoints da API. É necessário que o certificado P12/PEM esteja presente na requisição de autorização a fim de que o *handshake* com o servidor da API seja permitido. ### Exemplos de autorização utilizando o certificado .P12 Para a utilização da API Abertura de Contas da Gerencianet é necessário que o cliente e o servidor se comuniquem em uma conexão verificada um com o outro. A verificação é feita pelo certificado bidirecional (.PEM ou .P12), isto é, o servidor e o cliente implementaram um certificado de chave privada e um certificado de chave pública que permite que um possa assegurar-se da identidade do outro. Por isso para fazer qualquer requisição HTTP à API Abertura de Contas da Gerencianet, incluindo a requisição de autorização junto ao OAuth2, é necessário que o certificado .P12, ou .PEM, esteja presente nos cabeçalhos da requisição. Abaixo, trazemos exemplos de como consumir a autorização da API Abertura de Contas da Gerencianet, incorporando esse certificado na requisição. [block:code] { "codes": [ { "code": "<?php //Desenvolvido pela Consultoria Técnica da Gerencianet\n\n$config = [\n \"certificado\" => \"./certificado.pem\",\n \"client_id\" => \"YOUR-CLIENT-ID\",\n \"client_secret\" => \"YOUR-CLIENT-SECRET\"\n];\n$autorizacao = base64_encode($config[\"client_id\"] . \":\" . $config[\"client_secret\"]);\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, array(\n CURLOPT_URL => \"https://apis.gerencianet.com.br/oauth/token\", // Rota base, homologação ou produção\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_ENCODING => \"\",\n CURLOPT_MAXREDIRS => 10,\n CURLOPT_TIMEOUT => 0,\n CURLOPT_FOLLOWLOCATION => true,\n CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n CURLOPT_CUSTOMREQUEST => \"POST\",\n CURLOPT_POSTFIELDS => '{\"grant_type\": \"client_credentials\"}',\n CURLOPT_SSLCERT => $config[\"certificado\"], // Caminho do certificado\n CURLOPT_SSLCERTPASSWD => \"\",\n CURLOPT_HTTPHEADER => array(\n \"Authorization: Basic $autorizacao\",\n \"Content-Type: application/json\"\n ),\n));\n\n$response = curl_exec($curl);\n\ncurl_close($curl);\n\necho \"<pre>\";\necho $response;\necho \"</pre>\";", "language": "php" }, { "code": "//Desenvolvido pela Consultoria Técnica da Gerencianet\n\n\"use strict\";\nconst https = require(\"https\");\nvar axios = require(\"axios\");\nvar fs = require(\"fs\");\n\n//Insira o caminho de seu certificado .p12 dentro de seu projeto\nvar certificado = fs.readFileSync(\"./certificado.p12\");\n\n//Insira os valores de suas credenciais em desenvolvimento do pix\nvar credenciais = {\n client_id: \"YOUR-CLIENT-ID\",\n client_secret: \"YOUR-CLIENT-SECRET\",\n};\n\nvar data = JSON.stringify({ grant_type: \"client_credentials\" });\nvar data_credentials = credenciais.client_id + \":\" + credenciais.client_secret;\n\n// Codificando as credenciais em base64\nvar auth = Buffer.from(data_credentials).toString(\"base64\");\n\nconst agent = new https.Agent({\n pfx: certificado,\n passphrase: \"\",\n});\n//Consumo em desenvolvimento da rota post oauth/token\nvar config = {\n method: \"POST\",\n url: \"https://apis.gerencianet.com.br/oauth/token\",\n headers: {\n Authorization: \"Basic \" + auth,\n \"Content-Type\": \"application/json\",\n },\n httpsAgent: agent,\n data: data,\n};\n\naxios(config)\n .then(function (response) {\n console.log(JSON.stringify(response.data));\n })\n .catch(function (error) {\n console.log(error);\n });", "language": "javascript", "name": "Node" }, { "code": "#Desenvolvido pela Consultoria Técnica da Gerencianet\n\nimport requests\nimport base64\n\ncredentials = {\n \"client_id\": \"YOUR-CLIENT-ID\",\n \"client_secret\": \"YOUR-CLIENT-SECRET\",\n}\n\ncertificado = './certificado.pem' # A variável certificado é o diretório em que seu certificado em formato .pem deve ser inserido\n\nauth = base64.b64encode(\n (f\"{credentials['client_id']}:{credentials['client_secret']}\"\n ).encode()).decode()\n\nurl = \"https://apis.gerencianet.com.br/oauth/token\" #Para ambiente de Desenvolvimento\n\npayload=\"{\\r\\n \\\"grant_type\\\": \\\"client_credentials\\\"\\r\\n}\"\nheaders = {\n 'Authorization': f\"Basic {auth}\",\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\",\n url,\n headers=headers,\n data=payload,\n cert=certificado)\n\nprint(response.text)", "language": "python", "name": "Python" }, { "code": "//Desenvolvido pela Consultoria Técnica da Gerencianet\n\nusing System;\nusing System.Security.Cryptography.X509Certificates;\nusing System.Collections.Generic;\nusing RestSharp;\n\nnamespace PixGerencianet\n{\n class Authorize\n {\n public static string Base64Encode(string plainText)\n {\n var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);\n return System.Convert.ToBase64String(plainTextBytes);\n }\n\n static void Main(string[] args)\n {\n\n var credencials = new Dictionary<string, string>{\n {\"client_id\", \"YOUR-CLIENT-ID\"},\n {\"client_secret\", \"YOUR-CLIENT-SECRET\"}\n };\n var authorization = Base64Encode(credencials[\"client_id\"] + \":\" + credencials[\"client_secret\"]);\n var client = new RestSharp.RestClient(\"https://apis.gerencianet.com.br/oauth/token\");\n var request = new RestRequest(Method.POST);\n\n X509Certificate2 uidCert = new X509Certificate2(\"./certificado.p12\", \"\");\n client.ClientCertificates = new X509CertificateCollection() { uidCert };\n\n request.AddHeader(\"Authorization\", \"Basic \" + authorization);\n request.AddHeader(\"Content-Type\", \"application/json\");\n request.AddParameter(\"application/json\", \"{\\r\\n \\\"grant_type\\\": \\\"client_credentials\\\"\\r\\n}\", ParameterType.RequestBody);\n \n IRestResponse restResponse = client.Execute(request);\n string response = restResponse.Content;\n\n Console.WriteLine(response);\n }\n }\n}", "language": "csharp" }, { "code": "#Desenvolvido pela Consultoria Técnica da Gerencianet\n\nrequire \"uri\"\nrequire \"net/http\"\nrequire \"openssl\"\n\nclient_id = \"YOUR-CLIENT-ID\";\nclient_secret = \"YOUR-CLIENT-SECRET\";\n\ncertfile = File.read(\"certificado.pem\") # A variável certfile é o diretório em que seu certificado em formato .pem deve ser inserido\n\nurl = URI(\"https://apis.gerencianet.com.br/oauth/token\") #Para ambiente de Desenvolvimento\n\nhttps = Net::HTTP.new(url.host, url.port);\nhttps.use_ssl = true\nhttps.cert = OpenSSL::X509::Certificate.new(certfile)\nhttps.key = OpenSSL::PKey::RSA.new(certfile)\n\nrequest = Net::HTTP::Post.new(url)\nrequest.basic_auth(client_id, client_secret)\nrequest[\"Content-Type\"] = \"application/json\"\nrequest.body = \"{\\r\\n \\\"grant_type\\\": \\\"client_credentials\\\"\\r\\n}\"\n\nresponse = https.request(request)\nputs response.read_body", "language": "ruby" }, { "code": "//Desenvolvido pela Consultoria Técnica da Gerencianet\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.io.OutputStream;\nimport java.net.URL;\nimport java.util.Base64;\n\nimport javax.net.ssl.HttpsURLConnection;\nimport javax.net.ssl.SSLSocketFactory;\n\npublic class Auth {\n public static void main(String[] args) throws Exception {\n String client_id = \"YOUR-CLIENT-ID\";\n String client_secret = \"YOUR-CLIENT-SECRET\";;\n String basicAuth = Base64.getEncoder().encodeToString(((client_id+':'+client_secret).getBytes()));\n \n \t//Diretório em que seu certificado em formato .p12 deve ser inserido\n System.setProperty(\"javax.net.ssl.keyStore\", \"certificado.p12\"); \n SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();\n \n URL url = new URL (\"https://apis.gerencianet.com.br/oauth/token\"); //Para ambiente de Desenvolvimento \n HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();\n conn.setDoOutput(true);\n conn.setRequestMethod(\"POST\");\n conn.setRequestProperty(\"Content-Type\", \"application/json\");\n conn.setRequestProperty(\"Authorization\", \"Basic \"+ basicAuth);\n conn.setSSLSocketFactory(sslsocketfactory);\n String input = \"{\\\"grant_type\\\": \\\"client_credentials\\\"}\";\n \n OutputStream os = conn.getOutputStream();\n os.write(input.getBytes());\n os.flush();\t\t\n\n InputStreamReader reader = new InputStreamReader(conn.getInputStream());\n BufferedReader br = new BufferedReader(reader);\n\n String response;\n while ((response = br.readLine()) != null) {\n System.out.println(response);\n }\n conn.disconnect();\n\n }\n}", "language": "java" }, { "code": "//Desenvolvido pela Consultoria Técnica da Gerencianet\npackage main\n\nimport (\n \"fmt\"\n \"strings\"\n \"net/http\"\n \"io/ioutil\"\n \"crypto/tls\"\n)\n\nconst(\n client_id = \"YOUR-CLIENT-ID\"\n client_secret = \"YOUR-CLIENT-SECRET\"\n)\n\nfunc main() {\n\n url := \"https://apis.gerencianet.com.br/oauth/token\"// Rota base, homologação ou produção\n method := \"POST\"\n\n payload := strings.NewReader(`{\"grant_type\": \"client_credentials\"}`)\n\n\n cert, _ := tls.LoadX509KeyPair(\"CA.crt.pem\", \"KEY.crt.pem\")// Seu certificado e chave privada gerada a partir dos comandos de conversão OpenSSL\n\n client := &http.Client{\n Transport: &http.Transport{\n TLSClientConfig: &tls.Config{\n Certificates: []tls.Certificate{cert},\n },\n },\n}\n\n req, err := http.NewRequest(method, url, payload)\n\n if err != nil {\n fmt.Println(err)\n return\n }\n req.SetBasicAuth(client_id, client_secret)\n req.Header.Add(\"Content-Type\", \"application/json\")\n\n res, err := client.Do(req)\n if err != nil {\n fmt.Println(err)\n return\n }\n defer res.Body.Close()\n\n body, err := ioutil.ReadAll(res.Body)\n if err != nil {\n fmt.Println(err)\n return\n }\n fmt.Println(string(body))\n}", "language": "go" } ] } [/block] #### Exemplo de resposta da autorização O trecho de código abaixo representa um exemplo de resposta do OAuth à sua requisição de autorização. [block:code] { "codes": [ { "code": "{\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\",\n \"token_type\": \"Bearer\",\n \"expires_in\": 3600,\n \"scope\": \"gn.registration.write gn.registration.read gn.registration.webhook.write gn.registration.webhook.read\"\n}", "language": "json", "name": "Resposta" } ] } [/block] <br> ## Rota base Rota base ou URL's base para ambientes, utilize a rota abaixo para realizar a comunicação da sua aplicação com o ambiente de produção oferecido pela Gerencianet. [block:parameters] { "data": { "0-0": "**Produção**", "0-1": "`https://apis.gerencianet.com.br/`" }, "cols": 2, "rows": 1 } [/block] <br> ## Cadastro Simplificado ### Solicitar abertura de conta simplificada. [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method post\">POST</span>\n <span class=\"endpoint\">/cadastro/conta-simplificada</span>\n</div>" } [/block] Solicita abertura de conta simplificada para integração. Os dados de entrada são dados referentes ao cliente final. Caso os dados de entrada sejam válidos, o cliente final receberá um link no qual poderá autorizar integração à uma conta Gerencianet. **Requer autorização para o escopo:** **`gn.registration.write`** [block:callout] { "type": "info", "title": "Criação de conta/aplicação", "body": "Caso o seu cliente final já tenha uma conta na Gerencianet, duas opções vão aparecer para ele:\n* Criar uma aplicação na conta atual, onde você terá acesso às credenciais e definirá os escopos.\n* Criar uma conta secundária para o cliente final com as configurações/acessos definidos em sua requisição." } [/block] [block:callout] { "type": "warning", "title": "Negação da abertura de conta", "body": "Caso o seu cliente recuse o processo de abertura de conta, será necessário esperar 2 dias corridos até poder iniciar um novo processo. \nObs: Não é retornado a informação caso o cliente negue o processo de abertura." } [/block] #### Requisição [block:code] { "codes": [ { "code": "{\n \"clienteFinal\": {\n \"cpf\": \"12345678900\",\n \"nomeCompleto\": \"Nome Exemplo\",\n \"dataNascimento\": \"13/08/2000\",\n \"nomeMae\": \"Exemplo de nome da mãe\",\n \"celular\": \"31987654321\",\n \"email\": \"[email protected]\",\n \"endereco\": {\n \"cep\": \"35400000\",\n \"estado\": \"MG\",\n \"cidade\": \"Ouro Preto\",\n \"bairro\": \"Bairro exemplo\",\n \"logradouro\": \"Exemplo do nome da rua\",\n \"numero\": \"777\",\n \"complemento\": \"apto 101\"\n }\n },\n \"meioDeNotificacao\": [\n \"sms\",\n \"whatsapp\"\n ],\n \"escoposIntegrados\": [\n \"charge.write\",\n \"pix.send\"\n ]\n}", "language": "json", "name": "Cliente final pessoa física" }, { "code": "{\n \"clienteFinal\": {\n \"cpf\": \"12345678900\",\n \"nomeCompleto\": \"Nome Exemplo\",\n \"dataNascimento\": \"13/08/2000\",\n \"nomeMae\": \"Exemplo de nome da mãe\",\n \"celular\": \"31987654321\",\n \"email\": \"[email protected]\",\n \"cnpj\": \"12345678901000\",\n \"razaoSocial\": \"Ongan Comércio LTDA\",\n \"endereco\": {\n \"cep\": \"35400000\",\n \"estado\": \"MG\",\n \"cidade\": \"Ouro Preto\",\n \"bairro\": \"Bairro exemplo\",\n \"logradouro\": \"Exemplo do nome da rua\",\n \"numero\": \"777\",\n \"complemento\": \"apto 101\"\n }\n },\n \"meioDeNotificacao\": [\n \"whatsapp\"\n ],\n \"escoposIntegrados\": [\n \"pix.write\",\n \"pix.read\",\n \"pix.send\"\n ]\n}", "language": "json", "name": "Cliente final pessoa jurídica" } ] } [/block] Dados que podem ser utilizados na requisição de abertura de conta simplificada. <div class="tab2">(*) Atributo obrigatório</div> [block:parameters] { "data": { "h-0": "Atributo", "h-1": "Descrição", "h-2": "Obrigatório", "h-3": "Tipo", "0-2": "Sim", "1-2": "Sim", "2-2": "Sim", "1-3": "String", "2-3": "String", "0-3": "Object", "0-0": "**clienteFinal**", "1-0": "**meioDeNotificacao**", "2-0": "**escoposIntegrados**", "0-1": "Os campos aninhados sob o identificador **clienteFinal** organizam informações a respeito de dados do cliente final ao qual vai se gerar a conta.\n\nclienteFinal:\n<div class=\"tab2\">`cpf*`// CPF do cliente final pessoa física. (String)\n\n`nomeCompleto*`// Nome completo do cliente final pessoa física.\n(String)\n\n`dataNascimento*`// Data de nascimento do cliente final pessoa física.\n(String No formato:\n`DD/MM/AAAA`)\n\n`nomeMae`// Nome da mãe do cliente final pessoa física.\n(String)\n\n`celular*`// Celular do cliente final.\n(String)\n\n`email*`// E-mail do cliente final.\n(String)\n\n`cnpj`// CNPJ do cliente final pessoa jurídica.\n(String)\n\n`razaoSocial`// Razão social do cliente final pessoa jurídica.\n(String)\n\n<br>\n\n`endereco`: //Endereço do cliente final.\n(Object)\n\n<div class=\"tab2\">`cep*`// CEP do cliente final pessoa física.\n(String)\n\n`estado*`// Estado do cliente final pessoa física.\n(String)\n\nEnum: \n`AC, AL, AP, AM, BA, CE, DF, ES, GO, MA, MT, MS, MG,`\n\n` PA, PB, PR, PE, PI, RJ, RN, RS, RO, RR, SC, SP, SE, TO`\n\n`cidade*`// Cidade do cliente final pessoa física.\n(String)\n\n`bairro*`// Bairro do cliente final pessoa física.\n(String)\n\n`logradouro*`//Logradouro do cliente final pessoa física.\n(String)\n\n`numero*`//Número do cliente final pessoa física.\n(String)\n\n`complemento`//Complemento do cliente final pessoa física.\n(String)\n</div>\n</div>", "1-1": "Meio pelo qual o cliente final receberá notificação para aprovar a solicitação.\n\nEnum: `sms`, `whatsapp`", "2-1": "Escopos de serviços que o integrador deseja acessar na conta do cliente final. Não é possível solicitar escopos de serviços não configurados para a aplicação do integrador solicitante.\n\nEnum:\n `charge.write, cob.write, payloadlocation.write, payloadlocation.read,` \n\n`cob.read, pix.write, pix.read, pix.send, webhook.write, webhook.read, `\n\n`gn.balance.read, gn.pix.evp.write, gn.pix.evp.read, gn.settings.write,`\n\n\n` gn.settings.read, gn.barcode.read, gn.barcode.pay.write,gn.barcode.pay.read`" }, "cols": 4, "rows": 3 } [/block] #### Respostas As respostas abaixo representam Sucesso(200) e Falhas/erros do consumo. [block:code] { "codes": [ { "code": "{\n \"contaSimplificada\": {\n \"identificador\": \"92ccd29b-54c9-49fc-b8e8-717a3b373c5e\"\n }\n}", "language": "json", "name": "200(Success)" }, { "code": "CPF inválido\n{\n \"nome\": \"cpf_invalido\",\n \"mensagem\": \"O CPF é inválido.\"\n}\n\nOu\n\nNome completo inválido\n{\n \"nome\": \"nome_completo_invalido\",\n \"mensagem\": \"O nome completo não corresponde ao CPF do cliente final.\"\n}\n\nOu\n\nMenoridade\n\n{\n \"nome\": \"menoridade\",\n \"mensagem\": \"O cliente final é menor de idade.\"\n}\n\nOu\n\nData de nascimento inválida\n{\n \"nome\": \"data_nascimento_invalida\",\n \"mensagem\": \"A data de nascimento não corresponde ao CPF do cliente final.\"\n}\n\nOu\n\nNome da mãe inválido\n{\n \"nome\": \"nome_mae_invalido\",\n \"mensagem\": \"O nome da mãe não corresponde ao CPF do cliente final.\"\n}\n\nOu\n\nCelular inválido\n{\n \"nome\": \"celular_invalido\",\n \"mensagem\": \"O celular é inválido.\"\n}\n\nOu\n\nEmail inválido\n{\n \"nome\": \"email_invalido\",\n \"mensagem\": \"O email é inválido.\"\n}\n\nOu\n\nCEP inválido\n{\n \"nome\": \"cep_invalido\",\n \"mensagem\": \"O CEP é inválido.\"\n}\n\nOu\n\nCNPJ inválido\n{\n \"nome\": \"cnpj_invalido\",\n \"mensagem\": \"O CNPJ é inválido.\"\n}\n\nOu\n\nRazão social inválida\n{\n \"nome\": \"razao_social_invalida\",\n \"mensagem\": \"A razão social não corresponde ao CNPJ do cliente final.\"\n}\n\nOu\n\nNome completo inválido\n{\n \"nome\": \"nomeCompleto_invalido\",\n \"mensagem\": \"ClienteFinal deve ter a propriedade obrigatória nomeCompleto.\"\n}\n\nOu\n\nCPF inativo\n{\n \"nome\": \"cpf_inativo\",\n \"mensagem\": \"O CPF está em situação cadastral inativa.\"\n}\n\nOu\n\nCNPJ inativo\n{\n \"nome\": \"cnpj_inativo\",\n \"mensagem\": \"O CNPJ está em situação cadastral inativa.\"\n}", "language": "json", "name": "400(Bad request)" }, { "code": "Este erro ocorre nas seguintes situações:\n\n* Certificado ou credenciais não existem;\n* Certificado ou credenciais estão desativados;\n* Certificado e credenciais não estão vinculados a mesma conta Gerencianet;\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.", "language": "json", "name": "401(Unauthorized)" }, { "code": "Este erro ocorre nas seguintes situações:\n\n* Integrador solicita acesso a um escopo ao qual não tem permissão.", "language": "json", "name": "403(Forbidden)" }, { "code": "Celular cadastrado\n{\n \"nome\": \"celular_cadastrado\",\n \"mensagem\": \"O celular é utilizado por outro cliente.\"\n}\n\nOu\n\nEmail cadastrado\n\n{\n \"nome\": \"email_cadastrado\",\n \"mensagem\": \"O email é utilizado por outro cliente.\"\n}\n\nOu\n\nSolicitação duplicada\n{\n \"nome\": \"solicitacao_duplicada\",\n \"mensagem\": \"Já existe uma solicitação de abertura de conta aberta para este cliente final.\"\n}", "language": "json", "name": "409(Conflict)" }, { "code": "Precondition Failed. Este erro ocorre nas seguintes situações:\n\n* Integrador deve ter pelo menos um Webhook cadastrado.\n{\n \"nome\": \"webhook_nao_cadastrado\",\n \"mensagem\": \"Sua conta não possui webhook cadastrado na API de Cadastro.\"\n}", "language": "json", "name": "412(Precondition Failed)" }, { "code": "Erro na aplicação\n\n{\n \"nome\": \"erro_aplicacao\",\n \"mensagem\": \"Ocorreu um erro na aplicação.\"\n}", "language": "json", "name": "500(Error)" } ] } [/block] <br> ### Recuperar credenciais de uma conta simplificada. [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method get\">GET</span>\n <span class=\"endpoint\">/cadastro/conta-simplificada/<span class=\"variable\">:identificador</span>/credenciais</span>\n</div>" } [/block] Recupera as credenciais `Client_Id` e `Client_Secret` para integrar à uma conta simplificada. **Requer autorização para o escopo:** **`gn.registration.read`** #### Requisição [block:parameters] { "data": { "h-0": "Atributo", "h-1": "Descrição", "h-2": "Obrigatório", "0-2": "Sim", "h-3": "Tipo", "0-3": "String", "0-0": "**identificador**", "0-1": "Identificador da conta simplificada gerada." }, "cols": 4, "rows": 1 } [/block] #### Respostas As respostas abaixo representam Sucesso(200) e Falhas/erros do consumo. [block:code] { "codes": [ { "code": "{\n \"clientId\": \"92ccd29b-54c9-49fc-b8e8-717a3b373c5e\",\n \"clientSecret\": \"b2e9dcca-c46d-4b9b-89d2-c625949bea40\",\n \"conta\": {\n \"numero\": \"10000\"\n },\n \"escopos\": [\n \"pix.send\",\n \"cob.write\",\n \"webhook.read\"\n ],\n \"ativo\": true\n}", "language": "json", "name": "200(Success)" }, { "code": "Este erro ocorre nas seguintes situações:\n\n* Certificado ou credenciais não existem;\n* Certificado ou credenciais estão desativados;\n* Certificado e credenciais não estão vinculados a mesma conta Gerencianet;\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.", "language": "json", "name": "401(Unauthorized)" }, { "code": "Integrador tenta recuperar as credenciais de uma conta simplificada não criada por ele.", "language": "json", "name": "403(Forbidden)" }, { "code": "Precondition failed. Este erro ocorre nas seguintes situações:\n\n* A conta simplificada ainda não está pronta.\n* Credenciais da conta simplificada não existem.", "language": "json", "name": "412(Precondition Failed)" }, { "code": "Erro na aplicação\n{\n \"nome\": \"erro_aplicacao\",\n \"mensagem\": \"Ocorreu um erro na aplicação.\"\n}", "language": "json", "name": "500(Error)" } ] } [/block] <br> ### Recuperar certificado de uma conta simplificada. [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method get\">GET</span>\n <span class=\"endpoint\">/cadastro/conta-simplificada/<span class=\"variable\">:identificador</span>/certificado</span>\n</div>" } [/block] Recupera o certificado para integrar à uma conta simplificada. **Requer autorização para o escopo:** **`gn.registration.read`** #### Requisição [block:parameters] { "data": { "h-0": "Atributo", "h-1": "Descrição", "h-2": "Obrigatório", "h-3": "Tipo", "0-0": "**identificadorWebhook**", "0-1": "Identificador da conta simplificada gerada.", "0-2": "Sim", "0-3": "String" }, "cols": 4, "rows": 1 } [/block] #### Respostas As respostas abaixo representam Sucesso(200) e Falhas/erros do consumo. [block:code] { "codes": [ { "code": "\"string\"", "language": "json", "name": "200(Success)" }, { "code": "Este erro ocorre nas seguintes situações:\n\n* Certificado ou credenciais não existem;\n* Certificado ou credenciais estão desativados;\n* Certificado e credenciais não estão vinculados a mesma conta Gerencianet;\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint;", "language": "json", "name": "401(Unauthorized)" }, { "code": " Integrador tenta recuperar o certificado de uma conta simplificada não criada por ele.", "language": "json", "name": "403(Forbidden)" }, { "code": "Precondition failed. Este erro ocorre nas seguintes situações:\n\n* A conta simplificada ainda não está pronta.", "language": "json", "name": "412(Precondition Failed)" }, { "code": "Erro na aplicação\n\n{\n \"nome\": \"erro_aplicacao\",\n \"mensagem\": \"Ocorreu um erro na aplicação.\"\n}", "language": "json", "name": "500(Error)" } ] } [/block] ## Webhook Reúne endpoints para gerenciamento de notificações ao integrador. ### Entendendo o padrão mTLS Por norma do Banco Central, será necessário a inserção de uma chave pública da Gerencianet em seu servidor para que a comunicação obedeça o padrão mTLS. Em seu domínio que representa o seu servidor, deverá ser feita uma configuração para exigir a chave pública (mTLS) que estamos disponibilizando para que ocorra a autenticação mútua. A Gerencianet irá fazer 2 requisições para o seu domínio (servidor): 1. Primeira Requisição: Vamos certificar que seu servidor esteja exigindo uma chave pública da Gerencianet. Isso será feito ao enviar uma requisição sem certificado e seu servidor não deverá aceitar a requisição. Uma vez respondido com a recusa será enviado a 2º requisição. 2. Segunda Requisição: Enviaremos a notificação junto com a nossa chave pública, o seu servidor que deve conter a chave pública disponibilizada deverá realizar o "Hand-Shake" e assim a comunicação ser estabelecida. É necessário que o seu servidor tenha a versão mínima do TLS 1.2. Mais detalhes sobre o TLS [aqui](https://dev.gerencianet.com.br/docs/atualizacao-tls-12) Em seu servidor você deve configurar uma rota 'POST' com uma resposta padrão como uma string "200". Deve ser inserido o nosso certificado de produção ou homologação em seu servidor, abaixo temos alguns exemplos. [block:callout] { "type": "success", "title": "Servidores dedicados", "body": "Recomenda-se que você tenha um servidor dedicado para conseguir realizar as configurações do webhook, uma vez que é necessário ter acesso a alguns arquivos para realizar as configurações como nos exemplos abaixo." } [/block] [block:callout] { "type": "info", "title": "Hospedagens compartilhadas", "body": "Para hospedagem em servidores compartilhados pode haver restrições relativas a inserção de certificados gerados por outra entidade, como o nosso CA por exemplo. Caso tenha problemas, orientamos a [abertura de um ticket](https://sistema.gerencianet.com.br/tickets/criar) informando como assunto: **mTLS em hospedagem compartilhada** ou entre em contato pelo [nosso canal #api-abertura-contas no Discord](https://discord.gg/duNqYs24). Analisaremos a situação para atuarmos em conjunto em seu auxílio." } [/block] ### Exemplos de configurações de servidor Para configurar seu servidor, você precisará das chaves públicas da Gerencianet. Abaixo estão os endereços das chaves para os ambientes de Produção e Homologação. Essas chaves devem ser baixadas e dispostas em seu servidor. [block:parameters] { "data": { "h-0": "Ambiente", "h-1": "URL da chave pública", "0-0": "Produção", "0-1": "`https://pix.gerencianet.com.br/webhooks/chain-pix-prod.crt`", "1-0": "Homologação", "1-1": "`https://pix.gerencianet.com.br/webhooks/chain-pix-sandbox.crt`" }, "cols": 2, "rows": 2 } [/block] Os trechos de código abaixo buscam exemplificar as configurações necessárias em seu servidor para que seja possível realizar o *hand-shake* com nossos servidores. [block:code] { "codes": [ { "code": "from flask import Flask, jsonify\nimport ssl\nimport json\napp = Flask(__name__)\n\n\[email protected](\"/\")\ndef hello():\n return \"<h1 style='color:blue'>Hello There!</h1>\"\n\n\[email protected](\"/\", methods=[\"PUT\"])\ndef hello_put():\n response = {\"status\": 200}\n return jsonify(response)\n\n\[email protected](\"/\", methods=[\"POST\"])\ndef imprimir():\n imprime = print(request.json)\n data = request.json\n with open('data.txt', 'a') as outfile:\n outfile.write(\"\\n\")\n json.dump(data, outfile)\n return jsonify(imprime)\n\ndef hello_post():\n response = {\"status\": 200}\n return jsonify(response)\n\nif __name__ == \"__main__\":\n context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)\n context.verify_mode = ssl.CERT_REQUIRED\n context.load_verify_locations('caminho-certificados/certificado-público-Gerencianet.crt')\n context.load_cert_chain(\n 'caminho-certificados/server_ssl.crt.pem',\n 'caminho-certificados/server_ssl.key.pem')\n app.run(ssl_context=context, host='0.0.0.0')\n#Desenvolvido pela Consultoria Técnica da Gerencianet ", "language": "python", "name": "Python" }, { "code": "server {\n #\n # ...\n #\n listen [::]:443 ssl ipv6only=on;\n listen 443 ssl;\n ssl_certificate server_ssl.crt.pem;\n ssl_certificate_key server_ssl.key.pem;\n ssl_client_certificate /root/chain-pix-webhooks-prod.crt;\n ssl_verify_client optional;\n ssl_verify_depth 3;\n #\n # ...\n #\n location /webhook {\n if ($ssl_client_verify != SUCCESS) {\n return 403;\n }\n rewrite ^(.*)$ /webhook;\n }\n}\n#Desenvolvido pela Consultoria Técnica da Gerencianet", "language": "http", "name": "Nginx" }, { "code": "const express = require(\"express\");\nconst fs = require(\"fs\");\nconst https = require(\"https\");\nvar logger = require('morgan');\n\nconst httpsOptions = {\n cert: fs.readFileSync(\"\"), // Certificado fullchain do dominio\n key: fs.readFileSync(\"/\"), // Chave privada do domínio\n ca: fs.readFileSync(\"\"), // Certificado público da Gerencianet\n minVersion: \"TLSv1.2\",\n requestCert: true,\n rejectUnauthorized: false, //Mantenha como false para que os demais endpoints da API não rejeitem requisições sem MTLS\n};\n\nconst app = express();\nconst httpsServer = https.createServer(httpsOptions, app);\nconst PORT = 443;\n\napp.use(logger('dev')); // Comente essa linha caso não queira que seja exibido o log do servidor no seu console\napp.use(express.json());\napp.use(express.urlencoded({ extended: false }));\n\n// Endpoint para configuração do webhook, você precisa cadastrar https://SEUDOMINIO.com/webhook\napp.post(\"/webhook\", (request, response) => {\n // Verifica se a requisição que chegou nesse endpoint foi autorizada\n if (request.socket.authorized) { \n response.status(200).end();\n } else {\n response.status(401).end();\n }\n});\n\n// Endpoind para recepção do webhook tratando o /pix\napp.post(\"/webhook/pix\", (request, response) => {\n if (request.socket.authorized){\n //Seu código tratando a callback\n /* EXEMPLO:\n var body = request.body;\n filePath = __dirname + \"/data.json\";\n fs.appendFile(filePath, JSON.stringify(body) + \"\\n\", function (err) {\n if (err) {\n console.log(err);\n } else {\n response.status(200).end();\n }\n })*/\n response.status(200).end();\n }else{\n response.status(401).end();\n }\n});\n\nhttpsServer.listen(PORT, () =>\n console.log(`Express server currently running on port ${PORT}`)\n);\n#Desenvolvido pela Consultoria Técnica da Gerencianet", "language": "javascript", "name": "Node" }, { "code": "# ********************************************************************************* #\n# Utilize o primeiro exemplo, caso queira requerir o certificado para autenticação #\n# mútua em qualquer rota do domínio indicado no VirtualHost. #\n# Funciona bem para sub-domínios. Exemplo: https://www.webhook.seu_dominio.com.br # \n# ********************************************************************************* #\n\n<IfModule mod_ssl.c>\n<VirtualHost *:443> # Porta HTTPS\n #\n # ...\n #\n\n SSLCertificateFile /caminho_certificado/fullchain_ssl.pem #fullchain associado ao seu certificado SSL do domínio\n SSLCertificateKeyFile /caminho_certificado/privkey_ssl.pem #privkey associada ao seu certificado SSL do domínio\n\n # mTLS Gerencianet\n SSLCACertificateFile /caminho_certificado/chain-pix-prod.crt #Chave pública da Gerencianet\n SSLVerifyClient require\n SSLVerifyDepth 3\n \n # Tratando o /pix, redirecionando as requisições sempre para /webhook\n Alias \"/pix/\" \"/var/www/webhook/index.php\"\n Alias \"/pix\" \"/var/www/webhook/index.php\"\n\n #\n # ...\n #\n</VirtualHost>\n</IfModule>\n\n\n# ******************************************************************************** #\n# Utilize o segundo exemplo, caso queira requerir o certificado para autenticação #\n# mútua em apenas uma rota do domínio indicado no VirtualHost. #\n# Exemplo: https://www.seu_dominio.com.br/webhook/ # \n# ******************************************************************************** #\n\n<IfModule mod_ssl.c>\n<VirtualHost *:443> # Porta HTTPS\n #\n # ...\n #\n\n SSLCertificateFile /caminho_certificado/fullchain_ssl.pem #fullchain associado ao seu certificado SSL do domínio\n SSLCertificateKeyFile /caminho_certificado/privkey_ssl.pem #privkey associada ao seu certificado SSL do domínio\n\n # mTLS Gerencianet\n SSLCACertificateFile /caminho_certificado/chain-pix-prod.crt #Chave pública da Gerencianet\n SSLVerifyClient none\n SSLProtocol TLSv1.2\n \n <Location \"/webhook\">\n SSLVerifyClient require\n SSLVerifyDepth 3\n </Location>\n \n # Tratando o /pix, redirecionando as requisições sempre para /webhook\n Alias \"/webhook/pix/\" \"/var/www/webhook/index.php\"\n Alias \"/webhook/pix\" \"/var/www/webhook/index.php\"\n\n #\n # ...\n #\n</VirtualHost>\n</IfModule>\n", "language": "cplusplus", "name": "Apache" }, { "code": "# ********************************************************************************** #\n# Para o funcionamento deste exemplo é necessário que seu servidor tenha configurado #\n# o certificado do mTLS, com o direcionamento para este arquivo, e também com a #\n# tratativa do /pix. Assim como é feito em nosso exemplo de servidores Apache. #\n# ********************************************************************************** #\n\n<?php\n\nfunction resposta($status, $mensagem, $dados)\n{\n $resposta['status'] = $status;\n $resposta['mensagem'] = $mensagem;\n $resposta['dados'] = $dados;\n $json_resposta = '<pre>' . json_encode($resposta, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</pre>';\n\n header(\"HTTP/1.1 \" . $status);\n echo $json_resposta;\n}\n\nfunction salvar($dados)\n{\n \t// Crie um arquivo .;json para salvar as informações\n $nomeArquivo = './dados.json';\n $dadosGravados = json_decode(file_get_contents($nomeArquivo), true);\n $arquivo = fopen($nomeArquivo, 'w');\n\n // Incrementa as informações enviadas com o que já havia gravado\n array_push($dadosGravados, $dados);\n\n if (fwrite($arquivo, json_encode($dadosGravados))) {\n resposta(200, \"Requisição realizada com sucesso!\", $dados);\n } else {\n resposta(300, \"Falha ao salvar os dados da requisição.\", $dados);\n }\n\n fclose($arquivo);\n}\n\nfunction requisicao($metodo, $body, $parametros)\n{\n switch ($metodo) {\n case 'POST':\n salvar($body);\n break;\n case 'GET':\n resposta(200, \"Requisição realizada com sucesso!\", $body);\n break;\n }\n}\n\n// Obtém o método HTTP, body e parâmetros da requisição\n$metodo = $_SERVER['REQUEST_METHOD'];\n$parametros = explode('/', trim($_SERVER['REQUEST_URI'], '/'));\n$body = json_decode(file_get_contents('php://input'), true);\n\ntry {\n requisicao($metodo, $body, $parametros);\n} catch (Exception $e) {\n resposta(400, $e->getMessage(), $e);\n}", "language": "php", "name": "PHP" } ] } [/block] Para ter um ter um SSL válido, você deve entrar em contato com uma Autoridade Certificadora e gerar a chave privada `server_ssl.key.pem` e uma pública `server_ssl.crt.pem`, assim você valida a integridade da conexão. Você consegue realizar isso de forma gratuita utilizando um utilitário como o <a href="https://certbot.eff.org/" target="_blank">Certbot</a> por exemplo. <br> ### Configurar o webhook [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method post\">POST</span>\n <span class=\"endpoint\">/cadastro/webhook</span>\n</div>" } [/block] Configura webhook para a API Abertura de Contas. **Requer autorização para o escopo**: **`gn.registration.webhook.write`** #### Requisição Dados para a configuração do webhook. [block:code] { "codes": [ { "code": "{\n \"webhookUrl\": \"https://gerencianet.com.br/meu-webhook\"\n}", "language": "json", "name": "Adicionar Webhook" }, { "code": "{\n \"url\": \"https://gerencianet.com.br/meu-webhook\",\n \"chave\": \"92ecc0a8-9631-4601-a188-feacf8288c13\"\n}", "language": "json", "name": "Editar Webhook" } ] } [/block] <div class="tab2">(*) Atributo obrigatório </div> [block:parameters] { "data": { "0-0": "<b>webhookUrl</b>", "h-0": "Atributo", "h-1": "Descrição", "h-2": "Obrigatório", "h-3": "Tipo", "0-2": "Sim", "0-1": "Url para onde a notificação vai ser enviada", "0-3": "String\nexample: `https://gerencianet.com.br/meu-webhook`", "1-0": "<b>identificadorWebhook</b>", "1-1": "Chave identificadora do webhook", "1-2": "Não", "1-3": "String\nexample: 92ecc0a8-9631-4601-a188-feacf8288c13" }, "cols": 4, "rows": 2 } [/block] #### Respostas As respostas abaixo representam Sucesso(200) e Falhas/erros do consumo. [block:code] { "codes": [ { "code": "{\n \"identificadorWebhook\": \"92ecc0a8-9631-4601-a188-feacf8288c13\"\n}", "language": "json", "name": "200(Success)" }, { "code": "URL inválido\n{\n \"nome\": \"url_webhook\",\n \"mensagem\": \"A URL informada para webhook é inválida.\"\n}\n\nOu\n\nProtocolo inválido\n{\n \"nome\": \"protocolo_da_url\",\n \"mensagem\": \"A URL do webhook deve usar o protocolo HTTPS.\"\n}\n\nOu\n\nmTLS não configurado\n\n{\n \"nome\": \"mtls_nao_configurado\",\n \"mensagem\": \"A autenticação TLS mútua não está configurada no URL fornecido.\"\n}\n\nOu\n\nURL inacessível\n\n{\n \"nome\": \"url_inacessivel\",\n \"mensagem\": \"A URL informada está inacessível.\"\n}\n\nOu\n\nURL timeout\n\n{\n \"nome\": \"limite_de_tempo_atingido_para_url\",\n \"mensagem\": \"A URL informada atingiu o tempo limite de resposta.\"\n}\n\nOu\n\nURL falhou com erro\n\n{\n \"nome\": \"url_falhou_com_erro\",\n \"mensagem\": \"A requisição na URL informada falhou com o erro.\"\n}\n\nOu\n\nProtocolo não HTTPS\n\n{\n \"nome\": \"protocolo_da_url\",\n \"mensagem\": \"A URL do webhook deve usar o protocolo HTTPS.\"\n}\n\nOu\n\nURL responde HTTP\n\n{\n \"nome\": \"erro_de_codigo\",\n \"mensagem\": \"A URL informada respondeu com o código HTTP.\"\n}\n\nOu\n\nURL não responde\n\n{\n \"nome\": \"url_informada_nao_existe\",\n \"mensagem\": \"Não foi possível receber uma resposta da URL informada.\"\n}\n\nOu\n\nWebhook não encontrado\n\n{\n \"nome\": \"chave_invalida\",\n \"mensagem\": \"Não foi possível encontrar um webhook com a chave informada.\"\n}\n\nOu\n\nURL cadastrada\n\n{\n \"nome\": \"url_cadastrada\",\n \"mensagem\": \"A URL já foi cadastrada.\"\n}", "language": "json", "name": "400(Bad request)" }, { "code": "Este erro ocorre na seguinte situação:\n\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.", "language": "json", "name": "401(Unauthorized)" }, { "code": "{\n \"nome\": \"erro_aplicacao\",\n \"mensagem\": \"Ocorreu um erro na aplicação.\"\n}", "language": "json", "name": "500(Error)" } ] } [/block] ### Detalhar webhook [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method get\">GET</span>\n <span class=\"endpoint\">/cadastro/webhook/<span class=\"variable\">:identificadorWebhook</span></span>\n</div>" } [/block] Detalha webhook configurado para a API Abertura de Contas. **Requer autorização para o escopo**: **`gn.registration.webhook.read`** #### Requisição A requisição enviada para esse endpoint não precisa de um *body*, apenas os cabeçalhos de autorização, OAuth, parâmetro e o certificado da conta. [block:parameters] { "data": { "h-0": "Atributo", "h-1": "Descrição", "h-2": "Obrigatório", "h-3": "Tipo", "0-0": "<b>identificadorWebhook</b>", "0-1": "Chave associada ao webhook", "0-2": "Sim", "0-3": "String\nexample: 92ecc0a8-9631-4601-a188-feacf8288c13" }, "cols": 4, "rows": 1 } [/block] #### Respostas As respostas abaixo representam Sucesso(200) e Falhas/erros do consumo. [block:code] { "codes": [ { "code": "{\n \"webhookUrl\": \"https://gerencianet.com.br/meu-webhook\",\n \"identificadorWebhook\": \"92ecc0a8-9631-4601-a188-feacf8288c13\",\n \"criacao\": \"2021-10-26T11:23:35.000Z\"\n}", "language": "json", "name": "200(Success)" }, { "code": "{\n \"nome\": \"identificador_webhook\",\n \"mensagem\": \"Não foi possível encontrar um webhook com o identificador webhook informado.\"\n}", "language": "json", "name": "400(Bad request)" }, { "code": "Unauthorized. Este erro ocorre na seguinte situação:\n\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.", "language": "json", "name": "401(Unauthorized)" }, { "code": "{\n \"nome\": \"erro_aplicacao\",\n \"mensagem\": \"Ocorreu um erro na aplicação.\"\n}", "language": "json", "name": "500(Error)" } ] } [/block] ### Cancelar webhook [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method delete\">DELETE</span>\n <span class=\"endpoint\">/cadastro/webhook/<span class=\"variable\">:identificadorWebhook</span></span>\n</div>" } [/block] Cancela webhook configurado para a API Abertura de Contas. **Requer autorização para o escopo**: **`gn.registration.webhook.write`** #### Requisição A requisição enviada para esse endpoint não precisa de um *body*, apenas os cabeçalhos de autorização, OAuth, parâmetro e o certificado da conta. [block:parameters] { "data": { "h-0": "Atributo", "h-1": "Descrição", "h-2": "Obrigatório", "h-3": "Tipo", "0-0": "<b>identificadorWebhook</b>", "0-1": "Chave associada ao webhook", "0-2": "Sim", "0-3": "String\nexample: 92ecc0a8-9631-4601-a188-feacf8288c13" }, "cols": 4, "rows": 1 } [/block] #### Respostas As respostas abaixo representam Sucesso(204) e Falhas/erros do consumo. [block:code] { "codes": [ { "code": "No content \n* Webhook configurado para cadastro foi cancelado.", "language": "json", "name": "204(Success)" }, { "code": "{\n \"nome\": \"identificador_webhook\",\n \"mensagem\": \"Não foi possível encontrar um webhook com o identificador webhook informado.\"\n}", "language": "json", "name": "400(Bad request)" }, { "code": "Unauthorized. Este erro ocorre na seguinte situação:\n\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.", "language": "json", "name": "401(Unauthorized)" }, { "code": "{\n \"nome\": \"erro_aplicacao\",\n \"mensagem\": \"Ocorreu um erro na aplicação.\"\n}", "language": "json", "name": "500(Error)" } ] } [/block] ### Listar webhooks [block:html] { "html": "<div class=\"gn-endpoint\">\n <span class=\"http-method get\">GET</span>\n <span class=\"endpoint\">/cadastro/webhooks</span>\n</div>" } [/block] Lista webhooks configurados para a API Abertura de Contas. **Requer autorização para o escopo**: **`gn.registration.webhook.read`** #### Requisição A requisição enviada para esse endpoint não precisa de um *body*, apenas os cabeçalhos de autorização OAuth, parâmetros e o certificado da conta. [block:parameters] { "data": { "h-0": "Atributo", "h-1": "Descrição", "h-2": "Obrigatório", "h-3": "Tipo", "0-0": "<b>inicio</b>", "1-0": "<b>fim</b>", "2-0": "<b>paginacao.paginaAtual</b>", "3-0": "<b>paginacao.itensPorPagina</b>", "0-1": "Data inicial para listagem.", "0-2": "Sim", "0-3": "string($datetime)\nExample : \n2020-04-01T00:00:00.000Z", "1-2": "Sim", "1-1": "Data final para listagem.", "1-3": "string($datetime)\nExample : \n2022-10-29T00:00:00.000Z", "2-1": "Pagina atual listada.", "3-1": "Quantidade listada por página.", "2-2": "Não", "3-2": "Não", "2-3": "Integer\nExample : 0", "3-3": "String\nExample : 10" }, "cols": 4, "rows": 4 } [/block] #### Respostas As respostas abaixo representam Sucesso(200) e Falhas/erros do consumo. [block:code] { "codes": [ { "code": "Success\n{\n \"parametros\": {\n \"inicio\": \"2020-04-01T00:00:00.000Z\",\n \"fim\": \"2020-04-01T23:59:59.000Z\",\n \"paginacao\": {\n \"paginaAtual\": 0,\n \"itensPorPagina\": 100,\n \"quantidadeDePaginas\": 1,\n \"quantidadeTotalDeItens\": 1\n }\n },\n \"webhooks\": [\n {\n \"webhookUrl\": \"https://gerencianet.com.br/meu-webhook\",\n \"identificadorWebhook\": \"92ecc0a8-9631-4601-a188-feacf8288c13\",\n \"criacao\": \"2021-10-26T11:23:35.000Z\"\n }\n ]\n}", "language": "json", "name": "200(Success)" }, { "code": "{\n \"nome\": \"data_invalida\",\n \"mensagem\": \"Campo de data fim deve ser maior ou igual ao campo de data inicio.\"\n}", "language": "json", "name": "400(Bad request)" }, { "code": "Unauthorized. Este erro ocorre na seguinte situação:\n\n* Integrador não tem permissão para o escopo de serviço necessário para consumir este endpoint.", "language": "json", "name": "401(Unauthorized)" }, { "code": "{\n \"nome\": \"erro_aplicacao\",\n \"mensagem\": \"Ocorreu um erro na aplicação.\"\n}", "language": "json", "name": "500(Error)" } ] } [/block]