Prepare dados do dispositivo e conclua autenticações antes ou depois da cobrança, conforme a adquirente.
O SDK 1.2.0 suporta autenticação antes da cobrança (por exemplo, Cielo/BP.Mpi) e 3DS inteligente depois da cobrança (Zendry). As capacidades incluem conexões próprias, subcontas e processamento elegível pela conexão master.
| Modo | Preparação no navegador | Conclusão |
|---|---|---|
pre_charge | Autenticação do emissor, com CAVV/ECI quando disponíveis | Envie os dados e a sessão junto da cobrança |
device_only | Zendry.threeDS() coleta device e user-agent, sem cartão nem credenciais no script Zendry | Crie a cobrança; se ela retornar action, chame completeThreeDS uma única vez |
Em device_only, status: 'authenticated' significa que a preparação do dispositivo terminou. Não comprova autorização do emissor, captura financeira ou liability shift. O pedido só deve ser liberado após confirmação do seu backend por webhook validado ou reconsulta à adquirente.
Crie uma chave por intenção de pagamento e reutilize-a desde a preparação até a cobrança. Ela também faz a seleção de rota escolher a mesma conexão quando existem regras de tráfego.
const idempotencyKey = crypto.randomUUID();
const prepared = await client.preparePayment({
...paymentRequest,
idempotencyKey,
paymentMethod: 'credit_card',
paymentLinkId: linkId, // opcional para integrações fora do link de pagamento
});
if (!prepared.success) throw prepared.error;
// Este endpoint é do seu backend. Chaves secretas ficam somente nele.
const charge = await createChargeOnYourBackend({
amount: paymentRequest.amount,
currency: paymentRequest.currency,
preparePayment() coleta device também quando smart_threeds: true e threeds: false. Isso permite scoring e autenticação após a cobrança quando o 3DS antes da cobrança está desligado. Se você usar skipThreeDS, sua integração continua responsável por fornecer os dados exigidos pela adquirente.
const result = await client.threeds.authenticate({
amount: 15000,
currency: 'BRL',
installments: 1,
paymentMethod: 'credit_card',
paymentLinkId: linkId,
idempotencyKey,
card: {
| Campo de entrada | Descrição |
|---|---|
amount | Valor inteiro em centavos |
currency | Código da moeda com três letras |
paymentMethod | credit_card ou debit_card; padrão credit_card |
paymentLinkId | Vínculo opcional ao link; use no checkout público |
idempotencyKey | Mesma chave enviada na cobrança |
card.expirationYear | Ano de quatro dígitos; o SDK normaliza dois dígitos para 20AA |
customer | Nome, email e telefone do comprador |
address | Endereço de cobrança recomendado |
| Campo de retorno | Descrição |
|---|---|
status | authenticated, unenrolled, failed ou error |
mode | pre_charge ou device_only |
sessionId | Sessão da plataforma, enviada como three_ds_session_id |
cavv / eci / xid | Dados da autenticação antes da cobrança, quando disponíveis |
device / userAgent | Contexto do comprador para a autenticação depois da cobrança |
Quando seu backend já sabe que a rota usa Zendry, a coleta não depende de chave pública:
import { Logger, ZendryController } from '@soarlabz/security-sdk';
const zendry = new ZendryController(new Logger(false));
const collected = await zendry.threeDS();
// Envie collected.device e collected.user_agent ao seu backend.O SDK carrega o script oficial https://api.zendry.co/sdk/v1/zendry.js. device contém language, screen_height, screen_width e time_zone_offset. O offset é em horas com sinal: Brasil = -3. Não use minutos de Date.getTimezoneOffset() nesse campo.
A documentação Zendry indica device opcional no esquema geral, mas obrigatório para contas com postura de risco reforçada. Envie-o em toda venda Zendry. Em integrações em cadeia, IP e user-agent devem ser os do comprador; headers da chamada backend → Zendry representam o servidor.
captured com confirmation_pending: false no servidor.O sandbox Zendry não executa 3DS real. Um cartão sintético aprovado no sandbox valida o transporte, não o challenge do emissor. A homologação do challenge real precisa de uma transação de produção autorizada e comprovação completa navegador → adquirente → webhook/reconsulta → confirmação financeira.