Tokenização de cartão

Toda cobrança no cartão é feita com um cardToken, gerado no navegador do comprador pelo @validapay/tokenize. Ele vale 5 minutos e só funciona na conta que o gerou.

Na cobrança com cartão, envie sempre cardToken e deviceId. O número do cartão não passa pelo seu servidor nem deve ser guardado por você.

Como funciona

1

Ao abrir a página, o SDK identifica o dispositivo do comprador e devolve o deviceId

2

O SDK troca o cartão digitado por um cardToken, que vale 5 minutos

3

Seu servidor chama POST /v1/charges com cardToken e deviceId

1. Instalar

npm install @validapay/tokenize

2. Identificar o dispositivo

Chame uma vez, assim que a página de pagamento carregar (antes do cliente inserir os dados do cartão).

JavaScript
import { collectDevice } from '@validapay/tokenize/browser';

const { deviceId } = await collectDevice({ publicId: 'SEU_ID_PUBLICO' });

Retorno

JSON
{
  "deviceId": "60424e5b-01ee-46ec-9d97-b1507dc23ced"
}

3. Gerar o cardToken

Para gerar uma cobrança é necessário antes tokenizar o cartão chamando o método tokenize() do SDK @validapay/tokenize. Este método recebe os inputs: publicId, card, customer. A chamada deve ser feita conforme exemplificado abaixo:

import { tokenize } from '@validapay/tokenize/browser';

const { cardToken } = await tokenize({
  publicId: 'SEU_ID_PUBLICO',
  card: {
    number: '5230552482605921',
    holderName: 'LUKE SKYWALKER',
    cvv: '100',
    expiration: '12/2030',
  },
  customer: {
    name: 'Luke Skywalker',
    document: '86564950039',
    email: 'luke@teste.com',
  },
});

Retorno

JSON
{
  "cardToken": "ctk_9f8s7d6f5g4h3j2k1l0",
  "cardTokenExpiresAt": "2026-09-17T16:37:00.720Z",
  "cardBrand": "MASTERCARD",
  "cardLastFour": "5921"
}

4. Cobrar pelo seu servidor

Com o cardToken e o deviceId em mãos, envie-os ao seu servidor e gere a cobrança em Checkout Transparente → Gerar cobrança Cartão.

Comprador estrangeiro

Informe customer.country com o país do comprador. Com país diferente de BR, o document é opcional e, se enviado, aceita passaporte com letras:

JavaScript
const { deviceId } = await collectDevice({ publicId: 'SEU_ID_PUBLICO', environment: 'sandbox' });

const { cardToken } = await tokenize({
  publicId: 'SEU_ID_PUBLICO',
  environment: 'sandbox',
  card: { number: '4111111111111111', holderName: 'JOHN SMITH', cvv: '123', expiration: '12/2030' },
  customer: { name: 'John Smith', email: 'john@example.com', country: 'US' },
});

Na cobrança, envie o cliente sem documentNumber, com phone em E.164 e address.country do mesmo país. A conta precisa ter o pagamento internacional habilitado pelo suporte. Regras completas em Checkout Transparente → Gerar cobrança Cartão internacional.

JSON
POST /v1/charges
{
  "paymentMethod": "creditcard",
  "amount": 149.90,
  "installments": 1,
  "cardToken": "ctk_...",
  "deviceId": "...",
  "customer": {
    "name": "John Smith",
    "email": "john@example.com",
    "phone": "+14155552671",
    "address": {
      "country": "US",
      "zipCode": "94105",
      "street": "Market St",
      "number": "100",
      "city": "San Francisco",
      "state": "CA"
    }
  }
}

Parâmetros

ParâmetroTipoDescrição
publicIdstringIdentificador público da conta, no painel em Gerenciamento > Minha Conta > Id Público
card.numberstringNúmero do cartão, de 13 a 19 dígitos
card.holderNamestringNome impresso no cartão
card.cvvstringCódigo de segurança (3 ou 4 dígitos)
card.expirationstringValidade no formato MM/YYYY
customer.namestringNome completo do comprador
customer.documentstringCPF (11) ou CNPJ (14). Opcional para comprador estrangeiro, que pode enviar o passaporte
customer.countrystringPaís do comprador (ISO 3166-1 alfa-2, ex.: US). Sem o campo, vale customer.address.country; sem os dois, BR
customer.emailstringE-mail do comprador
environmentstringsandbox para testes; sem o campo, vale produção

Testando em sandbox

A conta de sandbox tem o seu próprio publicId, no painel em Gerenciamento > Minha Conta > Id Público. Passe environment: 'sandbox' nos comandos do SDK para apontar para o ambiente de testes:

JavaScript
const { deviceId } = await collectDevice({ publicId: 'SEU_ID_PUBLICO', environment: 'sandbox' });

const { cardToken } = await tokenize({ publicId: 'SEU_ID_PUBLICO', environment: 'sandbox', card, customer });

Em sandbox nada é cobrado de verdade: o número digitado na tokenização decide o resultado da cobrança.

NúmeroResultado
4111111111111111aprovado
4000000000000002recusado (card_declined)
4000000000000004saldo insuficiente (insufficient_funds)
4000000000000006cartão expirado (expired_card)
4000000000000008CVV inválido (invalid_cvv)
4000000000000010suspeita de fraude (fraud_suspected)

Qualquer outro número de 13 a 19 dígitos é aprovado. CVV, validade e nome do titular podem ser quaisquer valores válidos. O cardToken, o deviceId e os erros se comportam como em produção.

Erros

OndeCódigoO que aconteceu
Cobrança400 MISSING_CARD_DATAFaltou o cardToken
Cobrança400 CARD_TOKEN_EXPIREDPassou dos 5 minutos: gere outro na página
Cobrança404 CARD_TOKEN_NOT_FOUNDToken inexistente ou de outra conta
Cobrança402Cartão recusado pelo banco

Integrações antigas

Quem já tokenizava pelo servidor, com client_id e client_secret, continua funcionando: a resposta agora traz também o cardToken. Para integrações novas, use o fluxo acima.

Perguntas frequentes

O comprador estrangeiro precisa de CPF para tokenizar o cartão?▾
Não. Informe customer.country com o código ISO 3166-1 alfa-2 do país (ex.: US, PT, AR). Com país diferente de BR, customer.document é opcional. Disponível a partir da versão 1.4.0 do @validapay/tokenize.
Recebo "customer.document é obrigatório" ao tokenizar o cartão de um estrangeiro. O que fazer?▾
Atualize o @validapay/tokenize para a versão 1.4.0 ou superior e envie customer.country. Versões anteriores exigem CPF/CNPJ de todo comprador. A mesma mensagem aparece na versão atual quando customer.country falta, vem como BR ou vem fora do padrão ISO.
Posso enviar o passaporte em customer.document?▾
Sim, para comprador estrangeiro. O documento é enviado como foi digitado, com letras, até 30 caracteres. Para comprador brasileiro, customer.document continua sendo CPF ou CNPJ, e o SDK remove pontos e traços.
Existe campo para o tipo de documento ou o país emissor?▾
Não. O documento do comprador estrangeiro não é usado na autorização do cartão, então basta customer.country. O passaporte, se enviado, fica só no cadastro do cliente.
Posso enviar um CPF fictício para o comprador estrangeiro?▾
Não. O cliente é identificado pelo documento: um valor fixo junta compradores diferentes no mesmo cadastro e faz a proteção antifraude tratá-los como uma pessoa só. Sem documento, o comprador estrangeiro é identificado pelo e-mail.
Quais valores customer.country aceita?▾
Códigos ISO 3166-1 alfa-2, como US, PT, AR, GB ou DE. Textos como "Brasil", "USA" ou "Estados Unidos" não são códigos ISO e o comprador é tratado como brasileiro, com CPF/CNPJ obrigatório. Na cobrança, use em customer.address.country o mesmo país informado na tokenização.
O que muda na cobrança do comprador estrangeiro?▾
A rota é a mesma (POST /v1/charges), com cardToken e deviceId. O cliente vai sem documentNumber, com phone em E.164 e endereço completo com customer.address.country. É só cartão e à vista, e a conta precisa ter o pagamento internacional habilitado pelo suporte (sem isso: 403 INTERNATIONAL_CHECKOUT_NOT_ENABLED). Detalhes em Checkout Transparente → Gerar cobrança Cartão internacional.
Como testar o comprador estrangeiro no sandbox?▾
Use o publicId da conta de sandbox com environment: 'sandbox' e siga o exemplo da seção Comprador estrangeiro. A conta de sandbox também precisa da habilitação do pagamento internacional. Os cartões de teste são os mesmos do comprador brasileiro.
Existe outro método de tokenização que mantenha o cartão fora do meu servidor?▾
Não é preciso. O tokenize do @validapay/tokenize/browser envia o cartão direto do navegador do comprador para a ValidaPay, para brasileiros e estrangeiros. O seu servidor recebe só o cardToken e o deviceId.
O 3DS funciona para comprador estrangeiro?▾
Sim, a partir da versão 1.2.0 do @validapay/3ds. Envie customer.address.country, phone em E.164 e o endereço completo; o documento é opcional. O 3DS continua opcional na cobrança pela API.
Posso usar o mesmo objeto customer no 3DS e no tokenize?▾
Sim. O tokenize lê o país de customer.country ou, se ele não vier, de customer.address.country.
Quais cartões são aceitos?▾
Cartões de crédito com 13 a 19 dígitos, incluindo Amex (15 dígitos e CVV de 4 dígitos). Envie o número sem espaços ou deixe o SDK removê-los.
Essa página foi útil?