Autentique o portador do cartão junto ao emissor usando o protocolo 3D Secure 2.0 (EMV 3DS).
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:
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).
| 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 |
const result = await client.threeds.authenticate({
amount: 15000, // R$ 150,00 em centavos
currency: 'BRL',
installments: 1,
card: {
number: '4000000000002701',
expirationMonth: '12'
| 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). |
| 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). |
const result = await client.threeds.authenticate(dados, {
timeout: 120000, // Timeout em ms (padrão: 120s)
});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. |
O emissor decide se o fluxo será frictionless (sem interação) ou challenge (com interação). Essa decisão é baseada em:
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.
O SDK coleta e envia automaticamente dados do navegador necessários para a avaliação de risco do emissor:
api.ipify.org)Nenhuma ação adicional é necessária — essas informações são coletadas transparentemente pelo método authenticate().
| 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.
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
| 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 |