Pular para o conteúdo principal

🫆 CredFace - Venda com Biometria Facial

O CredFace é uma solução de venda com autenticação biométrica facial que adiciona uma camada extra de segurança às transações. Pode ser integrado em qualquer aplicação com câmera: PDV, site, totem de pagamento, aplicativo ou qualquer plataforma que o parceiro deseje utilizar — garantindo que apenas o titular do cartão possa realizar compras.

🎯 Visão Geral

O CredFace combina a tecnologia de biometria facial com o processo de venda, proporcionando:

  • 🔒 Segurança Avançada: Validação biométrica do cliente antes de aprovar a transação
  • ⚡ Processo Rápido: Autenticação em poucos segundos
  • 🛡️ Prevenção de Fraudes: Redução significativa de transações fraudulentas
  • ✅ Experiência do Usuário: Processo simples e intuitivo para o cliente

🏗️ Arquitetura da Solução

Componentes Necessários

A solução CredFace é composta por três elementos principais:

1. Hardware

  • Webcam: Câmera com as mesmas configurações utilizadas no Credline
  • Dispositivo de acesso: Computador, totem, tablet ou qualquer dispositivo com sistema operacional que suporte navegador Chrome 85 ou superior (versão atual: 124)

2. Integração de Software

  • APIs de Pagamento: Integração da aplicação com as APIs Credsystem
  • Motor de Biometria: Sistema de captura e validação biométrica facial
  • Navegador: Chrome 85+ para execução da WebView de biometria

3. Conectividade

  • Internet: Conexão estável para comunicação com as APIs
  • Certificados SSL: Comunicação segura com os servidores

🔄 Fluxo de Venda com Biometria

Passo a Passo

1. Solicitar Pré-autorização Biométrica

Antes de abrir o Motor de Biometria, a aplicação deve chamar o endpoint POST /pre-autorizacoes/biometria da API de Venda Loja. A resposta retorna os seguintes campos:

CampoDescrição
biometria.urlURL para abrir o Motor de Biometria na aplicação (popup / WebView)
biometria.urlLinkExternoURL para gerar QR Code — o cliente escaneia com o celular
biometria.acess_tokenToken de acesso para enviar no authorization do OnInit
biometria.tokenToken da sessão para enviar no token do OnInit
dica

Consulte o endpoint de Pré-autorização Biométrica para o payload completo e os campos obrigatórios.

2. Abrir o Motor de Biometria

O Motor de Biometria é um serviço web da Credsystem que gerencia a captura e validação facial. A aplicação abre a biometria.url (retornada no passo anterior) em uma janela do navegador e se comunica com ela via eventos postMessage:

EventoDireçãoDescrição
"loaded" (string)Motor → AplicaçãoMotor carregou e aguarda inicialização
OnInitAplicação → MotorAplicação inicializa o Motor com authorization, token e tema
OnFinishedMotor → AplicaçãoCaptura concluída — retorna decision, jwt (imagem criptografada) e base64 (imagem em base64)
OnErrorMotor → AplicaçãoErro durante a captura — retorna code e message

URL do Motor de Biometria: url retornada pelo POST /pre-autorizacoes/biometria

Payload do OnInit

Após receber o evento "loaded", a aplicação deve enviar o OnInit com os seguintes campos:

CampoTipoObrigatórioDescrição
authorizationstringToken retornado em biometria.acess_token
tokenstringToken retornado em biometria.token
theme.primaryColorstringCor primária dos botões (ex: #0066CC)
theme.buttonTextColorstringCor do texto dos botões
allowedOriginstringOrigem permitida para postMessage — use location.origin em web; URL do Motor em apps nativos
isOperadorbooleanQuando true, altera os textos da tela inicial do Motor
nota

Consulte os Acordos WebView para a especificação completa dos eventos.

// biometria.url = preAuthResponse.biometria.url
function abrirMotorBiometria({ urlBiometria, authorization, token, theme = {}, isOperador = false }) {
const popup = window.open(
urlBiometria,
'MotorBiometria',
`width=${window.innerWidth - 14},height=${window.innerHeight},` +
`top=${window.screenTop + 10},left=${window.screenLeft + 7}`
);

return new Promise((resolve, reject) => {
const handler = (event) => {
// Motor sinalizou que carregou — enviar OnInit
if (event.data === 'loaded') {
popup.postMessage({
type: 'OnInit',
detail: {
authorization,
token,
theme,
allowedOrigin: location.origin,
isOperador
}
}, '*');
return;
}

const { type, detail } = event.data ?? {};

if (type === 'OnFinished') {
window.removeEventListener('message', handler);
resolve(detail); // { decision: 'APPROVED'|'DENIED'|'CLOSE', jwt, base64 }
}

if (type === 'OnError') {
window.removeEventListener('message', handler);
reject(new Error(detail.message));
}
};

window.addEventListener('message', handler);
});
}

// Uso
// 1. Chamar POST /pre-autorizacoes/biometria e obter os campos de biometria da resposta
const { url: urlBiometria, acess_token, token: tokenBiometria } = preAuthResponse.biometria;
const resultado = await abrirMotorBiometria({
urlBiometria,
authorization: acess_token,
token: tokenBiometria,
theme: { primaryColor: '#0066CC', buttonTextColor: '#FFFFFF' }
});

3. Alternativa: QR Code para Celular

Quando o cliente preferir usar o próprio celular — ou a aplicação não dispuser de câmera — exiba um QR Code gerado a partir da biometria.urlLinkExterno retornada pelo POST /pre-autorizacoes/biometria. O cliente escaneia o código com a câmera do celular, completa a captura no dispositivo móvel e o resultado retorna à aplicação normalmente.

// Exemplo: gerar QR Code no browser
// <script src="https://cdn.jsdelivr.net/npm/qrcode/build/qrcode.min.js"></script>
// <canvas id="qrcode-canvas"></canvas>

const urlQrCode = preAuthResponse.biometria.urlLinkExterno;

QRCode.toCanvas(
document.getElementById('qrcode-canvas'),
urlQrCode,
{ width: 256, errorCorrectionLevel: 'M' },
(err) => { if (err) console.error('Erro ao gerar QR Code:', err); }
);
Quando usar QR Code?
  • Aplicação ou dispositivo sem câmera, ou com câmera de difícil posicionamento para o cliente
  • Cliente prefere usar o celular pessoal para a biometria
  • Ambiente com alta demanda (o cliente avança enquanto o caixa prepara a venda)

4. Processar o Resultado

Após o encerramento do Motor, o campo decision indica o resultado da captura biométrica:

decisionSignificadoPróximo passo
APPROVEDBiometria validada com sucessoUsar jwt para capturar a venda
DENIEDRosto não reconhecidoCancelar pré-autorização, oferecer nova tentativa
CLOSEUsuário fechou a janelaCancelar pré-autorização
switch (resultado.decision) {
case 'APPROVED':
await capturarVenda({ preAutorizacaoId, biometriaJWT: resultado.jwt });
exibirMensagem('Venda aprovada com sucesso!');
break;

case 'DENIED':
await cancelarPreAutorizacao(preAutorizacaoId);
exibirErro('Biometria não reconhecida. Tente novamente.');
break;

case 'CLOSE':
await cancelarPreAutorizacao(preAutorizacaoId);
exibirErro('Processo cancelado pelo cliente.');
break;
}

📋 Requisitos Técnicos

Hardware Mínimo

ComponenteEspecificação
WebcamResolução mínima 720p (1280x720)
ProcessadorIntel Core i3 ou equivalente
Memória RAM4 GB
Conexão InternetMínimo 5 Mbps (download/upload)

Software

ComponenteVersão
Sistema OperacionalWindows 10+, Linux (Ubuntu 18.04+), macOS 10.14+
NavegadorGoogle Chrome 85+ (recomendado: versão 124+)
Certificados SSLTLS 1.2 ou superior

APIs Necessárias

Para implementar o CredFace, você precisará integrar com:

  1. API de Venda: Para criar pré-autorizações e capturar vendas
  2. API de Biometria: Para validação facial
  3. API de Autenticação: Para obter tokens de acesso

🔧 Configuração da Aplicação

1. Instalação da Câmera

Certifique-se de que a câmera está:

  • Corretamente instalada e reconhecida pelo sistema operacional
  • Posicionada em altura adequada para captura facial (nível dos olhos do cliente), independente de ser PDV, totem ou outro dispositivo
  • Com boa iluminação frontal (evitar contraluz)

2. Configuração do Navegador

O Motor de Biometria gerencia o acesso à câmera por conta própria — a aplicação não precisa solicitar permissão de câmera diretamente. Porém, o Chrome precisa ter permissão de câmera liberada para o domínio do Motor. Oriente o responsável pela integração a:

  • Acessar chrome://settings/content/camera
  • Garantir que biometria.credsystem.com.br não está bloqueado
  • Ou simplesmente aprovar o pop-up de permissão que o Chrome exibe na primeira vez que o Motor abre

🛡️ Segurança e Privacidade

Proteção de Dados

  • Criptografia: Todas as imagens são criptografadas antes da transmissão
  • Tokens JWT: Biometrias validadas retornam tokens assinados
  • Não Armazenamento: Imagens biométricas não são armazenadas permanentemente
  • LGPD Compliance: Conformidade com a Lei Geral de Proteção de Dados

Boas Práticas

// ✅ Correto: Usar HTTPS em todas as chamadas à API
const API_URL = 'https://app-bff-venda-hml.credsystem.com.br';

// ✅ Correto: Remover event listener após receber o resultado
window.addEventListener('message', function handler(event) {
const { type } = event.data ?? {};
if (type === 'OnFinished' || type === 'OnError') {
window.removeEventListener('message', handler); // Limpar listener
}
});

// ✅ Correto: Nunca logar o JWT da biometria em produção
// logEvent('BIOMETRIA_APROVADA', { vendaId, jwt }); // ❌ não faça isso
logEvent('BIOMETRIA_APROVADA', { vendaId, tempo: tempoMs }); // ✅ sem dados sensíveis

📊 Monitoramento e Logs

Eventos para Registrar

Registre os seguintes eventos para análise e troubleshooting:

const logEvent = (evento, detalhes) => {
console.log({
timestamp: new Date().toISOString(),
evento: evento,
detalhes: detalhes,
aplicacao: aplicacaoId,
estabelecimento: estabelecimentoId
});
};

// Exemplos de uso
logEvent('BIOMETRIA_INICIADA', { vendaId, valor });
logEvent('BIOMETRIA_APROVADA', { vendaId, tempo: tempoMs });
logEvent('BIOMETRIA_NEGADA', { vendaId, motivo });
logEvent('BIOMETRIA_ERRO', { vendaId, erro });

⚠️ Tratamento de Erros

Erros Comuns

ErroCausaSolução
Câmera não encontradaWebcam desconectada ou sem permissãoVerificar conexão e permissões do navegador
Timeout na capturaCliente demorou muito para posicionarReiniciar processo de captura
Biometria negadaFace não reconhecidaPermitir nova tentativa ou método alternativo
Erro de conexãoFalha na comunicação com APIVerificar internet e tentar novamente

Implementação de Retry

const capturarBiometriaComRetry = async ({ urlBiometria, authorization, token, theme }, maxTentativas = 3) => {
for (let tentativa = 1; tentativa <= maxTentativas; tentativa++) {
try {
const resultado = await capturarBiometria({ urlBiometria, authorization, token, theme });
return resultado;
} catch (error) {
console.error(`Tentativa ${tentativa} falhou:`, error);

if (tentativa === maxTentativas) {
throw new Error('Número máximo de tentativas excedido');
}

// Aguardar antes de tentar novamente
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
};

📚 Documentação Relacionada

Para implementar completamente o CredFace, consulte também:

🆘 Suporte

Para dúvidas ou problemas com o CredFace, entre em contato com a equipe de suporte técnico: suporte.tecnico@credsystem.com.br