Criar cobrança com 3DS

Autentique cobranças com cartão de crédito junto ao banco emissor.

O 3D Secure (3DS) é um protocolo de autenticação adicional para transações com cartão de crédito. Ele verifica a identidade do portador do cartão junto ao banco emissor antes de aprovar a transação, o que adiciona uma camada de segurança contra fraudes.

Para acionar o 3DS, envie os objetos threeDSecure e deviceInfo junto com os dados do cartão ao criar ou pagar uma cobrança com cartão de crédito.

📘

Importante

Ao concluir este guia, você terá enviado uma cobrança com cartão de crédito autenticada via 3DS, redirecionado o pagador para o desafio do banco emissor quando necessário e acompanhado o resultado por Webhook.

Quando utilizar

Utilize o 3DS quando sua integração precisar:

  • autenticar o portador do cartão junto ao banco emissor antes da aprovação;
  • criar uma cobrança avulsa ou parcelada com cartão de crédito;
  • pagar com cartão uma cobrança ou um parcelamento já criado.

Rotas que suportam 3DS

NecessidadeUtilize
Criar uma cobrança e pagar no cartãoPOST /v3/payments
Criar uma cobrança e pagar no cartão com resposta reduzidaPOST /v3/lean/payments
Criar um parcelamento e pagar no cartãoPOST /v3/installments
Pagar com cartão uma cobrança já criadaPOST /v3/payments/{id}/payWithCreditCard
Pagar com cartão um parcelamento já criadoPOST /v3/payments/{id}/payWithCreditCard, informando o id da primeira parcela em aberto

Não existe rota de pagamento no nível do parcelamento. Para pagar um parcelamento já criado, use a rota de cobranças com o id de uma parcela.

Antes de começar

Garanta que:

  • o 3DS está habilitado na sua conta de produção. Para habilitar, entre em contato com o nosso time de suporte;
  • o cliente está cadastrado e o ID dele está armazenado. Consulte: o Cadastro de clientes;
  • sua aplicação recebe Webhooks de cobranças. Consulte os: Eventos para cobranças;
  • sua aplicação tem uma URL HTTPS para receber o pagador após o desafio (callbackUrl).

Defina:

  • se a cobrança será criada e paga na mesma requisição ou se uma cobrança já criada será paga depois;
  • se a venda será uma cobrança avulsa ou parcelada;
  • qual página o pagador verá ao voltar do desafio;
  • como o seu checkout vai coletar os dados do dispositivo do pagador.

Como funciona

%%{init: {"flowchart": {"nodeSpacing": 18,"rankSpacing": 24,"diagramPadding": 4,"padding": 7}}}%%
flowchart TD
A["Coletar os dados do dispositivo no checkout"] --> B["Enviar a requisição com threeDSecure e deviceInfo"]
B --> C{"A resposta retornou threeDSecureChallengeUrl?"}

C --> CSim(("Sim"))
C --> CNao(("Não"))

CSim --> D["Redirecionar o pagador para o desafio"]
D --> E["Pagador se autentica no banco emissor"]
E --> F["Asaas redireciona o pagador para a callbackUrl"]
F --> G["Receber o Webhook com o resultado"]
CNao --> G

classDef inicio fill:#DBEAFE,stroke:#2563EB,color:#1E3A8A,stroke-width:3px
classDef decisao fill:#FEF3C7,stroke:#D97706,color:#78350F,stroke-width:3px
classDef correcao fill:#FFEDD5,stroke:#EA580C,color:#7C2D12,stroke-width:2px
classDef validacao fill:#E0F2FE,stroke:#0284C7,color:#0C4A6E,stroke-width:2px
classDef sucesso fill:#DCFCE7,stroke:#16A34A,color:#14532D,stroke-width:3px

classDef respostaSim fill:#22C55E,stroke:#15803D,color:#FFFFFF,stroke-width:3px
classDef respostaNao fill:#EF4444,stroke:#B91C1C,color:#FFFFFF,stroke-width:3px

class A inicio
class B validacao
class C decisao
class D,E,F correcao
class G sucesso

class CSim respostaSim
class CNao respostaNao

linkStyle default stroke:#94A3B8,stroke-width:2px
linkStyle 2 stroke:#22C55E,stroke-width:4px
linkStyle 3 stroke:#EF4444,stroke-width:4px

O banco emissor decide qual tipo de autenticação será aplicado:

Tipo de autenticaçãoO que acontece
DATA_ONLYAutenticação silenciosa, sem interação do pagador. A transação é avaliada com base nos dados do dispositivo
FRICTIONLESSO banco emissor aprova automaticamente, sem desafio visível ao pagador
ISSUER_CHALLENGEO banco emissor exige uma ação do pagador, como digitar um código OTP ou autenticar no app do banco

A resposta da requisição não é a confirmação final quando há desafio. O resultado da autenticação e da captura chega por Webhook.

1. Colete os dados do dispositivo

No momento do checkout, colete no browser ou app do pagador as informações que o banco emissor usa para avaliar o risco da transação.

Exemplo de coleta no browser

const deviceInfo = {
  colorDepth: window.screen.colorDepth,
  screenHeight: window.screen.height,
  screenWidth: window.screen.width,
  timeZoneOffset: new Date().getTimezoneOffset() / 60, // em horas: 180 minutos viram 3
  language: navigator.language,
  userAgent: navigator.userAgent
};

O remoteIp deve ser obtido pelo seu backend, a partir do IP de origem da requisição do pagador.

⚠️

Atenção

O campo timeZoneOffset deve ser enviado em horas (ex: 3 para UTC-3). O método getTimezoneOffset() do JavaScript retorna o valor em minutos (180 para UTC-3), então divida o resultado por 60 antes de enviar.

2. Envie a requisição com threeDSecure e deviceInfo

Inclua os objetos threeDSecure e deviceInfo no corpo da requisição, além dos campos padrão da cobrança ou do parcelamento.

O exemplo abaixo paga uma cobrança já criada:

POST /v3/payments/{id}/payWithCreditCard

Consulte o endpoint: Pagar uma cobrança com cartão de crédito.

Exemplo de requisição

{
  "creditCard": {
    "holderName": "João da Silva",
    "number": "4111111111111111",
    "expiryMonth": "05",
    "expiryYear": "2028",
    "ccv": "123"
  },
  "creditCardHolderInfo": {
    "name": "João da Silva",
    "email": "[email protected]",
    "cpfCnpj": "12345678901",
    "postalCode": "01310-100",
    "address": "Av. Paulista",
    "addressNumber": "100",
    "province": "Centro",
    "phone": "11987654321"
  },
  "threeDSecure": {
    "callbackUrl": "https://seusite.com.br/callback/3ds"
  },
  "deviceInfo": {
    "colorDepth": 24,
    "screenHeight": 900,
    "screenWidth": 1440,
    "timeZoneOffset": 3,
    "language": "pt-BR",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...",
    "remoteIp": "200.100.50.25"
  }
}

Os mesmos objetos são aceitos em POST /v3/payments, POST /v3/lean/payments e POST /v3/installments, junto com os campos de criação da cobrança ou do parcelamento.

📘

Pagar um parcelamento já criado

Use POST /v3/payments/{id}/payWithCreditCard informando o id da primeira parcela em aberto. Os IDs das parcelas podem ser consultados em GET /v3/installments/{id}/payments.

Consulte o endpoint: Listar cobranças de um parcelamento

3. Redirecione o pagador quando houver desafio

Verifique o campo threeDSecureChallengeUrl na resposta:

  • preenchido: o banco emissor exige um desafio. Redirecione o pagador para essa URL;
  • null: a autenticação ocorreu de forma silenciosa (DATA_ONLY ou FRICTIONLESS) e não é preciso redirecionar.

Exemplo de resposta com desafio pendente

{
  "id": "pay_xxxxxxxxxxxxx",
  "status": "PENDING",
  "billingType": "CREDIT_CARD",
  "value": 100.00,
  "threeDSecureChallengeUrl": "https://banco-emissor.com.br/3ds/challenge?token=abc123"
}

Exemplo de resposta sem desafio (frictionless ou data-only)

{
  "id": "pay_xxxxxxxxxxxxx",
  "status": "CONFIRMED",
  "billingType": "CREDIT_CARD",
  "value": 100.00,
  "threeDSecureChallengeUrl": null
}

Após o pagador concluir o desafio no ambiente do banco emissor, o Asaas redireciona o pagador para a callbackUrl informada.

4. Acompanhe o resultado por Webhook

Ao final do fluxo 3DS, o Asaas envia um Webhook para a URL configurada na sua conta com um dos eventos abaixo. Você também pode consultar o status da cobrança para confirmar o resultado.

EventoTratamento
PAYMENT_CONFIRMEDO desafio foi concluído e a captura do cartão foi aprovada. Considere o pagamento confirmado
PAYMENT_CREDIT_CARD_CAPTURE_REFUSEDO desafio foi concluído, mas a adquirente recusou a captura. Não considere o pagamento confirmado
PAYMENT_CREDIT_CARD_THREE_D_SECURE_CHALLENGE_FAILEDO pagador falhou ou abandonou o desafio 3DS. A cobrança não é capturada

Consulte os: Eventos para cobranças.

Campos importantes

CampoFinalidade
threeDSecure.callbackUrlObrigatório para acionar o 3DS. URL para onde o pagador volta após o desafio. Deve ser HTTPS em produção, com até 2000 caracteres
deviceInfo.timeZoneOffsetFuso horário do dispositivo em relação ao UTC, em horas (ex: 3 para UTC-3)
deviceInfo.remoteIpIP do dispositivo do pagador. Obtenha pelo seu backend
deviceInfo.userAgentUser-Agent do browser do pagador
threeDSecureChallengeUrlRetornado na resposta. URL do desafio para onde o pagador deve ser redirecionado, ou null quando não há desafio

Os campos de deviceInfo não são obrigatórios, mas são usados pelo banco emissor para avaliar o risco da transação. Envie todos os que sua integração conseguir coletar.

Erros comuns

⚠️

Atenção

  • timeZoneOffset em minutos: enviar o retorno direto de getTimezoneOffset() (ex: 180) está incorreto. Divida por 60 e envie em horas.
  • Rota de parcelamento inexistente: POST /v3/installments/{id}/payWithCreditCard não existe e retorna 404. Use POST /v3/payments/{id}/payWithCreditCard com o id da parcela.
  • Testes em sandbox: em sandbox, todas as transações são aprovadas automaticamente, mesmo com os parâmetros do 3DS. Ainda não é possível testar o fluxo de desafio nesse ambiente.
  • 3DS não habilitado: para uso em produção, entre em contato com o nosso time de suporte para habilitar o 3DS.

Confirme o resultado

Após a requisição, confirme se:

  • a resposta retornou o id da cobrança;
  • o pagador foi redirecionado quando threeDSecureChallengeUrl veio preenchido;
  • o pagador voltou para a callbackUrl após o desafio;
  • sua aplicação recebeu um dos eventos de Webhook do fluxo 3DS;
  • o status da cobrança está de acordo com o evento recebido.

Boas práticas

  • Colete os dados de deviceInfo no dispositivo do pagador, no momento do checkout.
  • Envie timeZoneOffset em horas.
  • Redirecione o pagador assim que receber threeDSecureChallengeUrl.
  • Use o Webhook ou a consulta da cobrança como confirmação final, e não apenas o retorno do pagador à callbackUrl.
  • Trate os três eventos de Webhook do fluxo 3DS.
  • Na página da callbackUrl, informe ao pagador que o pagamento está em processamento até receber o resultado.

Referência da API

Próximos passos


Did this page help you?