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
}| Property | Type | Sempre presente | Descrição |
|---|---|---|---|
code | TokeflowErrorCode | Sim | Código estável e legível por máquina. Faça switch nele. Veja a tabela completa. |
message | string | Sim | Explicação legível por humanos. Segura para exibição, mas o texto pode mudar ao longo do tempo — nunca faça parsing dela. |
httpStatus | number | Não | Presente quando o erro se originou de uma requisição de API (ex.: 429, 500). |
requestId | string | Não | Identificador da requisição (req_…) para a chamada de API subjacente, quando disponível. Registre-o. |
details | unknown | Não | Contexto 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
| Code | Descrição |
|---|---|
INVALID_CONFIG | A configuração do SDK é inválida (opções incorretas ou conflitantes). |
INVALID_PUBLIC_KEY | A chave pública está ausente ou não é uma chave pk_… válida. |
NOT_IN_BROWSER | O SDK foi usado fora de um ambiente de navegador (ex.: durante renderização no servidor). |
NOT_INITIALIZED | Um método do SDK foi chamado antes de init() ser resolvido. |
Ciclo de vida da sessão
| Code | Descrição |
|---|---|
SESSION_CREATION_FAILED | O SDK não conseguiu criar uma sessão durante init(). |
SESSION_EXPIRED | A sessão expirou e não foi renovada. |
SESSION_REFRESH_FAILED | Uma renovação de sessão em segundo plano ou manual falhou. |
Elements e validação de entrada
| Code | Descrição |
|---|---|
ELEMENT_NOT_MOUNTED | A operação requer um element que não foi montado no DOM. |
ELEMENT_INVALID | O valor de um element é inválido. |
ELEMENT_INCOMPLETE | A entrada de um element está incompleta (um campo obrigatório não foi totalmente preenchido). |
VALIDATION_ERROR | A validação de entrada falhou. |
INVALID_CARD | O número do cartão falhou na validação. |
INVALID_CPF | O CPF falhou na validação. |
INVALID_DOCUMENT | O CPF ou CNPJ de um pagador de PIX ou boleto falhou na validação (SDK 2.8.0+). |
EXPIRED_CARD | A data de validade do cartão está no passado. |
Tokenização
| Code | Descrição |
|---|---|
TOKENIZATION_FAILED | A tokenização não pôde ser concluída. |
TOKEN_REGISTRATION_FAILED | O token não pôde ser registrado no backend — incluindo um pagador de PIX ou boleto recusado pela API. |
Checkout
| Code | Descrição |
|---|---|
NO_CHECKOUT_SESSION | Uma chamada de checkout foi feita sem um checkoutSessionId vinculado. |
CHECKOUT_CONTEXT_FETCH_FAILED | O contexto do checkout não pôde ser obtido. |
Pagamento e carteiras
| Code | Descrição |
|---|---|
PAYMENT_METHOD_DISABLED | O método de pagamento não está habilitado para este Merchant. |
UNSUPPORTED_CARD_BRAND | A bandeira do cartão não é suportada. |
PAYMENT_CANCELLED | O pagamento foi cancelado (ex.: a folha do Apple Pay ou Google Pay foi fechada). |
PAYMENT_FAILED | O pagamento falhou. |
Transporte
| Code | Descrição |
|---|---|
NETWORK_ERROR | Uma requisição de rede falhou. |
TIMEOUT | Uma requisição atingiu o tempo limite. |
RATE_LIMITED | Requisições em excesso — o cliente está sendo limitado por taxa. |
SERVER_ERROR | O 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.
| Categoria | Códigos de exemplo | O que fazer |
|---|---|---|
| Corrija a integração | INVALID_CONFIG, INVALID_PUBLIC_KEY, NOT_IN_BROWSER, NOT_INITIALIZED | Bugs 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 entrada | ELEMENT_INCOMPLETE, ELEMENT_INVALID, INVALID_CARD, INVALID_CPF, INVALID_DOCUMENT, EXPIRED_CARD, VALIDATION_ERROR | Exiba uma mensagem acionável no nível do campo e deixe o usuário tentar novamente. |
| Recupere a sessão | SESSION_EXPIRED, SESSION_REFRESH_FAILED, SESSION_CREATION_FAILED | Reinicialize o bridge ou peça ao usuário para atualizar a página e, então, tente novamente. |
| Ajuste a oferta | PAYMENT_METHOD_DISABLED, UNSUPPORTED_CARD_BRAND | Ofereça um método de pagamento ou cartão diferente. |
| Ação esperada do usuário | PAYMENT_CANCELLED | Trate como um cancelamento benigno — retorne o usuário à etapa de pagamento sem um banner de erro. |
| Tente novamente com backoff | NETWORK_ERROR, TIMEOUT, RATE_LIMITED, SERVER_ERROR | Tente novamente falhas transitórias com backoff exponencial; exiba uma mensagem de "tente novamente" não alarmante. |
| Falha genérica | TOKENIZATION_FAILED, TOKEN_REGISTRATION_FAILED, PAYMENT_FAILED, CHECKOUT_CONTEXT_FETCH_FAILED | Exiba 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
- Tokenização — formatos de entrada, opções e a resposta do token.
- Visão geral do Bridge SDK — instalação, ciclo de vida e o requisito da chave pública.
- Erros — o envelope de erro do lado do servidor retornado pela API Tokeflow.
- Idempotência e limites de taxa — tente novamente com segurança e trate respostas
429.