Tratamento de erros do SDK

Capture e reaja a falhas do Bridge SDK com TokeflowError e a referência completa de TokeflowErrorCode — faça switch em códigos estáveis, exiba mensagens amigáveis e centralize o logging com um handler global onError.

Toda falha no Bridge SDK é reportada como um TokeflowError — um erro tipado com um code estável e legível por máquina. Faça switch em code para guiar sua UI, exiba message para pessoas e registre requestId para o suporte.

O SDK lança (ou rejeita promises com) TokeflowError para tudo, desde uma chave mal configurada até um campo de cartão incompleto ou um timeout de rede. Como os códigos são estáveis, você pode construir seu tratamento de erros uma única vez e confiar nele em todos os fluxos de tokenização, checkout e carteira.

Para erros de API do lado do servidor (o envelope de erro retornado por https://api.tokeflow.com), consulte Erros. Esta página cobre erros gerados no navegador pelo Bridge SDK.

A classe TokeflowError

TokeflowError estende o Error nativo, então error.message e instanceof Error funcionam normalmente. Ele adiciona um code e um contexto de transporte opcional.

class TokeflowError extends Error {
  code: TokeflowErrorCode; // stable machine-readable code — switch on this
  message: string;         // human-readable explanation (display-safe, may reword)
  httpStatus?: number;     // HTTP status, when the error came from an API call
  requestId?: string;      // request id (req_…) for support, when available
  details?: unknown;       // optional structured context about the failure
}
PropertyTypeSempre presenteDescrição
codeTokeflowErrorCodeSimCódigo estável e legível por máquina. Faça switch nele. Veja a tabela completa.
messagestringSimExplicação legível por humanos. Segura para exibição, mas o texto pode mudar ao longo do tempo — nunca faça parsing dela.
httpStatusnumberNãoPresente quando o erro se originou de uma requisição de API (ex.: 429, 500).
requestIdstringNãoIdentificador da requisição (req_…) para a chamada de API subjacente, quando disponível. Registre-o.
detailsunknownNãoContexto estruturado opcional sobre a falha.

Trate code como o contrato estável e message como algo apenas para exibição. Sempre registre requestId e httpStatus — eles tornam as solicitações de suporte muito mais rápidas de resolver.

Como os erros fluem

Um TokeflowError surge em dois lugares: ele rejeita a promise da chamada que falhou (então você o trata com try/catch) e — se você tiver configurado um — ele também é passado para o handler global onError.

Tratando erros com try/catch

Envolva as chamadas do SDK em try/catch, restrinja para TokeflowError com instanceof e então faça switch em error.code para mapear cada falha para um texto voltado ao usuário. Sempre mantenha uma ramificação default.

import { TokeflowError, TokeflowErrorCode } from '@tokeflow_com/bridge-js';

try {
  const token = await tokeflow.cards.tokenize({ card: cardElement });
  // Send token.tokenId to your backend to create the transaction.
} catch (error) {
  if (error instanceof TokeflowError) {
    switch (error.code) {
      case TokeflowErrorCode.ELEMENT_INCOMPLETE:
        showError('Please complete all card fields.');
        break;
      case TokeflowErrorCode.INVALID_CARD:
        showError('Please check your card number.');
        break;
      case TokeflowErrorCode.INVALID_CPF:
      case TokeflowErrorCode.INVALID_DOCUMENT:
        showError('Please check the CPF or CNPJ you entered.');
        break;
      case TokeflowErrorCode.EXPIRED_CARD:
        showError('This card has expired.');
        break;
      case TokeflowErrorCode.UNSUPPORTED_CARD_BRAND:
        showError('This card brand is not supported.');
        break;
      case TokeflowErrorCode.PAYMENT_METHOD_DISABLED:
        showError('That payment method is not available right now.');
        break;
      case TokeflowErrorCode.SESSION_EXPIRED:
        showError('Your session expired. Please refresh and try again.');
        break;
      case TokeflowErrorCode.RATE_LIMITED:
        showError('Too many attempts. Please wait a moment and try again.');
        break;
      case TokeflowErrorCode.NETWORK_ERROR:
      case TokeflowErrorCode.TIMEOUT:
        showError('Network problem. Please try again.');
        break;
      default:
        showError(error.message);
    }

    // Log the transport context for support and monitoring.
    console.error('Tokeflow error', {
      code: error.code,
      httpStatus: error.httpStatus,
      requestId: error.requestId,
      details: error.details,
    });
  } else {
    // Not a TokeflowError — rethrow or handle as a generic failure.
    throw error;
  }
}

error.code é um valor do enum TokeflowErrorCode. Compare com o enum (ex.: TokeflowErrorCode.INVALID_CARD) em vez da string bruta, para que um erro de digitação se torne um erro em tempo de compilação no TypeScript.

Muitas falhas de entrada podem ser evitadas antes de um round trip. Leia o getState() de um elemento ({ empty, valid, invalid, complete }) e mantenha seu botão de pagamento desabilitado até state.complete && state.valid. Isso previne a maioria dos erros ELEMENT_INCOMPLETE e ELEMENT_INVALID. Veja Tokenização.

Handler global onError

Passe um callback onError na configuração do SDK para receber todo TokeflowError em um único lugar — ideal para logging e monitoramento centralizados. Ele complementa o try/catch; não o substitui. Use onError para observabilidade e seu catch local para a reação voltada ao usuário no ponto da falha.

import { TokeflowBridge } from '@tokeflow_com/bridge-js';

const tokeflow = new TokeflowBridge({
  publicKey: 'pk_live_mer_your_public_key',
  onError: (error) => {
    // Centralized logging — runs for every TokeflowError the SDK raises.
    logToService({
      code: error.code,
      message: error.message,
      httpStatus: error.httpStatus,
      requestId: error.requestId,
    });
  },
});

Mantenha onError apenas com efeitos colaterais (logging, métricas). Não lance exceções de dentro dele e não o use para controlar seu fluxo de checkout — guie a UI a partir do bloco catch no ponto da chamada, onde você tem contexto local.

No React, configure onError na configuração do provider e leia o erro atual a partir do hook useTokeflow():

import { TokeflowProvider, useTokeflow } from '@tokeflow_com/bridge-js/react';

function App() {
  return (
    <TokeflowProvider
      config={{
        publicKey: 'pk_live_mer_your_public_key',
        onError: (error) => logToService({ code: error.code, requestId: error.requestId }),
      }}
    >
      <Checkout />
    </TokeflowProvider>
  );
}

function Checkout() {
  const { isReady, error } = useTokeflow();

  if (error) return <div role="alert">{error.message}</div>;
  if (!isReady) return <div>Loading…</div>;

  // render your payment form
}

Referência de TokeflowErrorCode

Todo erro que o SDK gera carrega um destes códigos. Eles estão agrupados aqui por estágio do ciclo de vida para facilitar a leitura; o enum em si é plano.

Configuração e inicialização

CodeDescrição
INVALID_CONFIGA configuração do SDK é inválida (opções incorretas ou conflitantes).
INVALID_PUBLIC_KEYA chave pública está ausente ou não é uma chave pk_… válida.
NOT_IN_BROWSERO SDK foi usado fora de um ambiente de navegador (ex.: durante renderização no servidor).
NOT_INITIALIZEDUm método do SDK foi chamado antes de init() ser resolvido.

Ciclo de vida da sessão

CodeDescrição
SESSION_CREATION_FAILEDO SDK não conseguiu criar uma sessão durante init().
SESSION_EXPIREDA sessão expirou e não foi renovada.
SESSION_REFRESH_FAILEDUma renovação de sessão em segundo plano ou manual falhou.

Elements e validação de entrada

CodeDescrição
ELEMENT_NOT_MOUNTEDA operação requer um element que não foi montado no DOM.
ELEMENT_INVALIDO valor de um element é inválido.
ELEMENT_INCOMPLETEA entrada de um element está incompleta (um campo obrigatório não foi totalmente preenchido).
VALIDATION_ERRORA validação de entrada falhou.
INVALID_CARDO número do cartão falhou na validação.
INVALID_CPFO CPF falhou na validação.
INVALID_DOCUMENTO CPF ou CNPJ de um pagador de PIX ou boleto falhou na validação (SDK 2.8.0+).
EXPIRED_CARDA data de validade do cartão está no passado.

Tokenização

CodeDescrição
TOKENIZATION_FAILEDA tokenização não pôde ser concluída.
TOKEN_REGISTRATION_FAILEDO token não pôde ser registrado no backend — incluindo um pagador de PIX ou boleto recusado pela API.

Checkout

CodeDescrição
NO_CHECKOUT_SESSIONUma chamada de checkout foi feita sem um checkoutSessionId vinculado.
CHECKOUT_CONTEXT_FETCH_FAILEDO contexto do checkout não pôde ser obtido.

Pagamento e carteiras

CodeDescrição
PAYMENT_METHOD_DISABLEDO método de pagamento não está habilitado para este Merchant.
UNSUPPORTED_CARD_BRANDA bandeira do cartão não é suportada.
PAYMENT_CANCELLEDO pagamento foi cancelado (ex.: a folha do Apple Pay ou Google Pay foi fechada).
PAYMENT_FAILEDO pagamento falhou.

Transporte

CodeDescrição
NETWORK_ERRORUma requisição de rede falhou.
TIMEOUTUma requisição atingiu o tempo limite.
RATE_LIMITEDRequisições em excesso — o cliente está sendo limitado por taxa.
SERVER_ERRORO servidor retornou um erro.

RATE_LIMITED, SERVER_ERROR, NETWORK_ERROR e TIMEOUT normalmente carregam um httpStatus e um requestId. Para falhas de transporte transitórias, tente novamente com backoff exponencial em vez de repetir imediatamente. Veja Idempotência e limites de taxa.

Tratamento recomendado por categoria

Categorias diferentes exigem respostas diferentes. Use isto como política inicial.

CategoriaCódigos de exemploO que fazer
Corrija a integraçãoINVALID_CONFIG, INVALID_PUBLIC_KEY, NOT_IN_BROWSER, NOT_INITIALIZEDBugs na sua configuração. Exponha durante o desenvolvimento; não mostre o texto bruto aos usuários finais.
Peça ao usuário para corrigir a entradaELEMENT_INCOMPLETE, ELEMENT_INVALID, INVALID_CARD, INVALID_CPF, INVALID_DOCUMENT, EXPIRED_CARD, VALIDATION_ERRORExiba uma mensagem acionável no nível do campo e deixe o usuário tentar novamente.
Recupere a sessãoSESSION_EXPIRED, SESSION_REFRESH_FAILED, SESSION_CREATION_FAILEDReinicialize o bridge ou peça ao usuário para atualizar a página e, então, tente novamente.
Ajuste a ofertaPAYMENT_METHOD_DISABLED, UNSUPPORTED_CARD_BRANDOfereça um método de pagamento ou cartão diferente.
Ação esperada do usuárioPAYMENT_CANCELLEDTrate como um cancelamento benigno — retorne o usuário à etapa de pagamento sem um banner de erro.
Tente novamente com backoffNETWORK_ERROR, TIMEOUT, RATE_LIMITED, SERVER_ERRORTente novamente falhas transitórias com backoff exponencial; exiba uma mensagem de "tente novamente" não alarmante.
Falha genéricaTOKENIZATION_FAILED, TOKEN_REGISTRATION_FAILED, PAYMENT_FAILED, CHECKOUT_CONTEXT_FETCH_FAILEDExiba uma mensagem de falha genérica, registre o requestId e deixe o usuário tentar novamente.

Nunca exiba requestId, httpStatus ou details brutos aos usuários finais. Registre-os para sua própria depuração e suporte, e mostre apenas uma message limpa e amigável (ou seu próprio texto) na UI.

Próximos passos

Nesta página