Docs
Cartões

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:

AmbienteBase
Sandbox (em liberação)https://efv0xy10tk.execute-api.us-east-1.amazonaws.com/card/v1
Produçãohttps://payments-js.kirvano.com/card/v1
ArquivoUso
card.jsAcompanha as atualizações da versão principal 1. Recomendado.
card-1.0.0.jsVersão fixa, imutável. Use com SRI.
manifest.jsonHashes 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çãoTipoObrigatóriaDescrição
sessionTokenstringSimO session_token aberto pelo seu servidor (cts_ seguido de 32 caracteres).
locale'pt-BR' | 'en' | 'es'NãoIdioma de placeholders, rótulos e mensagens de erro.
appearanceobjetoNãoEstilo do texto dentro dos campos. Veja Aparência.
fontsarrayNãoAté 5 fontes { family, src }, com src no formato url(https://...).
classesobjetoNãoTroca os nomes das classes aplicadas ao seu container. Veja Classes do container.

DMCard lança erro, em vez de devolver uma instância, quando:

MensagemCausa
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étodoDescriçã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:

typeConteúdo
cardBloco único: número, validade, código de segurança e nome.
cardNumberNúmero do cartão, com ícone da bandeira se showIcon: true.
cardExpiryValidade (MM/AA).
cardCvcCódigo de segurança.
cardHolderNome 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étodoDescriçã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

EventoQuando
readyO campo carregou e está pronto para digitação.
changeO conteúdo mudou.
focusO campo recebeu foco.
blurO campo perdeu o foco.
escapeO 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:

codeCampo
invalid_numberNúmero inválido (dígito verificador ou tamanho para a bandeira).
invalid_expiryValidade inválida ou vencida.
invalid_cvvCódigo de segurança com tamanho errado para a bandeira.
invalid_holder_nameNome 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 }
}
CampoDescrição
tokentok_ seguido de 26 caracteres maiúsculos. Vale 1 hora e serve para uma cobrança.
expiresAtFim da validade do token, ISO 8601.
card.brandVISA, MASTERCARD, ELO, HIPERCARD, AMERICAN_EXPRESS, DINERS, DISCOVER, JCB ou UNSPECIFIED.
card.bin6 ou 8 primeiros dígitos (8 para cartões com 16 dígitos ou mais).
card.last4, card.exp_month, card.exp_yearFinal 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ávelPadrão
fontFamilysystem-ui, sans-serif
fontSize16px
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:

EstadoClasse padrãoChave em classes
SempreDMCardFieldbase
Com focoDMCardField--focusfocus
InválidoDMCardField--invalidinvalid
CompletoDMCardField--completecomplete
VazioDMCardField--emptyempty
DesabilitadoDMCardField--disableddisabled
checkout.css
.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:

config.js
export const DM_CARD_SDK_URL = 'https://efv0xy10tk.execute-api.us-east-1.amazonaws.com/card/v1/card.js';
carregar-dmcard.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;
}
CampoCartao.tsx
'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

LimiteValor
Validade da sessão1 hora
Tentativas de tokenização por sessão5, contando cartões inválidos que chegaram ao servidor
Validade do token1 hora a partir da criação
Uso do token1 cobrança
Abertura de sessões30 por minuto por conta
Fontes adicionais5 por instância

Nesta página