These docs are for v2.1. Click to read the latest docs for v4.1.

Criando e pagando com autenticação 3DS - Validação interna

O 3DS (3-Domain Secure) é um protocolo de segurança para transações financeiras realizadas no comércio eletrônico com o objetivo de autenticar e fornecer ao usuário uma boa experiência de compra.

Para integradores PagSeguro, que desejam realizar cobranças mais seguras e evitar os custos com chargeback em possíveis transações fraudulentas, o 3DS PagSeguro é uma solução que permite o envio das transações para autenticação via PagSeguro.

Existem dois tipos de autenticação:

Sem desafio (sem atrito): quando o banco emissor entende que as informações fornecidas são suficientes para autenticar o consumidor
Com desafio (com atrito): quando é necessária uma etapa de validação adicional, uma ação que o consumidor precisa realizar, por exemplo fornecer algum dado enviado via SMS ou a abertura do aplicativo para confirmação da compra. A decisão sobre a aplicação do desafio, o tipo e a tela de desafio no checkout são de responsabilidade do banco emissor do cartão.

JavaScript PagSeguro

Essa SDK é responsável por oferecer a funcionalidade de autenticação 3DS pelo PagSeguro.

🚧

IMPORTANTE

Antes de utilizar a SDK, devem ser geradas uma chave pública e uma sessão conforme os exemplos disponibilizados nesta documentação.

Utilizando a SDK

Para utilizar a SDK de autenticação serão necessários 4 passos:

  1. Importar a SDK
  2. Configurar a SDK
  3. Montar o objeto de request
  4. Chamar o método de autenticação da SDK

1. Importar a SDK

Para importar a SDK você deve adicionar a seguinte tag em seu arquivo HTML:

<script src="https://assets.pagseguro.com.br/checkout-sdk-js/rc/dist/browser/pagseguro.min.js"></script>

🚧

IMPORTANTE

Caso você faça algum controle de acesso por domínios na sua aplicação, é necessário permitir a execução de js e abertura de iframe de domínio "*.cardinalcommerce.com"

2. Configurar a SDK

Para configurar a SDK é necessário criar uma chave pública e em seguida gerar uma sessão, como exemplificado em Criar suas chaves públicas e Criar uma sessão desta documentação. Em seguida, você deve chamar o método setUp e informar a sessão e o ambiente a serem utilizados.

PagSeguro.setUp({
    session: 'SUA_SESSAO',
    env: 'ENV'
});
CampoDescrição
sessionUma sessão gerada por você que indica quem é o merchant dono das interações feitas pela SDK.

Essa sessão é válida apenas por um determinado tempo (atualmente 30 minutos) e após esse tempo ela precisa ser renovada (é necessário gerar uma nova sessão).

envO ambiente da SDK que você irá utilizar. Aceita os seguintes valores:
PROD
SANDBOX

🚧

Sessão expirada

Caso a sessão expire durante o fluxo, deve ser gerada uma nova sessão e chamar novamente o método setUp:

PagSeguro.setUp({
    session: 'SUA_NOVA_SESSAO',
});

3. Montar o objeto de request

Para realizar a autenticação você precisará criar uma request informando os dados da compra:

CampoDescriçãoObrigatórioRestrições
dataObjeto que contém os dados da compraSim
data.customerObjeto que contém os dados do compradorSim
data.customer.nameNome do compradorSimNão pode conter números.
Não pode conter caracteres especiais.
Precisa conter pelo menos dois nomes
data.customer.emailEmail do compradorSimPrecisa ser um email válido
data.customer.phones[]Lista de telefones do compradorSimCaso seja informado deve conter pelo menos um elemento.
Pelo menos um dos objetos deve ser do Type: MOBILE
data.customer.phones[].countryDDI do telefoneSimDeve ser numérico
data.customer.phones[].areaDDD do telefoneSimDeve ser numérico
data.customer.phones[].numberNúmero do telefoneSimDeve ser numérico. Deve ter 8 ou 9 dígitos
data.customer.phones[].typeTipo do telefoneSimValores aceitos:
MOBILE
HOME
BUSINESS
data.paymentMethodObjeto que contém os dados do meio de pagamentoSim
data.paymentMethod.typeTipo do meio de pagamentoSimValores aceitos:
CREDIT_CARD
DEBIT_CARD
data.paymentMethod.installmentsEm quantas parcelas o pagamento será realizadoSimDeve ser um valor entre 1 e 12
data.paymentMethod.cardObjeto que contém os dados do cartão utilizado na compraSimUm desses deve ser informado:
paymentMethod.card.id
ou
paymentMethod.card.encrypted
ou
(
paymentMethod.card.number,
paymentMethod.card.expMonth,
paymentMethod.card.expYear e
paymentMethod.card.holder.name
)
data.paymentMethod.card.idId do cartão tokenizadoCondicionalCartão tokenizado válido
data.paymentMethod.card.encryptedCriptograma do cartão criptografadoCondicionalCartão criptografado válido
data.paymentMethod.card.numberNúmero do cartãoCondicionalNúmero valido pelo algoritimo de Luhn.
Deve ter entre 13 e 21 digitos
data.paymentMethod.card.expMonthMês de expiração do cartãoCondicionalDeve ser um Número entre 1 e 12
data.paymentMethod.card.expYearAno de expiração do cartãoCondicionalDeve ser um Número de 4 digitos
data.paymentMethod.card.holderObjeto que contém os dados do portador do cartãoCondicional
data.paymentMethod.card.holder.nameNome do portador do cartãoCondicional
data.amountObjeto que contém os dados do valor da compraSim
data.amount.valueValor da compra em centavosSimDeve ser no mínimo 100
data.amount.currencyCódigo da moeda utilizada para cobrançaSimValores aceitos:
BRL
data.billingAddressObjeto que contém os dados do endereço de cobrança do cartãoCondicionalPelo menos um desses deve ser informado:
billingAddress
ou
shippingAddress
data.billingAddress.streetRua do endereçoSim
data.billingAddress.numberNúmero do endereçoSim
data.billingAddress.complementComplemento do endereçoOpcional
data.billingAddress.cityCidade do endereçoSim
data.billingAddress.regionCodeCódigo do estado do endereçoSim
data.billingAddress.countryCódigo do país do endereçoSimDeve ser um valor ISO 3166-1 alpha-3
data.billingAddress.postalCodeCódigo postal do endereçoSimDeve ter entre 5 e 10 dígitos
data.shippingAddressObjeto que contém os dados do endereço de entrega da compraCondicional
data.shippingAddress.streetRua do endereçoSim
data.shippingAddress.numberNúmero do endereçoSim
data.shippingAddress.complementComplemento do endereçoCondicional
data.shippingAddress.cityCidade do endereçoSim
data.shippingAddress.regionCodeCódigo do estado do endereçoSim
data.shippingAddress.countryCódigo do país do endereçoSimDeve ser um valor ISO 3166-1 alpha-3
data.shippingAddress.postalCodeCódigo postal do endereçoSimDeve ter entre 5 e 10 dígitos
dataOnlyFlag indicando o fluxo 3DS Data-OnlySimDeve ser sempre false
beforeChallengeUma função que recebe um parâmetro e é chamada antes de um desafio.
É indicada caso você queira fazer algo antes da exibição do desafio, seja uma chamada ao seu backend, uma interação com o usuário, etc.
IMPORTANTE: Caso optar por definir essa função você precisa chamar a função que abre o desafio manualmente como está exemplificado a seguir.
Opcional

Caso você utilize a função beforeChallenge você receberá um parâmetro nessa função que contém os seguintes atributos:

CampoDescriçãoObrigatório
brandBandeira do cartãoSim
issuerBanco emissor do cartãoCondicional (Caso exista na base de dados)
openFunção que exibe o desafioSim

4. Chamar o método de autenticação da SDK

Chamar o método authenticate3DS com a request montada e tratar o retorno.

 const request = {
                data: {
                    customer: {
                        name: 'Jose da Silva',
                        email: '[email protected]',
                        phones: [
                            {
                                country: '55',
                                area: '11',
                                number: '999999999',
                                type: 'MOBILE'
                            },
                            {
                                country: '55',
                                area: '11',
                                number: '999999999',
                                type: 'HOME'
                            },
                            {
                                country: '55',
                                area: '11',
                                number: '999999999',
                                type: 'BUSINESS'
                            }
                        ]
                    },
                    paymentMethod: {
                        type: 'DEBIT_CARD',
                        installments: 1,
                        card: {
                            number: number,
                            expMonth: "02",
                            expYear: "2026",
                            holder: {
                                name: "Joao Silva"
                            }
                        }
                    },
                    amount: {
                        value: 500,
                        currency: 'BRL'
                    },
                    billingAddress: {
                        street: 'Av. Paulista',
                        number: '2073',
                        complement: 'Apto 100',
                        regionCode: 'SP',
                        country: 'BRA',
                        city: 'São Paulo',
                        postalCode: '01311300'
                    },
                    shippingAddress: {
                        street: 'Av. Paulista',
                        number: '2073',
                        complement: 'Apto 100',
                        regionCode: 'SP',
                        country: 'BRA',
                        city: 'São Paulo',
                        postalCode: '01311300'
                    },
                    dataOnly: false
                }
            }
            PagSeguro.setUp({
                session: document.querySelector('SUA_SESSAO').value,
                env: document.querySelector('ENV').value
            });
            PagSeguro.authenticate3DS(request).then( result => {
                this.logResponseToScreen(result);
                this.stopLoading();
            }).catch((err) => {         
                if(err instanceof PagSeguro.PagSeguroError ) {
                    console.log(err);
                    console.log(err.detail);
                    this.stopLoading();
                }           
            })

O método authenticate3DS retorna uma Promise. Caso a Promisse conclua com sucesso (seja resolvida), o método then é acionado com objeto contendo os seguintes atributos:

Campo (Retorno)DescriçãoObrigatório
statusRepresenta o status final do fluxo de autenticação.
Pode ter 3 valores:
AUTH_FLOW_COMPLETED: fluxo de autenticação terminou com sucesso, a transação pode estar autenticada ou não autenticada. Deve continuar para o fluxo de cobrança.
AUTH_NOT_SUPPORTED: fluxo de autenticação não foi completado, pois o cartão não é elegível ao programa 3DS. Para o meio de pagamento DÉBITO a transação deve ser finalizada após este retorno.
CHANGE_PAYMENT_METHOD: fluxo de autenticação foi negado pelo PagSeguro e outro meio de pagamento deve ser solicitado ao cliente.
Sim
idRepresenta o id da autenticação. Esse mesmo id deverá ser adicionado na criação de cobrança que será realizada posteriormente.Condicional
Retornado quando status é AUTH_FLOW_COMPLETED

Exemplo dos possíveis retornos e tomadas de decisão:

📘

DECISÃO NO BACKEND

Os exemplos estão apenas ilustrando o uso dos dados, é recomendado que a decisão do que fazer com o resultado da autenticação seja tomada no backend.

Ao receber o retorno com status AUTH_FLOW_COMPLETED, uma cobrança deve ser criada utilizando o ID informado conforme a documentação Criar um pagamento com autenticação 3DS.

PagSeguro.authenticate3DS(request).then(result => {
  let authenticationStatus = result.status;
     
  switch (authenticationStatus) {
    case 'AUTH_FLOW_COMPLETED':
      let authenticationId = result.id;  // Seguir o fluxo para cobrança repassando o authenticationId para a API de Cobrança.
      break;
    case 'AUTH_NOT_SUPPORTED':   // Cartão não elegível ao 3DS. Para o meio de pagamento `DÉBITO` a transação deve ser finalizada após este retorno.
      break;
    case 'CHANGE_PAYMENT_METHOD':  // Solicite que o comprador troque o meio de pagamento, pois o mesmo não será aceito na cobrança.
      break;
  }
}).catch(err => {
  if (err instanceof PagSeguro.PagSeguroError) {   // No objeto de err podem ser encontrados mais detalhes sobre o erro.
    let traceId = err.details.traceId;
  }
});

Caso a Promisse conclua com erro (seja rejeitada), o método catch é acionado com um erro contendo um atributo chamado detail.

Erros em geral:

{
    httpStatus: 403,
    traceId: "afef73f5c5738c2b",
    message: "Expired session. Create a new session and call PagSeguro.setUp({ session: 'YOUR_NEW_SESSION'})"
}

Erros de validação (400 Bad Request):

{
    httpStatus: 400,
    traceId: "ad05751ed04291e3",
    message: "Invalid request parameters",
    errorMessages: [
        {
            code: "40002",
            description: "must be a well-formed email address",
            parameterName: "customer.email"
        },
        {
            code: "40001",
            description: "required parameter",
            parameterName: "billingAddress.regionCode"
        }
    ]
}
CampoDescriçãoObrigatório
detail.httpStatusIndica o status http retornado pelas APIs do PagSeguro que gerou o erroSim
detail.traceIdUm id único que identifica a sua requisição.
Em caso de um problema, guarde esse id, pois ele facilita o troubleshooting da sua requisição.
Sim
detail.messageUma mensagem indicando o problemaSim
detail.errorMessages[]Lista contendo detalhes de válidaçõesCondicional (Apenas se o httpStatus for 400)
detail.errorMessages[].codeCódigo da validaçãoSim
detail.errorMessages[].descriptionDescrição da validaçãoSim
detail.errorMessages[].parameterNameParâmetro enviado que gerou o erro de validaçãoSim

Cenários de teste

📘

Cartões de teste

Por se tratar de um ambiente controlado, devem ser informados os seguintes valores para simular diferentes cenários no ambiente Sandbox:

ValoresResponse
VISA
number informado no Pre-request Script = 4000000000002719

MASTERCARD
number informado no Pre-request Script = 5200000000001021

ELO
number informado no Pre-request Script = 6505050000001026
Fluxo de autenticação com cartão não elegível ao 3DS

transaction.status = AUTH_NOT_SUPPORTED
VISA
number informado no Pre-request Script = 4000000000002503

MASTERCARD
number informado no Pre-request Script = 5200000000001096

ELO
number informado no Pre-request Script = 6505050000001091
Fluxo de autenticação com cartão elegível ao 3DS com desafio

transaction.status = AUTH_FLOW_COMPLETED
VISA
number informado no Pre-request Script = 4000000000002370

MASTERCARD
number informado no Pre-request Script = 5200000000001104

ELO
number informado no Pre-request Script = 6505050000001109
Fluxo de autenticação com cartão elegível ao 3DS sem desafio

transaction.status = AUTH_FLOW_COMPLETED

Status atuais

StatusDescrição
AUTH_FLOW_COMPLETEDO processo de autenticação foi realizado com sucesso, dessa forma foi gerado um id do 3DS que poderá ter o resultado igual a Autenticado ou Não Autenticado.
AUTH_NOT_SUPPORTEDA autenticação 3DS não ocorreu, isso pode ter ocorrido por falhas na comunicação com emissor ou bandeira, ou algum controle que não possibilitou a geração do 3DS id, essa transação não terá um retorno de status de autenticação e seguirá como uma transação sem 3DS.
CHANGE_PAYMENT_METHODO emissor retornou que não recomenda esse método de pagamento, o ideal é que seja gerada uma nova transação com outro método de pagamento para que seja possível autenticar e aprovar essa transação.