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 umasessão
conforme os exemplos disponibilizados nesta documentação.
Utilizando a SDK
Para utilizar a SDK de autenticação serão necessários 4 passos:
- Importar a SDK
- Configurar a SDK
- Montar o objeto de request
- 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'
});
Campo | Descrição |
---|---|
session | Uma 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). |
env | O 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:
Campo | Descrição | Obrigatório | Restrições |
---|---|---|---|
data | Objeto que contém os dados da compra | Sim | |
data.customer | Objeto que contém os dados do comprador | Sim | |
data.customer.name | Nome do comprador | Sim | Não pode conter números. Não pode conter caracteres especiais. Precisa conter pelo menos dois nomes |
data.customer.email | Email do comprador | Sim | Precisa ser um email válido |
data.customer.phones[] | Lista de telefones do comprador | Sim | Caso seja informado deve conter pelo menos um elemento. Pelo menos um dos objetos deve ser do Type: MOBILE |
data.customer.phones[].country | DDI do telefone | Sim | Deve ser numérico |
data.customer.phones[].area | DDD do telefone | Sim | Deve ser numérico |
data.customer.phones[].number | Número do telefone | Sim | Deve ser numérico. Deve ter 8 ou 9 dígitos |
data.customer.phones[].type | Tipo do telefone | Sim | Valores aceitos:MOBILE HOME BUSINESS |
data.paymentMethod | Objeto que contém os dados do meio de pagamento | Sim | |
data.paymentMethod.type | Tipo do meio de pagamento | Sim | Valores aceitos: CREDIT_CARD DEBIT_CARD |
data.paymentMethod.installments | Em quantas parcelas o pagamento será realizado | Sim | Deve ser um valor entre 1 e 12 |
data.paymentMethod.card | Objeto que contém os dados do cartão utilizado na compra | Sim | Um 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.id | Id do cartão tokenizado | Condicional | Cartão tokenizado válido |
data.paymentMethod.card.encrypted | Criptograma do cartão criptografado | Condicional | Cartão criptografado válido |
data.paymentMethod.card.number | Número do cartão | Condicional | Número valido pelo algoritimo de Luhn. Deve ter entre 13 e 21 digitos |
data.paymentMethod.card.expMonth | Mês de expiração do cartão | Condicional | Deve ser um Número entre 1 e 12 |
data.paymentMethod.card.expYear | Ano de expiração do cartão | Condicional | Deve ser um Número de 4 digitos |
data.paymentMethod.card.holder | Objeto que contém os dados do portador do cartão | Condicional | |
data.paymentMethod.card.holder.name | Nome do portador do cartão | Condicional | |
data.amount | Objeto que contém os dados do valor da compra | Sim | |
data.amount.value | Valor da compra em centavos | Sim | Deve ser no mínimo 100 |
data.amount.currency | Código da moeda utilizada para cobrança | Sim | Valores aceitos: BRL |
data.billingAddress | Objeto que contém os dados do endereço de cobrança do cartão | Condicional | Pelo menos um desses deve ser informado: billingAddress ou shippingAddress |
data.billingAddress.street | Rua do endereço | Sim | |
data.billingAddress.number | Número do endereço | Sim | |
data.billingAddress.complement | Complemento do endereço | Opcional | |
data.billingAddress.city | Cidade do endereço | Sim | |
data.billingAddress.regionCode | Código do estado do endereço | Sim | |
data.billingAddress.country | Código do país do endereço | Sim | Deve ser um valor ISO 3166-1 alpha-3 |
data.billingAddress.postalCode | Código postal do endereço | Sim | Deve ter entre 5 e 10 dígitos |
data.shippingAddress | Objeto que contém os dados do endereço de entrega da compra | Condicional | |
data.shippingAddress.street | Rua do endereço | Sim | |
data.shippingAddress.number | Número do endereço | Sim | |
data.shippingAddress.complement | Complemento do endereço | Condicional | |
data.shippingAddress.city | Cidade do endereço | Sim | |
data.shippingAddress.regionCode | Código do estado do endereço | Sim | |
data.shippingAddress.country | Código do país do endereço | Sim | Deve ser um valor ISO 3166-1 alpha-3 |
data.shippingAddress.postalCode | Código postal do endereço | Sim | Deve ter entre 5 e 10 dígitos |
dataOnly | Flag indicando o fluxo 3DS Data-Only | Sim | Deve ser sempre false |
beforeChallenge | Uma 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:
Campo | Descrição | Obrigatório |
---|---|---|
brand | Bandeira do cartão | Sim |
issuer | Banco emissor do cartão | Condicional (Caso exista na base de dados) |
open | Função que exibe o desafio | Sim |
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ção | Obrigatório |
---|---|---|
status | Representa 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 |
id | Representa 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"
}
]
}
Campo | Descrição | Obrigatório |
---|---|---|
detail.httpStatus | Indica o status http retornado pelas APIs do PagSeguro que gerou o erro | Sim |
detail.traceId | Um 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.message | Uma mensagem indicando o problema | Sim |
detail.errorMessages[] | Lista contendo detalhes de válidações | Condicional (Apenas se o httpStatus for 400) |
detail.errorMessages[].code | Código da validação | Sim |
detail.errorMessages[].description | Descrição da validação | Sim |
detail.errorMessages[].parameterName | Parâmetro enviado que gerou o erro de validação | Sim |
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:
Valores | Response |
---|---|
VISAnumber informado no Pre-request Script = 4000000000002719MASTERCARD number informado no Pre-request Script = 5200000000001021ELO number informado no Pre-request Script = 6505050000001026 | Fluxo de autenticação com cartão não elegível ao 3DStransaction.status = AUTH_NOT_SUPPORTED |
VISAnumber informado no Pre-request Script = 4000000000002503MASTERCARD number informado no Pre-request Script = 5200000000001096ELO number informado no Pre-request Script = 6505050000001091 | Fluxo de autenticação com cartão elegível ao 3DS com desafiotransaction.status = AUTH_FLOW_COMPLETED |
VISAnumber informado no Pre-request Script = 4000000000002370MASTERCARD number informado no Pre-request Script = 5200000000001104ELO number informado no Pre-request Script = 6505050000001109 | Fluxo de autenticação com cartão elegível ao 3DS sem desafiotransaction.status = AUTH_FLOW_COMPLETED |
Status atuais
Status | Descrição |
---|---|
AUTH_FLOW_COMPLETED | O 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_SUPPORTED | A 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_METHOD | O 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. |