Capture o cartão com o SDK de campos
Colete os dados do cartão em campos seguros da Accelerazione dentro do seu checkout e cobre com um token, sem que número e código de segurança passem pela sua página ou pelo seu servidor.
O SDK de campos coloca os inputs de cartão (número, validade, código de segurança e nome) dentro de iframes da Accelerazione, embutidos no seu checkout. O comprador digita nesses campos, o SDK envia os dados direto para a Accelerazione e devolve à sua página um token temporário (tok_…). Você envia esse token ao seu backend e cobra com ele.
O número completo do cartão e o código de segurança nunca chegam à sua página, ao seu JavaScript nem ao seu servidor.
1 de 5
O campo mora no seu checkout
Os inputs de cartão são iframes da Accelerazione dentro da sua página. A moldura, o espaço e o layout são seus; o conteúdo do campo é nosso.
Em resumo:
- Os campos de cartão são iframes da Accelerazione dentro do seu checkout. A moldura e o layout são seus.
- Enquanto o comprador digita, sua página recebe só o estado do campo: bandeira, BIN e se está completo.
- No clique em pagar, o campo envia o cartão direto para a Accelerazione, sem passar pela sua página nem pelo seu servidor.
- A Accelerazione devolve um token
tok_…, que sua página repassa ao seu servidor. - Seu servidor cria a cobrança com
card.token.
| Peça | Onde vive | Validade |
|---|---|---|
| Chave de API | Só no seu servidor | Conforme a gestão da chave |
Sessão cts_… | Servidor → página | 1 hora e até 5 tentativas de tokenização |
Token tok_… | Página → servidor → cobrança | 1 hora; usado por uma cobrança |
Disponibilidade
O SDK de campos está disponível em produção, com habilitação por conta. A liberação no sandbox está em andamento: os endereços de sandbox abaixo valem quando a sua conta tiver acesso. Até lá, combine com a equipe de integração como testar antes de abrir para compradores.
Antes de começar
- Habilitação da sua conta para o SDK de campos. Sem ela, a abertura de sessão responde
403 card_sdk_not_enabled. - Permissão
card-token-sessionsna chave de API do ambiente. - O resto da integração de cartão já funcionando: sessão 3DS, coleta do dispositivo e desafio 3DS. O SDK de campos substitui só a coleta dos dados do cartão; o 3DS continua igual.
| Uso | Sandbox (em liberação) | Produção |
|---|---|---|
| Abrir sessão (seu servidor) | https://g6idryo27h.execute-api.us-east-1.amazonaws.com/v1/card-token-sessions | https://payments.kirvano.com/v1/card-token-sessions |
| Script do SDK (sua página) | https://efv0xy10tk.execute-api.us-east-1.amazonaws.com/card/v1/card.js | https://payments-js.kirvano.com/card/v1/card.js |
| Criar a cobrança (seu servidor) | https://g6idryo27h.execute-api.us-east-1.amazonaws.com/api/v1/paymentintents | https://payments.kirvano.com/api/v1/paymentintents |
Os exemplos usam as variáveis de Ambientes e endereços: DM_API_BASE e DM_HOOKS_BASE no servidor e na configuração do checkout.
1. Abra a sessão no servidor
Abra uma sessão a cada checkout, no seu backend, com a chave de API. O corpo é vazio: a conta vem da chave.
curl -X POST "$DM_API_BASE/v1/card-token-sessions" \
-H "Authorization: $DM_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'{
"session_token": "cts_9J4W2C7X5N8QK2R4T6Y8V0H2M4P6A1B3",
"expires_at": "2026-11-02T20:06:00Z",
"max_tokens": 5
}Entregue ao navegador só session_token (e, se quiser, expires_at). A chave de API nunca sai do servidor.
A rota do seu backend que abre a sessão deve exigir o comprador autenticado (ou a sessão do checkout) e proteção contra CSRF. Uma rota aberta deixa qualquer pessoa gastar o limite de sessões da sua conta.
2. Carregue o SDK e libere as origens
<script src="https://efv0xy10tk.execute-api.us-east-1.amazonaws.com/card/v1/card.js"></script>O script cria o objeto global DMCard. Ele precisa ser carregado por essa tag, da CDN da Accelerazione: não copie o arquivo para o seu servidor nem o empacote no seu bundle.
Se o checkout usa Content Security Policy, acrescente:
Content-Security-Policy:
script-src 'self' https://efv0xy10tk.execute-api.us-east-1.amazonaws.com;
frame-src https://efv0xy10tk.execute-api.us-east-1.amazonaws.comMantenha as origens que o 3DS já exige (Hooks e o serviço de coleta). Os campos usam a CSP própria deles e conversam só com a Accelerazione.
3. Monte os campos
Escolha entre um bloco único (número, validade, código e nome no mesmo campo) e campos separados. O bloco único é o mais simples e funciona melhor com o preenchimento automático do navegador.
<div id="cartao"></div>
<button id="pagar">Pagar</button>const dm = DMCard({ sessionToken, locale: 'pt-BR' });
const cartao = dm.create('card').mount('#cartao');Não misture o bloco único com campos separados na mesma instância. Cada tipo de campo pode ser criado uma vez por instância.
Os containers precisam estar no DOM principal da página: um container dentro de Shadow DOM é recusado com erro. Em Web Components, use um container no light DOM ou num slot.
Acompanhe o estado dos campos
Os campos avisam a sua página sobre o estado, nunca sobre o valor:
numero.on('change', ({ empty, complete, error, brand, bin }) => {
botaoPagar.disabled = !complete;
mensagem.textContent = error ? error.message : '';
mostrarBandeira(brand);
});bin traz os seis primeiros dígitos, para você exibir a bandeira e iniciar a coleta 3DS (passo 5). Os demais eventos são ready, focus, blur e escape. Detalhes na referência do SDK.
4. Gere o token e envie ao seu servidor
Quando o comprador clicar em pagar, peça o token:
document.querySelector('#pagar').addEventListener('click', async () => {
const result = await dm.createToken();
if (result.error) {
tratarErroDeTokenizacao(result.error.code); // tabela abaixo
return;
}
// Só o token vai para o seu servidor.
await fetch('/checkout/pagar', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ cardToken: result.token, pedidoId }),
});
});{
"token": "tok_01M0FVG11PZK94T569VFYE4FY3",
"expiresAt": "2026-11-02T20:10:00Z",
"card": { "brand": "MASTERCARD", "bin": "55555555", "last4": "4444", "exp_month": 12, "exp_year": 2030 }
}card serve para mostrar ao comprador e para o seu registro. Repare na grafia: expiresAt em camelCase, os campos de card em snake_case. O bin do resultado pode ter oito dígitos (cartões com 16 dígitos ou mais); o dos eventos tem seis.
Quando o comprador sair do checkout, libere os campos:
dm.destroy();Erros ao gerar o token
createToken não lança exceção por erro de cartão ou de rede: o resultado traz error.code.
error.code | Significado | O que fazer |
|---|---|---|
validation_error | Algum campo está inválido ou incompleto, ou falta o nome do titular. | Mostre a mensagem do campo e deixe o comprador corrigir. |
session_expired | A sessão passou de 1 hora ou não existe mais. | Peça nova sessão ao seu backend e recrie a instância. |
session_exhausted | A sessão já usou as 5 tentativas. | Peça nova sessão ao seu backend e recrie a instância. |
rate_limited | Muitas tentativas em pouco tempo. | Aguarde alguns segundos e tente de novo. |
network_error | Falha de rede ou indisponibilidade. O SDK já repetiu uma vez. | Peça ao comprador para tentar de novo. |
tokenization_in_progress | Clique duplo: já há uma tokenização em andamento. | Desabilite o botão enquanto espera o resultado. |
destroyed | A instância foi destruída. | Crie uma nova instância. |
Cada tentativa conta
Toda tentativa que chega ao servidor consome uma das 5 permissões da sessão, inclusive com cartão inválido. Valide no próprio campo (o evento change traz complete e error) e só chame createToken com os campos completos.
5. Mantenha o 3DS conectado
O SDK de campos não autentica o comprador. A coleta do dispositivo continua com o DM3DS. Use o BIN do evento change para iniciar a coleta assim que o comprador digitar o começo do cartão:
let coleta;
numero.on('change', ({ bin }) => {
if (bin && !coleta) {
coleta = DM3DS.collectDeviceData(sessao3ds, {
baseUrl: DM_HOOKS_BASE, // origem Hooks do ambiente, da sua configuração
cardBin: bin,
});
}
});No bloco único, registre o mesmo listener em cartao. Antes de enviar a cobrança, espere coleta resolver, como na integração sem SDK.
6. Cobre com o token
No servidor, crie a cobrança como de costume, trocando os dados do cartão por card.token:
{
"amount": 10990,
"currency": "BRL",
"paymentMethods": [{
"type": "CreditCard",
"amount": 10990,
"card": { "token": "tok_01M0FVG11PZK94T569VFYE4FY3" }
}],
"paymentMethodOptions": {
"creditCard": {
"installments": 1,
"threeDSecure": "automatic",
"threeDs": { "sessionToken": "3ds_sess_9J4W2C7X5N8QK2R4T6Y8V0H2M4P6A1B3" }
}
}
}O resto da requisição (comprador, endereço, split, postbackUrl, metadata) segue Crie a cobrança com cartão, e os desfechos são os mesmos: Succeeded, Failed, Processing ou RequiresAction.
Regras do token na cobrança:
- Uma cobrança por token. Depois de usado, o token não serve para outra cobrança, nem se a primeira foi recusada. Para uma nova tentativa, gere um novo token (e abra nova sessão 3DS).
- Repetir a mesma cobrança é seguro. Em falha de rede, repita com a mesma
Idempotency-Keye o mesmo corpo. Não crie outra cobrança por causa de um timeout: consulte a primeira. - Validade de 1 hora. Gere o token perto do clique em pagar, não no carregamento da página.
- O token não é um cartão salvo. Para guardar cartão para compras futuras, veja Tokenize um cartão.
| HTTP | type | Causa | O que fazer |
|---|---|---|---|
422 | card_token_consumed | O token já foi usado por outra cobrança. | Gere um novo token. |
422 | card_token_expired | O token passou de 1 hora. | Gere um novo token. |
422 | card_token_not_found | Token inexistente, com formato inválido ou de outra conta. | Confira se o token veio do SDK desta conta. |
503 | vault_unavailable | Indisponibilidade temporária. | Repita com a mesma Idempotency-Key, respeitando Retry-After. |
Se o problema com o token for detectado depois do início da autenticação 3DS, a cobrança volta 201 com status: "Failed" e o mesmo código em lastPaymentError.code.
Tokenizar com sucesso não garante a venda: a aprovação continua dependendo da conta, do 3DS e do emissor.
Erros ao abrir a sessão
| HTTP | Corpo | Causa | O que fazer |
|---|---|---|---|
401 | {"message":"Unauthorized"} | Cabeçalho Authorization ausente. | Envie a chave de API. |
403 | {"message":"Forbidden"} | A chave não tem a permissão card-token-sessions. | Peça a permissão à equipe de integração. |
403 | {"code":"card_sdk_not_enabled"} | A conta não está habilitada para o SDK de campos. | Peça a habilitação. |
403 | {"code":"card_sdk_3ds_mode_unsupported"} | A configuração de cartão da conta ainda não é compatível com o SDK. | Fale com a equipe de integração. |
429 | {"code":"rate_limited", ...} | Mais de 30 sessões por minuto na conta. | Respeite Retry-After. Abra uma sessão por checkout, não por carregamento de página. |
503 | {"code":"session_store_unavailable"} | Indisponibilidade temporária. | Repita após Retry-After (1 segundo). |
500 | {"message":"Internal Server Error"} | Chave de API inválida, expirada ou revogada. | Confira a chave. Veja Autenticação. |
Segurança e PCI
O SDK foi feito para que dados de cartão fiquem fora do seu ambiente. Para aproveitar isso:
- Mantenha a captura inteiramente nos campos do SDK. Nenhum input de cartão seu, nem cópia do valor por script.
- Envie ao seu backend apenas o token.
- Carregue o SDK da CDN da Accelerazione, com CSP restrita; nunca hospede os campos na origem do seu checkout.
- Não registre em log corpos de requisição do checkout.
A elegibilidade do seu checkout a um questionário PCI simplificado (como o SAQ A) depende da sua avaliação de conformidade e da documentação de compliance da Accelerazione. Peça essa documentação à equipe de integração. Usar o SDK, por si só, não é uma certificação.
Checklist antes de abrir para compradores
- A chave de API fica só no servidor; a rota que abre a sessão exige comprador autenticado e proteção CSRF.
- Uma sessão por checkout; nova sessão em
session_expiredesession_exhausted. - Botão de pagar desabilitado até os campos completos e durante a tokenização.
- Todos os códigos de
createTokentratados com mensagem ao comprador. - Coleta 3DS iniciada com o BIN do evento e concluída antes da cobrança.
- Cobrança com
card.token,Idempotency-Keye os quatro desfechos tratados. - Novo token a cada nova tentativa de pagamento.
-
dm.destroy()ao sair do checkout. - CSP liberando a origem do SDK do ambiente (
https://payments-js.kirvano.comem produção) emscript-srceframe-src. - Testado em navegadores e celulares reais, inclusive com preenchimento automático.
Para opções de aparência, idioma, versões fixas e integração com React, Vue e Angular, veja a referência do SDK.
Exiba o desafio 3DS
Abra o desafio em um iframe quando a cobrança voltar RequiresAction, receba as mensagens do navegador e confirme o resultado pelo servidor.
Referência do SDK de campos
Todas as opções, métodos, eventos e erros do DMCard, com aparência, idiomas, versões fixas e integração com React, Vue e Angular.