Pular para o conteúdo principal

3D Secure

Quick Reference

WhatAutenticação do portador antes da autorização
WhyTransferência de responsabilidade para o emissor e prevenção de fraude com fluxo de desafio ou sem fricção
Reading Time15 min
DifficultyIntermediate
PrerequisitesHost-to-Host ou SDK → Autenticação

Como o 3DS funciona com a A55

Defina threeds_authentication: true na cobrança e envie um objeto device_info completo. A A55 trata o protocolo 3DS, encaminha ao emissor e devolve o resultado.

SDK vs API

O SDK JavaScript executa a coleta de dados do dispositivo (DDC) automaticamente via A55Pay.authentication(). Integrações no servidor (H2H) enviam os campos de device_info no JSON da cobrança.


Sem fricção vs desafio

AspectoSem fricçãoDesafio
DecisãoEmissor aprova em silêncio com base no riscoEmissor exige interação do portador
Impacto na UXZero (invisível para o comprador)Redirecionamento para url_3ds ou popup em iframe
Quando ocorreRisco baixo + dados ricos do dispositivoRisco alto ou política do emissor
ConversãoMaiorMenor (adiciona fricção)
Transferência de responsabilidadeSimSim
Taxa típica70–85% das transações 3DS15–30%

Valores de ECI


Integração passo a passo

1

Coletar device_info no navegador

Capture valores reais do navegador no cliente. Cada campo melhora o modelo de risco do emissor.

const deviceInfo = {
ip_address: await fetch('/api/ip').then(r => r.text()),
user_agent: navigator.userAgent,
http_accept_content: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
http_accept_browser_value: '*/*',
http_browser_language: navigator.language,
http_browser_java_enabled: navigator.javaEnabled?.() ?? false,
http_browser_javascript_enabled: true,
http_browser_color_depth: String(screen.colorDepth),
http_browser_screen_height: String(screen.height),
http_browser_screen_width: String(screen.width),
http_browser_time_difference: String(new Date().getTimezoneOffset()),
};
// Send deviceInfo to your backend for the charge request
2

Criar cobrança com threeds_authentication: true

curl -sS -X POST "https://core-manager.a55.tech/api/v1/bank/wallet/charge/" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"wallet_uuid": "00000000-0000-4000-8000-000000000001",
"type_charge": "credit_card",
"card_name": "JANE DOE",
"card_number": "4111111111111111",
"card_expiry_month": 12,
"card_expiry_year": 2030,
"card_cvv": "123",
"amount": 10000,
"currency": "BRL",
"installment_count": 1,
"threeds_authentication": true,
"device_info": {
"ip_address": "203.0.113.10",
"user_agent": "Mozilla/5.0 ...",
"http_accept_content": "text/html",
"http_accept_browser_value": "*/*",
"http_browser_language": "pt-BR",
"http_browser_java_enabled": false,
"http_browser_javascript_enabled": true,
"http_browser_color_depth": "24",
"http_browser_screen_height": "900",
"http_browser_screen_width": "1440",
"http_browser_time_difference": "180"
},
"webhook_url": "https://merchant.example/webhooks/a55",
"redirect_url": "https://merchant.example/return"
}'
3

Tratar a resposta

{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "confirmed",
"eci": "05",
"authentication_status": "success",
"reference_external_id": "ord_001"
}

Não é necessário redirecionamento — a cobrança foi autenticada em silêncio.

4

Tratar o desafio 3DS (se pendente)

Se a resposta incluir url_3ds, redirecione o comprador. Após o desafio, escute postMessage:

window.addEventListener('message', function (event) {
if (event.data?.event === '3ds-auth-complete') {
const chargeUuid = event.data.chargeUuid;
// Fetch charge status from your backend, then update UI
}
});
Como o desafio funciona internamente
  1. Sua página redireciona (ou usa iframe) para confirmacion.a55.tech/charge/{uuid}
  2. A página 3DS carrega o ACS (Access Control Server) do emissor em um iframe aninhado
  3. O portador conclui a verificação (OTP, biometria etc.)
  4. O ACS redireciona para confirmacion.a55.tech/validate/{uuid}
  5. A A55 valida a autenticação e envia postMessage com 3ds-auth-complete de volta pela cadeia de janelas
5

Confirmar via webhook

Use sempre o webhook como fonte da verdade. Configure webhook_url na cobrança para receber atualizações assíncronas mesmo se o comprador fechar o navegador.

{
"charge_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "paid",
"transaction_reference": "txn_ref_001"
}

Fluxo ponta a ponta


Campos de device_info

CampoTipoObrigatórioDescrição
ip_addressstringSimIP público do cliente
user_agentstringSimString do user agent do navegador
http_accept_contentstringSimCabeçalho HTTP Accept
http_accept_browser_valuestringSimValor Accept do navegador
http_browser_languagestringSimIdioma do navegador (ex.: pt-BR)
http_browser_java_enabledbooleanSimPlugin Java habilitado
http_browser_javascript_enabledbooleanSimJavaScript habilitado
http_browser_color_depthstringSimProfundidade de cor da tela
http_browser_screen_heightstringSimAltura da tela em pixels
http_browser_screen_widthstringSimLargura da tela em pixels
http_browser_time_differencestringSimDeslocamento UTC em minutos
device_idstringNãoIdentificador estável do dispositivo
session_idstringNãoID da sessão de checkout
Qualidade dos dados

device_info incompleto ou sintético aumenta taxas de desafio e recusas. Colete valores reais do navegador no cliente e repasse ao servidor. Nunca fixe esses valores no código.


DDC no SDK (A55Pay.authentication)

Com o SDK JavaScript, você pode executar o DDC de forma independente:

A55Pay.authentication({
transactionReference: 'charge-uuid-or-ref',
cardBrand: 'visa',
cardNumber: '4111111111111111',
cardExpiryMonth: '12',
cardExpiryYear: '2030',
onSuccess: (payload) => {
// payload.sessionId, payload.accessToken, payload.referenceId
// Use sessionId for the charge request
},
onError: (err) => {
// DDC failed — proceed without session or handle error
},
});

Observação: payV2() executa o DDC automaticamente antes de processar. Você só precisa de authentication() se estiver gerenciando o fluxo manualmente.


Endpoint de validação

POST /api/v1/bank/public/charge/authentication/{uuid}/validate

Use o uuid da cobrança do fluxo 3DS. A A55 valida os metadados da autenticação e retorna o resultado final.


Testar com cartões de sandbox

Card NumberBrandScenarioExpected Status
4111 1111 1111 1111Visa3DS sem fricção — confirmadoconfirmed
4000 0000 0000 0101Visa3DS com desafio obrigatórioconfirmed
4000 0000 0000 0002Visa3DS — recusado pelo emissordeclined
5500 0000 0000 0004Mastercard3DS sem fricção — confirmadoconfirmed
4000 0000 0000 0069Visa3DS — erro de processamentoerror

Quer mais aprovações sem desafio?

Visa Data Only compartilha dados enriquecidos da transação com emissores pelas trilhas do 3DS — sem um único redirecionamento de desafio. Comerciantes no piloto da Square viram até +646 pontos-base de melhora em 9 meses em 6 milhões de transações.

Sem fricção. Sem abandono de carrinho. A A55 oferece isso hoje com um único flag: data_only: true.

O trade-off: não há transferência de responsabilidade (a fraude fica com o comerciante). Para alto volume e baixo risco na América Latina, esse trade-off muitas vezes se paga várias vezes.

Saiba como ativar Data Only →