👤 Fluxo de Primeiro Acesso
Este guia apresenta o fluxo completo para cadastro de novos usuários no sistema.
📋 Visão Geral
O fluxo de primeiro acesso permite que novos usuários criem sua conta no sistema, passando por validações de segurança e aceitando termos de uso.
Antes de iniciar o fluxo, certifique-se de ter:
- CPF e data de nascimento do cliente
- Informações do dispositivo (ID, modelo, sistema operacional)
- Nome do aplicativo configurado no sistema
URLs Base:
- Homologação:
https://apihml.credsystem.com.br/api/v1 - Produção:
https://api.credsystem.com.br/api/v1
- 🔧 Guia de Troubleshooting - Solução de problemas e erros comuns
- 📖 Especificação OpenAPI — Referência técnica completa (schemas, tipos, exemplos)
1️⃣ Validar Dados do Cliente
Valide os dados básicos do cliente para iniciar o processo de cadastro.
Endpoint
POST {baseUrl}/identificacao/dados
Content-Type: application/json
Request Body
{
"app": "APP_NAME",
"fluxo": "PRIMEIRO_ACESSO",
"cliente": {
"cpf": "12345678909",
"dataNascimento": "1990-01-01"
},
"dispositivo": {
"dispositivoId": "device123",
"idSistemaOperacional": "2",
"versaoSistemaOperacional": "12",
"modelo": "Samsung Galaxy",
"versaoApp": "1.0.0"
}
}
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
app | string | ✅ | Nome do aplicativo configurado |
fluxo | string | ✅ | Fixo: "PRIMEIRO_ACESSO" |
cliente.cpf | string | ✅ | CPF do cliente (apenas números) |
cliente.dataNascimento | string | ✅ | Data de nascimento (YYYY-MM-DD) |
dispositivo.dispositivoId | string | ✅ | ID único do dispositivo |
dispositivo.idSistemaOperacional | string | ✅ | 1=iOS, 2=Android, 3=Outros |
dispositivo.versaoSistemaOperacional | string | ✅ | Versão do SO (ex: "12", "17.2") |
dispositivo.modelo | string | ✅ | Modelo do dispositivo |
dispositivo.versaoApp | string | ✅ | Versão do aplicativo |
Resposta de Sucesso
A API retorna um access_token temporário (token de sessão do cliente) que deve ser usado nos próximos passos do fluxo.
{
"access_token": "eyJhbGci...",
"token_type": "Bearer",
"expires_in": 900
}
Este token expira em 15 minutos. Complete o fluxo dentro deste prazo.
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X POST "{baseUrl}/identificacao/dados" \
-H "Content-Type: application/json" \
-d '{
"app": "meu-app-private-label",
"fluxo": "PRIMEIRO_ACESSO",
"cliente": {
"cpf": "12345678909",
"dataNascimento": "1990-01-01"
},
"dispositivo": {
"dispositivoId": "device123",
"idSistemaOperacional": "2",
"versaoSistemaOperacional": "12",
"modelo": "Samsung Galaxy",
"versaoApp": "1.0.0"
}
}'
async function iniciarPrimeiroAcesso(cpf, dataNascimento, dispositivo) {
const response = await fetch(`${baseUrl}/identificacao/dados`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
app: 'meu-app-private-label',
fluxo: 'PRIMEIRO_ACESSO',
cliente: { cpf, dataNascimento },
dispositivo
})
});
if (!response.ok) throw new Error('Erro ao validar dados');
const { access_token } = await response.json();
sessionStorage.setItem('session_token', access_token);
return access_token;
}
import requests
def iniciar_primeiro_acesso(base_url, cpf, data_nascimento, dispositivo):
url = f"{base_url}/identificacao/dados"
payload = {
"app": "meu-app-private-label",
"fluxo": "PRIMEIRO_ACESSO",
"cliente": {"cpf": cpf, "dataNascimento": data_nascimento},
"dispositivo": dispositivo
}
response = requests.post(url, json=payload)
response.raise_for_status()
return response.json()["access_token"]
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.*;
import java.net.URI;
import java.util.Map;
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> body = Map.of(
"app", "meu-app-private-label",
"fluxo", "PRIMEIRO_ACESSO",
"cliente", Map.of("cpf", cpf, "dataNascimento", dataNascimento),
"dispositivo", dispositivo
);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/identificacao/dados"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(mapper.writeValueAsString(body)))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
String accessToken = mapper.readTree(response.body()).get("access_token").asText();
using System.Net.Http.Json;
using System.Text.Json;
var client = new HttpClient();
var payload = new {
app = "meu-app-private-label",
fluxo = "PRIMEIRO_ACESSO",
cliente = new { cpf, dataNascimento },
dispositivo
};
var response = await client.PostAsJsonAsync($"{baseUrl}/identificacao/dados", payload);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
var accessToken = data.GetProperty("access_token").GetString();
$payload = [
'app' => 'meu-app-private-label',
'fluxo' => 'PRIMEIRO_ACESSO',
'cliente' => ['cpf' => $cpf, 'dataNascimento' => $dataNascimento],
'dispositivo' => $dispositivo,
];
$ch = curl_init("{$baseUrl}/identificacao/dados");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
$accessToken = $data['access_token'];
import (
"bytes"
"encoding/json"
"net/http"
)
payload := map[string]interface{}{
"app": "meu-app-private-label",
"fluxo": "PRIMEIRO_ACESSO",
"cliente": map[string]string{"cpf": cpf, "dataNascimento": dataNascimento},
"dispositivo": dispositivo,
}
body, _ := json.Marshal(payload)
resp, _ := http.Post(baseURL+"/identificacao/dados", "application/json", bytes.NewBuffer(body))
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
accessToken := result["access_token"].(string)
Consulte o 🔧 Troubleshooting - Validar Dados para detalhes de erros e soluções.
2️⃣ Solicitar Link de Biometria
Solicite o link de captura biométrica que será aberto no WebView do aplicativo para validação facial do usuário.
O link retornado por este endpoint deve ser integrado via WebView usando o Motor de Biometria Credsystem. Consulte a documentação por plataforma:
Acesse a Visão Geral do Motor de Biometria para entender o fluxo completo de captura.
Endpoint
POST {baseUrl}/identificacao/biometria
Authorization: Bearer {token-sessao-cliente}
Content-Type: application/json
Request Body
{
"consumidor": "CONSUMIDOR_ID",
"loja": 123456
}
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X POST "{baseUrl}/identificacao/biometria" \
-H "Authorization: Bearer {token-sessao-cliente}" \
-H "Content-Type: application/json" \
-d '{"consumidor": "CONSUMIDOR_ID", "loja": 123456}'
async function solicitarBiometria(sessionToken, consumidorId, lojaId) {
const response = await fetch(`${baseUrl}/identificacao/biometria`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${sessionToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ consumidor: consumidorId, loja: lojaId })
});
const { link } = await response.json();
return link; // Abra em WebView
}
import requests
def solicitar_biometria(base_url, session_token, consumidor_id, loja_id):
url = f"{base_url}/identificacao/biometria"
headers = {"Authorization": f"Bearer {session_token}", "Content-Type": "application/json"}
payload = {"consumidor": consumidor_id, "loja": loja_id}
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
return response.json()["link"]
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.*;
import java.net.URI;
import java.util.Map;
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> body = Map.of("consumidor", consumidorId, "loja", lojaId);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/identificacao/biometria"))
.header("Authorization", "Bearer " + sessionToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(mapper.writeValueAsString(body)))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
String link = mapper.readTree(response.body()).get("link").asText();
using System.Net.Http.Json;
using System.Text.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", sessionToken);
var response = await client.PostAsJsonAsync(
$"{baseUrl}/identificacao/biometria",
new { consumidor = consumidorId, loja = lojaId }
);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
var link = data.GetProperty("link").GetString();
$ch = curl_init("{$baseUrl}/identificacao/biometria");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$sessionToken}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'consumidor' => $consumidorId, 'loja' => $lojaId
]));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
$link = $data['link'];
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
payload := map[string]interface{}{"consumidor": consumidorId, "loja": lojaId}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", baseURL+"/identificacao/biometria", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+sessionToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
link := result["link"].(string)
fmt.Println(link)
Abra o link retornado em um WebView e aguarde o callback de conclusão da captura biométrica antes de avançar para o próximo passo do fluxo.
Consulte o 🔧 Troubleshooting - Solicitar Biometria para detalhes de erros e soluções.
3️⃣ Enviar Token SMS
Solicite o envio de um código de verificação por SMS para o telefone cadastrado do usuário.
Endpoint
POST {baseUrl}/identificacao/token-sms/envio
Authorization: Bearer {token-sessao-cliente}
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X POST "{baseUrl}/identificacao/token-sms/envio" \
-H "Authorization: Bearer {token-sessao-cliente}"
async function enviarSMS(sessionToken) {
const response = await fetch(`${baseUrl}/identificacao/token-sms/envio`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${sessionToken}` }
});
if (!response.ok) throw new Error('Erro ao enviar SMS');
return await response.json();
}
import requests
def enviar_sms(base_url, session_token):
url = f"{base_url}/identificacao/token-sms/envio"
headers = {"Authorization": f"Bearer {session_token}"}
response = requests.post(url, headers=headers)
response.raise_for_status()
return response.json()
import java.net.http.*;
import java.net.URI;
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/identificacao/token-sms/envio"))
.header("Authorization", "Bearer " + sessionToken)
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
using System.Net.Http;
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", sessionToken);
var response = await client.PostAsync(
$"{baseUrl}/identificacao/token-sms/envio",
null
);
response.EnsureSuccessStatusCode();
$ch = curl_init("{$baseUrl}/identificacao/token-sms/envio");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer {$sessionToken}"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '');
$response = curl_exec($ch);
curl_close($ch);
import "net/http"
req, _ := http.NewRequest("POST", baseURL+"/identificacao/token-sms/envio", nil)
req.Header.Set("Authorization", "Bearer "+sessionToken)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
O código enviado tem 6 dígitos e é válido por 5 minutos.
Consulte o 🔧 Troubleshooting - Enviar SMS para detalhes de erros e soluções.
4️⃣ Validar Token SMS
Valide o código de 6 dígitos recebido por SMS.
Endpoint
POST {baseUrl}/identificacao/token-sms
Authorization: Bearer {token-sessao-cliente}
Content-Type: application/json
Request Body
{
"pinCode": "123456",
"analise": {
"userID": "12345678909",
"origem": "APP_NAME",
"deviceID": "device123",
"integrationName": "app-login-pl",
"dadosMaquina": {
"ip": "192.168.0.1",
"fingerPrint": "{fingerprint}"
}
}
}
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
pinCode | string | ✅ | C ódigo de 6 dígitos recebido por SMS |
analise.userID | string | ✅ | CPF do usuário |
analise.origem | string | ✅ | Nome do aplicativo |
analise.deviceID | string | ✅ | ID do dispositivo |
analise.integrationName | string | ✅ | Nome da integração |
analise.dadosMaquina.ip | string | ✅ | Endereço IP do dispositivo |
analise.dadosMaquina.fingerPrint | string | ✅ | Fingerprint do dispositivo |
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X POST "{baseUrl}/identificacao/token-sms" \
-H "Authorization: Bearer {token-sessao-cliente}" \
-H "Content-Type: application/json" \
-d '{
"pinCode": "123456",
"analise": {
"userID": "12345678909",
"origem": "APP_NAME",
"deviceID": "device123",
"integrationName": "app-login-pl",
"dadosMaquina": {"ip": "192.168.0.1", "fingerPrint": "{fingerprint}"}
}
}'
async function validarSMS(sessionToken, pinCode, dadosDispositivo) {
const response = await fetch(`${baseUrl}/identificacao/token-sms`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${sessionToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
pinCode,
analise: {
userID: dadosDispositivo.cpf,
origem: 'meu-app-private-label',
deviceID: dadosDispositivo.dispositivoId,
integrationName: 'app-login-pl',
dadosMaquina: { ip: dadosDispositivo.ip, fingerPrint: dadosDispositivo.fingerprint }
}
})
});
if (!response.ok) throw new Error('Código SMS inválido');
return await response.json();
}
import requests
def validar_sms(base_url, session_token, pin_code, dados_dispositivo):
url = f"{base_url}/identificacao/token-sms"
headers = {
"Authorization": f"Bearer {session_token}",
"Content-Type": "application/json"
}
payload = {
"pinCode": pin_code,
"analise": {
"userID": dados_dispositivo["cpf"],
"origem": "meu-app-private-label",
"deviceID": dados_dispositivo["dispositivoId"],
"integrationName": "app-login-pl",
"dadosMaquina": {
"ip": dados_dispositivo["ip"],
"fingerPrint": dados_dispositivo["fingerprint"]
}
}
}
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
return response.json()
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.*;
import java.net.URI;
import java.util.Map;
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> analise = Map.of(
"userID", cpf,
"origem", "meu-app-private-label",
"deviceID", dispositivoId,
"integrationName", "app-login-pl",
"dadosMaquina", Map.of("ip", ip, "fingerPrint", fingerprint)
);
Map<String, Object> body = Map.of("pinCode", pinCode, "analise", analise);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/identificacao/token-sms"))
.header("Authorization", "Bearer " + sessionToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(mapper.writeValueAsString(body)))
.build();
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
using System.Net.Http.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", sessionToken);
var payload = new {
pinCode,
analise = new {
userID = cpf,
origem = "meu-app-private-label",
deviceID = dispositivoId,
integrationName = "app-login-pl",
dadosMaquina = new { ip, fingerPrint = fingerprint }
}
};
var response = await client.PostAsJsonAsync($"{baseUrl}/identificacao/token-sms", payload);
response.EnsureSuccessStatusCode();
$payload = [
'pinCode' => $pinCode,
'analise' => [
'userID' => $cpf,
'origem' => 'meu-app-private-label',
'deviceID' => $dispositivoId,
'integrationName' => 'app-login-pl',
'dadosMaquina' => ['ip' => $ip, 'fingerPrint' => $fingerprint]
]
];
$ch = curl_init("{$baseUrl}/identificacao/token-sms");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$sessionToken}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
curl_close($ch);
import (
"bytes"
"encoding/json"
"net/http"
)
payload := map[string]interface{}{
"pinCode": pinCode,
"analise": map[string]interface{}{
"userID": cpf,
"origem": "meu-app-private-label",
"deviceID": dispositivoId,
"integrationName": "app-login-pl",
"dadosMaquina": map[string]string{"ip": ip, "fingerPrint": fingerprint},
},
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", baseURL+"/identificacao/token-sms", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+sessionToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
O objeto analise contém informações para análise de fraude. Certifique-se de enviar dados precisos do dispositivo.
Consulte o 🔧 Troubleshooting - Validar SMS para detalhes de erros e soluções.
5️⃣ Validar Perguntas de Segurança (Se Aplicável)
Alguns fluxos podem exigir resposta a perguntas de segurança para validação adicional.
Endpoint
POST {baseUrl}/identificacao/perguntas
Authorization: Bearer {token-sessao-cliente}
Content-Type: application/json
Request Body
{
"respostas": [
{
"codigoPergunta": 1,
"resposta": "resposta1"
},
{
"codigoPergunta": 2,
"resposta": "resposta2"
}
]
}
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X POST "{baseUrl}/identificacao/perguntas" \
-H "Authorization: Bearer {token-sessao-cliente}" \
-H "Content-Type: application/json" \
-d '{"respostas": [{"codigoPergunta": 1, "resposta": "resposta1"}, {"codigoPergunta": 2, "resposta": "resposta2"}]}'
async function validarPerguntas(sessionToken, respostas) {
const response = await fetch(`${baseUrl}/identificacao/perguntas`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${sessionToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ respostas })
});
if (!response.ok) throw new Error('Respostas incorretas');
return await response.json();
}
import requests
def validar_perguntas(base_url, session_token, respostas):
url = f"{base_url}/identificacao/perguntas"
headers = {
"Authorization": f"Bearer {session_token}",
"Content-Type": "application/json"
}
response = requests.post(url, json={"respostas": respostas}, headers=headers)
response.raise_for_status()
return response.json()
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.*;
import java.net.URI;
import java.util.Map;
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> body = Map.of("respostas", respostas);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/identificacao/perguntas"))
.header("Authorization", "Bearer " + sessionToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(mapper.writeValueAsString(body)))
.build();
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
using System.Net.Http.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", sessionToken);
var response = await client.PostAsJsonAsync(
$"{baseUrl}/identificacao/perguntas",
new { respostas }
);
response.EnsureSuccessStatusCode();
$ch = curl_init("{$baseUrl}/identificacao/perguntas");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$sessionToken}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['respostas' => $respostas]));
$response = curl_exec($ch);
curl_close($ch);
import (
"bytes"
"encoding/json"
"net/http"
)
body, _ := json.Marshal(map[string]interface{}{"respostas": respostas})
req, _ := http.NewRequest("POST", baseURL+"/identificacao/perguntas", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+sessionToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
Este passo só é exigido se a API retornar status indicando necessidade de validação adicional.
Consulte o 🔧 Troubleshooting - Validar Perguntas para detalhes de erros e soluções.
6️⃣ Buscar Termo de Aceite
Obtenha o texto completo do termo de uso e política de privacidade que o usuário deve aceitar.
Endpoint
GET {baseUrl}/contratos/termo-aceite
Authorization: Bearer {token-sessao-cliente}
Exemplo de Resposta
{
"termo": {
"id": 123,
"versao": "2.1",
"titulo": "Termos de Uso e Política de Privacidade",
"conteudo": "Texto completo do termo...",
"dataPublicacao": "2025-01-01T00:00:00Z"
}
}
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X GET "{baseUrl}/contratos/termo-aceite" \
-H "Authorization: Bearer {token-sessao-cliente}"
async function buscarTermo(sessionToken) {
const response = await fetch(`${baseUrl}/contratos/termo-aceite`, {
headers: { 'Authorization': `Bearer ${sessionToken}` }
});
const { termo } = await response.json();
return termo;
}
import requests
def buscar_termo(base_url, session_token):
url = f"{base_url}/contratos/termo-aceite"
headers = {"Authorization": f"Bearer {session_token}"}
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.json()["termo"]
import java.net.http.*;
import java.net.URI;
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/contratos/termo-aceite"))
.header("Authorization", "Bearer " + sessionToken)
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
using System.Net.Http;
using System.Text.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", sessionToken);
var response = await client.GetAsync($"{baseUrl}/contratos/termo-aceite");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
var doc = JsonDocument.Parse(json);
var termo = doc.RootElement.GetProperty("termo");
$ch = curl_init("{$baseUrl}/contratos/termo-aceite");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer {$sessionToken}"]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
$termo = $data['termo'];
import (
"encoding/json"
"net/http"
)
req, _ := http.NewRequest("GET", baseURL+"/contratos/termo-aceite", nil)
req.Header.Set("Authorization", "Bearer "+sessionToken)
resp, _ := (&http.Client{}).Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
termo := result["termo"]
Consulte o 🔧 Troubleshooting - Termo de Aceite para detalhes de erros e soluções.
7️⃣ Aceitar Termo
Registre a aceitação do termo pelo usuário na interface do app.
Endpoint
PUT {baseUrl}/contratos/termo-aceite
Authorization: Bearer {token-sessao-cliente}
Content-Type: application/json
Request Body
{
"aceite": true
}
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X PUT "{baseUrl}/contratos/termo-aceite" \
-H "Authorization: Bearer {token-sessao-cliente}" \
-H "Content-Type: application/json" \
-d '{"aceite": true}'
async function aceitarTermo(sessionToken) {
const response = await fetch(`${baseUrl}/contratos/termo-aceite`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${sessionToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ aceite: true })
});
if (!response.ok) throw new Error('Erro ao aceitar termo');
return await response.json();
}
import requests
def aceitar_termo(base_url, session_token):
url = f"{base_url}/contratos/termo-aceite"
headers = {
"Authorization": f"Bearer {session_token}",
"Content-Type": "application/json"
}
response = requests.put(url, json={"aceite": True}, headers=headers)
response.raise_for_status()
return response.json()
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.*;
import java.net.URI;
import java.util.Map;
ObjectMapper mapper = new ObjectMapper();
String body = mapper.writeValueAsString(Map.of("aceite", true));
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/contratos/termo-aceite"))
.header("Authorization", "Bearer " + sessionToken)
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
using System.Net.Http.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", sessionToken);
var response = await client.PutAsJsonAsync(
$"{baseUrl}/contratos/termo-aceite",
new { aceite = true }
);
response.EnsureSuccessStatusCode();
$ch = curl_init("{$baseUrl}/contratos/termo-aceite");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$sessionToken}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['aceite' => true]));
$response = curl_exec($ch);
curl_close($ch);
import (
"bytes"
"encoding/json"
"net/http"
)
body, _ := json.Marshal(map[string]bool{"aceite": true})
req, _ := http.NewRequest("PUT", baseURL+"/contratos/termo-aceite", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+sessionToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
Certifique-se de apresentar o termo completo ao usuário e obter consentimento explícito antes de enviar o aceite.
Consulte o 🔧 Troubleshooting - Termo de Aceite para detalhes de erros e soluções.
8️⃣ Criar Senha de Acesso
Finalize o cadastro criando a senha do usuário. Este é o último passo do fluxo.
Endpoint
POST {baseUrl}/usuario/acesso
Authorization: Bearer {token-sessao-cliente}
Content-Type: application/json
Request Body
{
"senha": "SenhaSegura123"
}
Exemplos de Código
- cURL
- JavaScript
- Python
- Java
- C#
- PHP
- Go
curl -X POST "{baseUrl}/usuario/acesso" \
-H "Authorization: Bearer {token-sessao-cliente}" \
-H "Content-Type: application/json" \
-d '{"senha": "SenhaSegura123!"}'
function validarSenha(senha) {
return senha.length >= 8
&& /[A-Z]/.test(senha)
&& /[a-z]/.test(senha)
&& /[0-9]/.test(senha)
&& /[!@#$%^&*(),.?":{}|<>]/.test(senha);
}
async function criarSenha(sessionToken, senha) {
if (!validarSenha(senha)) throw new Error('Senha não atende aos requisitos de segurança');
const response = await fetch(`${baseUrl}/usuario/acesso`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${sessionToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ senha })
});
if (!response.ok) throw new Error('Erro ao criar senha');
return await response.json();
}
import re, requests
def validar_senha(senha):
return (
len(senha) >= 8
and re.search(r'[A-Z]', senha)
and re.search(r'[a-z]', senha)
and re.search(r'[0-9]', senha)
and re.search(r'[!@#$%^&*(),.?":{}|<>]', senha)
)
def criar_senha(base_url, session_token, senha):
if not validar_senha(senha):
raise ValueError('Senha não atende aos requisitos')
url = f"{base_url}/usuario/acesso"
headers = {
"Authorization": f"Bearer {session_token}",
"Content-Type": "application/json"
}
response = requests.post(url, json={"senha": senha}, headers=headers)
response.raise_for_status()
return response.json()
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.*;
import java.net.URI;
import java.util.Map;
ObjectMapper mapper = new ObjectMapper();
String body = mapper.writeValueAsString(Map.of("senha", senha));
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/usuario/acesso"))
.header("Authorization", "Bearer " + sessionToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
using System.Net.Http.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", sessionToken);
var response = await client.PostAsJsonAsync(
$"{baseUrl}/usuario/acesso",
new { senha }
);
response.EnsureSuccessStatusCode();
$ch = curl_init("{$baseUrl}/usuario/acesso");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$sessionToken}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['senha' => $senha]));
$response = curl_exec($ch);
curl_close($ch);
import (
"bytes"
"encoding/json"
"net/http"
)
body, _ := json.Marshal(map[string]string{"senha": senha})
req, _ := http.NewRequest("POST", baseURL+"/usuario/acesso", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+sessionToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
Após este passo, o usuário terá seu acesso criado e poderá fazer login normalmente usando CPF e a senha cadastrada.
Recomendações para senhas seguras:
- Mínimo de 8 caracteres
- Pelo menos 1 letra maiúscula
- Pelo menos 1 letra minúscula
- Pelo menos 1 número
- Pelo menos 1 caractere especial
Consulte o 🔧 Troubleshooting - Criar/Atualizar Senha para detalhes de erros e soluções.
🔄 Fluxo Completo - Exemplo
async function fluxoPrimeiroAcessoCompleto(dadosCliente, dadosDispositivo) {
try {
// Passo 1: Validar dados
const sessionToken = await iniciarPrimeiroAcesso(
dadosCliente.cpf,
dadosCliente.dataNascimento,
dadosDispositivo
);
// Passo 2: Biometria (opcional)
// const linkBiometria = await solicitarBiometria(sessionToken, consumidorId, lojaId);
// Passo 3: Enviar SMS
await enviarSMS(sessionToken);
// Aguardar usuário digitar código
const pinCode = await aguardarCodigoSMS();
// Passo 4: Validar SMS
await validarSMS(sessionToken, pinCode, dadosDispositivo);
// Passo 5: Perguntas de segurança (se aplicável)
// await validarPerguntas(sessionToken, respostas);
// Passo 6: Buscar termo
const termo = await buscarTermo(sessionToken);
// Exibir termo ao usuário
await exibirTermo(termo);
// Aguardar aceite
const aceitou = await aguardarAceite();
if (!aceitou) {
throw new Error('Usuário recusou o termo de aceite');
}
// Passo 7: Aceitar termo
await aceitarTermo(sessionToken);
// Passo 8: Criar senha
const senha = await solicitarSenha();
await criarSenha(sessionToken, senha);
console.log('✅ Cadastro concluído com sucesso!');
// Redirecionar para tela de login
navegarParaLogin();
} catch (error) {
console.error('Erro no cadastro:', error);
exibirErro(error.message);
}
}
⚠️ Tratamento de Erros
| Código | Descrição | Ação Recomendada |
|---|---|---|
| 400 | Dados inválidos | Verifique CPF, data de nascimento e dados do dispositivo |
| 401 | Token expirado | Reinicie o fluxo do início |
| 404 | Cliente não encontrado | Verifique se o CPF está correto |
| 409 | Cliente já cadastrado | Redirecione para tela de login |
| 422 | Código SMS inválido | Solicite novo código ou permita reenvio |
🎓 Recursos Adicionais
- 🔧 Guia de Troubleshooting — Solução de problemas e erros comuns
- 📄 Referência OpenAPI — Especificação técnica completa
📚 Recursos Relacionados
- Login - Autenticação de usuários
- Troca de Dispositivo - Autorizar novo dispositivo
- Recuperar Senha - Redefinir senha esquecida