É opcional, e o padrão é não autenticar. Você cobra no cartão sem passar por aqui — veja
Cobrar no cartão. Esta página é para quando você QUER a
transferência de responsabilidade e está disposto a um passo a mais no navegador.
Você precisa disto?
Vale a pena quando o seu produto atrai fraude: ticket alto, entrega digital imediata, comprador novo. Não vale quando o desafio custaria mais conversão do que a fraude custa — e essa conta é sua, não nossa.Como pedir
Um campo, emPOST /v1/charges:
required, a cobrança passa a exigir card.three_ds — pedir autenticação e não autenticar
é incoerente, e volta 422. Sem o campo, nada é exigido.
O interruptor de 3DS da sua conta, no painel, não vale nesta API. Ele governa os checkouts
hospedados por nós, onde somos nós que montamos a tela e podemos pedir o desafio ao comprador.
Aqui quem monta a tela é você, e exigir um identificador que só o navegador produz devolveria um
422 impossível de resolver a quem cobra de um servidor.Como rodar o desafio
Três passos, e a ordem importa:1
Peça o token, no envio do formulário
POST /v1/three_ds_tokens devolve o token e o endereço da
biblioteca do mesmo ambiente. O token vale cinco minutos e serve uma vez só — pedi-lo na
abertura da página entrega um token morto a quem demora a preencher o endereço.2
Rode o desafio, com o número do cartão em claro
O autenticador precisa do número, da validade e do endereço de cobrança. É por isso que o desafio
vem antes de
vext.createToken(): tokenizar primeiro queimaria o token de um minuto durante o
desafio, que pode levar mais que isso.3
Tokenize e cobre
Com o desafio concluído, chame
vext.createToken() e crie a cobrança com
three_d_secure: "required" e o resultado em card.three_ds.POST /v1/three_ds_tokens responde 422 three_ds_unavailable com o
motivo — e não um erro genérico. Quem lê é o seu servidor, para quem o motivo é acionável.
O que você precisa repassar
Quem tokeniza o cartão na própria página recebe do autenticador o resultado do desafio. Repasse-o ao seu servidor exatamente como veio e envie-o emcard.three_ds.
Esse par transaction_id + status é a prova da autenticação. Perdê-lo no caminho significa ter
incomodado o comprador com um desafio e pagado a contestação assim mesmo.
O resultado, na cobrança
card.three_d_secure.status traz uma letra do padrão da bandeira:
Na entrada, em
card.three_ds.status, aceitamos só Y e A. Os outros descrevem uma
autenticação que não deu certo, e mandá-los seria declarar uma proteção que não existe.
Cartão guardado não autentica
O autenticador precisa do número do cartão em claro, e um cartão no cofre é uma referência sem número. Os dois são fisicamente excludentes. Por issothree_d_secure: "required" junto de um card.id volta 403
one_click_requires_three_ds: você pediu autenticação num cartão que não pode autenticar. Cobrar
assim mesmo, fingindo que autenticou, entregaria a venda sem transferência de responsabilidade — e
você descobriria depois de já ter perdido a contestação.
Sem pedir required, o cartão guardado cobra normalmente. Ele só não tem liability shift, como
qualquer cobrança sem autenticação.
E na assinatura?
Uma cobrança de série não tem comprador na tela para desafiar, então ela nunca autentica.O que dá errado
O token que inicia a autenticação vale cinco minutos e serve uma vez só. Peça-o no momento em
que o comprador envia o formulário, e não quando a página abre: emitido cedo, ele já estaria morto
para quem levou algum tempo preenchendo o endereço.
Veja também
Cobrança no cartão
O objeto
card, parcelas e a recusa que cria cobrança.Cofre de cartões
Por que o cofre e a autenticação não convivem.
Ficou algo de fora? Chame no WhatsApp. Se o assunto for uma chamada específica, informe o horário dela; se for uma entrega de webhook, informe o
X-Vext-Delivery — é por ele que localizamos a tentativa, a resposta do seu servidor e o horário.