Autenticação 3DS
Autentique o portador do cartão junto ao emissor usando o protocolo 3D Secure 2.0 (EMV 3DS).
O que é 3D Secure
O 3D Secure (3DS) é um protocolo de autenticação que verifica a identidade do portador do cartão junto ao banco emissor durante uma transação online. Ele oferece:
- Liability shift — a responsabilidade por chargebacks é transferida para o emissor quando a autenticação é bem-sucedida
- Redução de fraudes — adiciona uma camada de verificação biométrica, SMS ou app bancário
- Conformidade regulatória — atende requisitos de Strong Customer Authentication (SCA)
O SDK integra o 3DS 2.0 via BP.Mpi (Braspag MPI), que suporta fluxos frictionless (sem interação do usuário) e challenge (com interação).
Fluxo de autenticação
Status possíveis
| Status | Descrição | Liability shift |
|---|---|---|
authenticated | Portador autenticado com sucesso. CAVV e ECI disponíveis. | Sim |
unenrolled | Cartão ou emissor não participam do programa 3DS. | Não |
failed | Autenticação falhou (portador não conseguiu se autenticar). | Não |
error | Erro técnico durante o processo. | Não |
cancelled | Timeout ou cancelamento pelo usuário. | Não |
Uso básico
const result = await client.threeds.authenticate({
amount: 15000, // R$ 150,00 em centavos
currency: 'BRL',
installments: 1,
card: {
number: '4000000000002701',
expirationMonth: '12'
Parâmetros da autenticação
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
amount | number | Sim | Valor em centavos. |
currency | string | Sim | Código da moeda (BRL, USD, EUR). |
installments | number | Não | Quantidade de parcelas (padrão: 1). |
card.number | string | Sim | Número do cartão. |
card.holderName | string | Não | Nome do portador. |
card.expirationMonth | string | Sim | Mês de validade. |
card.expirationYear | string | Sim | Ano de validade. |
customer.name | string | Sim | Nome do comprador. |
customer.email | string | Sim | Email do comprador. |
customer.phone | string | Sim | Telefone com DDI+DDD (ex: 5511999999999). |
address | object | Não | Endereço de cobrança (recomendado — melhora a taxa de aprovação). |
Endereço (opcional, recomendado)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
address.street | string | Sim | Logradouro. |
address.number | string | Sim | Número. |
address.complement | string | Não | Complemento. |
address.zipCode | string | Sim | CEP. |
address.neighborhood | string | Sim | Bairro. |
address.city | string | Sim | Cidade. |
address.state | string | Sim | Estado (UF, 2 caracteres). |
address.country | string | Sim | País (código ISO, ex: BR). |
Opções adicionais
const result = await client.threeds.authenticate(dados, {
timeout: 120000, // Timeout em ms (padrão: 120s)
});Retorno (ThreeDSResult)
| Campo | Tipo | Descrição |
|---|---|---|
status | string | Status da autenticação (ver tabela acima). |
cavv | string | Cryptogram de autenticação. Presente quando status === 'authenticated'. |
eci | string | Electronic Commerce Indicator. Indica o nível de autenticação. |
xid | string | Identificador da transação 3DS. |
version | string | Versão do protocolo 3DS utilizado. |
referenceId | string | Identificador de referência da sessão. |
Fluxo frictionless vs. challenge
O emissor decide se o fluxo será frictionless (sem interação) ou challenge (com interação). Essa decisão é baseada em:
- Perfil de risco da transação
- Histórico do portador do cartão
- Valor da transação
- Dados do dispositivo e navegador
No fluxo frictionless, a autenticação acontece em segundo plano e o resultado é retornado diretamente. No fluxo challenge, o SDK exibe automaticamente um modal com o iframe do banco emissor para que o usuário complete a verificação (SMS, biometria, app bancário etc.).
Enviar o endereço de cobrança (address) e dados completos do comprador aumenta significativamente a chance de um fluxo frictionless.
Informações coletadas automaticamente
O SDK coleta e envia automaticamente dados do navegador necessários para a avaliação de risco do emissor:
- User Agent, idioma e fuso horário
- Resolução de tela e profundidade de cor
- Suporte a Java e JavaScript
- Endereço IP público (via
api.ipify.org)
Nenhuma ação adicional é necessária — essas informações são coletadas transparentemente pelo método authenticate().
Cartões de teste
| Cartão | Comportamento |
|---|---|
4000000000002701 | Autenticação bem-sucedida (frictionless) |
4000000000002503 | Exige challenge |
4000000000002370 | Autenticação falha |
Esses cartões são para testes apenas. Em produção, o comportamento depende do emissor real do cartão.
Tratamento de erros
import { ThreeDSError, TimeoutError } from '@soarlabz/security-sdk';
try {
const result = await client.threeds.authenticate(dados);
switch (result.status) {
case 'authenticated':
// Prossiga com a cobrança
break
Moedas suportadas
| Moeda | Código | Código numérico ISO 4217 |
|---|---|---|
| Real Brasileiro | BRL | 986 |
| Dólar Americano | USD | 840 |
| Euro | EUR | 978 |
| Peso Argentino | ARS | 032 |
| Libra Esterlina | GBP | 826 |

