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.
Referência do objeto global DMCard, versão 1.0.0. Para o passo a passo da integração, veja Capture o cartão com o SDK de campos.
Carregamento e versões
Os arquivos ficam na base do SDK de cada ambiente:
| Ambiente | Base |
|---|---|
| Sandbox (em liberação) | https://efv0xy10tk.execute-api.us-east-1.amazonaws.com/card/v1 |
| Produção | https://payments-js.kirvano.com/card/v1 |
| Arquivo | Uso |
|---|---|
card.js | Acompanha as atualizações da versão principal 1. Recomendado. |
card-1.0.0.js | Versão fixa, imutável. Use com SRI. |
manifest.json | Hashes e valores de SRI de cada arquivo da versão. |
Para fixar a versão, leia o valor sri de card-1.0.0.js no manifest.json e use-o em integrity:
<script
src="https://efv0xy10tk.execute-api.us-east-1.amazonaws.com/card/v1/card-1.0.0.js"
integrity="sha256-VALOR_DO_MANIFEST"
crossorigin="anonymous"></script>Use SRI apenas na URL versionada. Em card.js o conteúdo muda a cada atualização e o SRI quebraria o checkout.
O SDK precisa ser carregado pela tag <script> da CDN. Carregado de outra forma (copiado para o seu servidor, empacotado no bundle), ele lança DMCard must load from the CDN script.
DMCard(options)
Cria uma instância ligada a uma sessão.
const dm = DMCard({
sessionToken,
locale: 'pt-BR',
appearance: {
variables: { fontFamily: 'Inter, sans-serif', fontSize: '16px', colorText: '#0d0e11', colorDanger: '#d4313d' },
rules: { '.Input::placeholder': { color: '#8a909c' } },
},
fonts: [{ family: 'Inter', src: 'url(https://fonts.example.com/inter.woff2)' }],
classes: { invalid: 'campo--erro' },
});| Opção | Tipo | Obrigatória | Descrição |
|---|---|---|---|
sessionToken | string | Sim | O session_token aberto pelo seu servidor (cts_ seguido de 32 caracteres). |
locale | 'pt-BR' | 'en' | 'es' | Não | Idioma de placeholders, rótulos e mensagens de erro. |
appearance | objeto | Não | Estilo do texto dentro dos campos. Veja Aparência. |
fonts | array | Não | Até 5 fontes { family, src }, com src no formato url(https://...). |
classes | objeto | Não | Troca os nomes das classes aplicadas ao seu container. Veja Classes do container. |
DMCard lança erro, em vez de devolver uma instância, quando:
| Mensagem | Causa |
|---|---|
Invalid card session token. | sessionToken ausente ou fora do formato. |
DMCard requires an HTTP(S) page. | A página não está em http: ou https: (por exemplo, file:). |
DMCard must load from the CDN script. | O script não foi carregado pela tag da CDN. |
Instância
| Método | Descrição |
|---|---|
create(type, options?) | Cria um campo. Devolve um campo. |
createToken({ holderName? }) | Tokeniza o cartão digitado. Devolve uma Promise com o resultado; não lança por erro de cartão ou de rede. |
update({ appearance?, locale?, fonts? }) | Muda aparência, idioma ou fontes sem apagar o que o comprador digitou. |
destroy() | Remove todos os campos e invalida a instância. Chame ao sair do checkout. |
Tipos de campo em create:
type | Conteúdo |
|---|---|
card | Bloco único: número, validade, código de segurança e nome. |
cardNumber | Número do cartão, com ícone da bandeira se showIcon: true. |
cardExpiry | Validade (MM/AA). |
cardCvc | Código de segurança. |
cardHolder | Nome do titular, como impresso no cartão. |
Cada tipo pode ser criado uma vez por instância, e card não se combina com os demais. Violar essas regras lança Duplicate or incompatible card field.
Com campos separados, o nome do titular vem de cardHolder ou de createToken({ holderName }). É obrigatório e tem até 120 caracteres.
Campo
| Método | Descrição |
|---|---|
mount(target) | Insere o campo no elemento (seletor CSS ou HTMLElement). Devolve o próprio campo. O container não pode estar dentro de Shadow DOM. |
unmount() | Retira o campo da página, mantendo a instância. Pode ser montado de novo. |
destroy() | Remove o campo de vez. |
on(event, handler) | Registra um listener. Devolve uma função que o remove. |
update({ placeholder?, showIcon?, disabled? }) | Muda opções do campo. |
focus() | Coloca o foco no campo. |
clear() | Apaga o conteúdo digitado. |
Opções de campo (em create e update): placeholder (texto), showIcon (mostra a bandeira, em cardNumber e card) e disabled.
Nenhum método devolve o valor digitado. Essa é a garantia do SDK: a sua página nunca lê número ou código de segurança.
Eventos
| Evento | Quando |
|---|---|
ready | O campo carregou e está pronto para digitação. |
change | O conteúdo mudou. |
focus | O campo recebeu foco. |
blur | O campo perdeu o foco. |
escape | O comprador apertou Esc dentro do campo. |
Todos os eventos entregam o mesmo estado:
{
empty: boolean; // campo vazio
complete: boolean; // conteúdo completo e válido
error?: { code: string; message?: string }; // presente quando inválido
brand?: string; // bandeira detectada (em cardNumber e card)
bin?: string; // 6 primeiros dígitos (em cardNumber e card)
}Códigos de error no estado do campo:
code | Campo |
|---|---|
invalid_number | Número inválido (dígito verificador ou tamanho para a bandeira). |
invalid_expiry | Validade inválida ou vencida. |
invalid_cvv | Código de segurança com tamanho errado para a bandeira. |
invalid_holder_name | Nome ausente ou com mais de 120 caracteres. |
message vem no idioma de locale, pronta para exibir.
Resultado de createToken
Sucesso:
{
"token": "tok_01M0FVG11PZK94T569VFYE4FY3",
"expiresAt": "2026-11-02T20:10:00Z",
"card": { "brand": "MASTERCARD", "bin": "55555555", "last4": "4444", "exp_month": 12, "exp_year": 2030 }
}| Campo | Descrição |
|---|---|
token | tok_ seguido de 26 caracteres maiúsculos. Vale 1 hora e serve para uma cobrança. |
expiresAt | Fim da validade do token, ISO 8601. |
card.brand | VISA, MASTERCARD, ELO, HIPERCARD, AMERICAN_EXPRESS, DINERS, DISCOVER, JCB ou UNSPECIFIED. |
card.bin | 6 ou 8 primeiros dígitos (8 para cartões com 16 dígitos ou mais). |
card.last4, card.exp_month, card.exp_year | Final e validade, para exibir ao comprador. |
Erro: { "error": { "code": "..." } }, com code entre validation_error, session_expired, session_exhausted, rate_limited, network_error, tokenization_in_progress e destroyed. O que fazer em cada caso está em Erros ao gerar o token.
createToken espera até 10 segundos pelo carregamento dos campos e até 15 segundos pela resposta; depois disso devolve network_error.
Aparência
A moldura do campo (borda, fundo, raio, espaçamento, altura) é o seu container: estilize-o com o seu CSS. O iframe tem fundo transparente. appearance estiliza só o texto dentro do campo.
appearance.variables:
| Variável | Padrão |
|---|---|
fontFamily | system-ui, sans-serif |
fontSize | 16px |
colorText | #101828 |
colorDanger | #b42318 (cor do texto quando o campo está inválido) |
appearance.rules aceita três seletores: .Input, .Input--invalid e .Input::placeholder. Dentro deles, só estas propriedades: color, fontFamily, fontSize, fontWeight, fontStyle, letterSpacing, lineHeight, textAlign e textDecoration. Outros seletores, outras propriedades e URLs são ignorados.
Classes do container
O SDK aplica classes ao elemento em que o campo foi montado, para você estilizar os estados:
| Estado | Classe padrão | Chave em classes |
|---|---|---|
| Sempre | DMCardField | base |
| Com foco | DMCardField--focus | focus |
| Inválido | DMCardField--invalid | invalid |
| Completo | DMCardField--complete | complete |
| Vazio | DMCardField--empty | empty |
| Desabilitado | DMCardField--disabled | disabled |
.DMCardField { border: 1px solid #cfd3da; border-radius: 10px; padding: 12px; height: 44px; }
.DMCardField--focus { border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2); }
.DMCardField--invalid { border-color: #d4313d; }Acessibilidade e preenchimento automático
Os campos trazem rótulos, anúncio de erros para leitores de tela e autocomplete de cartão. Alguns navegadores não preenchem automaticamente campos de cartão divididos em iframes diferentes; se o preenchimento automático é importante para o seu público, prefira o bloco único (card). Teste em celulares reais antes de liberar.
Integração com frameworks
O SDK é carregado da CDN, não de um pacote npm. Em qualquer framework, o padrão é o mesmo: carregar o script uma vez, criar a instância quando o container existir e destruí-la quando o componente sair.
Guarde o endereço do SDK na configuração da aplicação, por ambiente:
export const DM_CARD_SDK_URL = 'https://efv0xy10tk.execute-api.us-east-1.amazonaws.com/card/v1/card.js';import { DM_CARD_SDK_URL } from './config.js';
let carregando;
export function carregarDMCard() {
if (window.DMCard) return Promise.resolve(window.DMCard);
carregando ??= new Promise((resolve, reject) => {
const s = document.createElement('script');
s.src = DM_CARD_SDK_URL;
s.onload = () => resolve(window.DMCard);
s.onerror = () => reject(new Error('Falha ao carregar o SDK de campos'));
document.head.appendChild(s);
});
return carregando;
}'use client';
import { useEffect, useRef } from 'react';
import { carregarDMCard } from './carregar-dmcard';
export function CampoCartao({ sessionToken, onToken }: { sessionToken: string; onToken: (t: string) => void }) {
const container = useRef<HTMLDivElement>(null);
const dm = useRef<any>(null);
useEffect(() => {
let ativo = true;
carregarDMCard().then((DMCard) => {
if (!ativo || !container.current) return;
dm.current = DMCard({ sessionToken, locale: 'pt-BR' });
dm.current.create('card').mount(container.current);
});
return () => {
ativo = false;
dm.current?.destroy();
dm.current = null;
};
}, [sessionToken]);
async function pagar() {
const result = await dm.current?.createToken();
if (result?.token) onToken(result.token);
}
return (
<>
<div ref={container} />
<button onClick={pagar}>Pagar</button>
</>
);
}O valor do cartão nunca entra no estado do React. Em renderização no servidor (Next.js), use o componente apenas no cliente ('use client').
Ao trocar de sessão (por exemplo, depois de session_expired), destrua a instância e crie outra com o novo sessionToken. Os campos antigos são removidos e o que foi digitado se perde: avise o comprador.
Limites
| Limite | Valor |
|---|---|
| Validade da sessão | 1 hora |
| Tentativas de tokenização por sessão | 5, contando cartões inválidos que chegaram ao servidor |
| Validade do token | 1 hora a partir da criação |
| Uso do token | 1 cobrança |
| Abertura de sessões | 30 por minuto por conta |
| Fontes adicionais | 5 por instância |
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.
Tokenize um cartão
Guarde um cartão do comprador como token reutilizável e cobre com ele em compras futuras, sem armazenar o número do cartão.