Contexto de checkout

Vincule o Bridge SDK a uma sessão de checkout criada no backend e leia o contexto completo do checkout — itens precificados, moeda selecionada, métodos de pagamento disponíveis e os cartões salvos do cliente — para renderizar um checkout dinâmico e orientado pelo servidor.

Seu backend é o dono do checkout. Ele cria uma sessão de checkout com sua chave secreta — precificando a oferta, selecionando a moeda e identificando o cliente. O Bridge SDK então se vincula a essa sessão no navegador e lê o contexto dela: os itens precificados, a moeda selecionada, os métodos de pagamento disponíveis do Merchant e os cartões salvos do cliente.

Isso permite que você renderize uma UI de checkout única e dinâmica, orientada inteiramente pelo servidor. O navegador nunca decide o que é cobrado, em qual moeda ou quais métodos de pagamento são permitidos — ele apenas lê e renderiza.

O SDK é inicializado com uma chave pública (pk_…). Chaves públicas são restritas a escopos seguros para o cliente e podem ser incluídas com segurança no código do navegador. A sessão de checkout é criada no lado do servidor com uma chave secreta (sk_…), que nunca deve aparecer no navegador. Veja Authentication.

Como funciona

A sessão de checkout é a fonte da verdade. Seu servidor a cria e a modifica; o SDK se vincula a ela pelo id e lê o contexto dela para renderizar a UI.

Vincular uma sessão de checkout

Passe o checkoutSessionId criado no backend para o construtor do bridge. Depois que init() for resolvido, o bridge estará vinculado a esse checkout e poderá ler o contexto dele.

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

const tokeflow = new TokeflowBridge({
  publicKey: 'pk_live_mer_xxx',
  checkoutSessionId: 'cks_a1b2c3d4e5', // created by your backend
});

await tokeflow.init();

O checkoutSessionId é criado pelo seu servidor e passado ao navegador — por exemplo, embutido na página renderizada ou buscado pelo seu frontend a partir da sua própria API. Não crie sessões de checkout a partir do código do cliente.

Ler o contexto

Chame tokeflow.checkout.getContext() para buscar e armazenar em cache o contexto completo do checkout. Ele retorna três objetos de nível superior: checkout (a sessão e seus itens precificados), paymentMethods (o que o Merchant pode aceitar) e savedInstruments (os cartões salvos do cliente vinculado).

const context = await tokeflow.checkout.getContext();

console.log(context.checkout.selectedCurrency); // 'BRL'
console.log(context.paymentMethods.cards);      // true
console.log(context.savedInstruments.length);   // 0 or more

Exemplo de contexto

{
  "checkout": {
    "id": "cks_a1b2c3d4e5",
    "merchantId": "mrc_a1b2c3d4e5",
    "offerId": "ofr_a1b2c3d4e5",
    "customerId": "cust_a1b2c3d4e5",
    "customerEmail": "jane@acme.com",
    "customerName": "Jane Doe",
    "selectedCurrency": "BRL",
    "status": "customer_identified",
    "externalSessionId": "sess_external_42",
    "expiresAt": "2026-05-20T18:00:00Z",
    "completedAt": null,
    "createdAt": "2026-05-19T12:00:00Z",
    "updatedAt": "2026-05-19T12:05:00Z",
    "items": [
      {
        "id": "cki_a1b2c3d4e5",
        "checkoutSessionId": "cks_a1b2c3d4e5",
        "offerId": "ofr_a1b2c3d4e5",
        "currency": "BRL",
        "amount": 9900,
        "firstChargeAmount": null,
        "quantity": 1,
        "installments": 1,
        "createdAt": "2026-05-19T12:00:00Z"
      }
    ]
  },
  "paymentMethods": {
    "cards": true,
    "pix": true,
    "boleto": false,
    "applePay": false,
    "googlePay": false,
    "cardBrands": ["visa", "mastercard"],
    "installmentsSupported": true,
    "installmentOptions": {
      "credit_card": { "min": 1, "max": 12 }
    }
  },
  "savedInstruments": [
    {
      "id": "pi_a1b2c3d4e5",
      "instrumentType": "card",
      "brand": "visa",
      "last4": "4242",
      "expMonth": 12,
      "expYear": 2030,
      "reusable": false
    }
  ],
  "savedCardCheckoutEnabled": false
}

checkout

A sessão de checkout que o SDK está renderizando. Os valores são snapshots capturados no momento da sessão, em unidades menores (centavos). O status segue o ciclo de vida da sessão de checkout.

FieldTypeDescrição
idstringId da sessão de checkout (cks_…).
merchantIdstringMerchant que é dono da sessão (mrc_…).
offerIdstringA oferta sendo comprada (ofr_…).
customerIdstring | nullCliente vinculado (cust_…), ou null até ser identificado.
customerEmailstring | nullE-mail do cliente, ou null até ser identificado.
customerNamestring | nullNome do cliente, ou null até ser identificado.
selectedCurrencystring | nullMoeda ISO 4217 selecionada para a sessão (ex.: "BRL").
statusstringUm de initiated, customer_identified, payment_pending, completed, expired, abandoned.
externalSessionIdstring | nullSua própria referência de sessão/conta, se definida.
expiresAtstring | nullTimestamp de expiração em ISO 8601.
completedAtstring | nullTimestamp em ISO 8601 definido quando a sessão é concluída.
createdAtstringTimestamp de criação em ISO 8601.
updatedAtstringTimestamp da última atualização em ISO 8601.
itemsarrayOs itens de linha precificados (veja abaixo).

Cada entrada em items:

FieldTypeDescrição
idstringId do item de linha (cki_…).
checkoutSessionIdstringId da sessão de checkout pai (cks_…).
offerIdstringA oferta precificada (ofr_…).
currencystringCódigo de moeda ISO 4217.
amountintegerSnapshot do preço em unidades menores (ex.: 9900 = R$99.00).
firstChargeAmountinteger | nullQuanto a primeira cobrança leva, em unidades menores, quando isso difere de amount; caso contrário, null. Definido por uma cobrança de setup e por um período de teste gratuito — que resolve para 0, porque um período de teste não cobra nada no início.
quantityintegerQuantidade desta linha.
installmentsintegerParcelas selecionadas pelo cliente (1 = cobrança única).
createdAtstringTimestamp de criação em ISO 8601.

paymentMethods

Os métodos de pagamento que o Merchant pode aceitar, resolvidos a partir da sua configuração de roteamento. Use-os para renderizar apenas as opções que o Merchant realmente suporta.

FieldTypeDescrição
cardsbooleanPagamentos com cartão são aceitos.
pixbooleanPIX é aceito.
boletobooleanBoleto é aceito — true apenas quando um conector para o qual o merchant roteia boleto consegue cobrar um.
applePaybooleanApple Pay é aceito.
googlePaybooleanGoogle Pay é aceito.
cardBrandsstring[]Bandeiras de cartão aceitas (ex.: ["visa", "mastercard"]).
installmentsSupportedbooleanSe o parcelamento está disponível.
installmentOptionsobjectmin/max de parcelas indexados por método de pagamento (ex.: { "credit_card": { "min": 1, "max": 12 } }).

savedInstruments

As opções de pagamento salvas de um cliente recorrente — enxutas e seguras para o cliente. O array fica vazio quando nenhum cliente está vinculado ou o cliente não tem instrumentos salvos. Eles nunca incluem identificadores sensíveis; carregam apenas o que você precisa para renderizar uma escolha de "pagar com cartão salvo".

FieldTypeDescrição
idstringId do instrumento de pagamento salvo (pi_…).
instrumentTypestringO tipo de instrumento (ex.: "card").
brandstring | nullBandeira do cartão (ex.: "visa"), ou null.
last4string | nullÚltimos quatro dígitos, ou null.
expMonthinteger | nullMês de expiração (1–12), ou null.
expYearinteger | nullAno de expiração com quatro dígitos, ou null.
reusablebooleanDica consultiva (SDK 2.7.1+): true apenas quando o checkout com cartão salvo está habilitado para o merchant e este instrumento guarda uma credencial armazenada em um conector ativo capaz de cobrá-lo nesta sessão. Instrumentos que não são cartão sempre reportam false.

savedCardCheckoutEnabled

boolean (SDK 2.7.1+). Se o checkout com cartão salvo está habilitado para o merchant — pagar uma sessão de checkout com um instrumento salvo, sem redigitar o cartão. Ele reflete o opt-in saved_card_checkout_enabled do merchant tal como ele é de fato aplicado, que vem desligado por padrão; enquanto for false, todo instrumento reporta reusable: false. Trate os dois campos como false quando ausentes.

Use o Bridge SDK 2.7.1 ou posterior. O pacote 2.7.0 publicado continha o build da 2.6.0, então seus bundles e tipos não têm savedCardCheckoutEnabled nem SavedInstrument.reusable.

Use os dois campos para decidir quais cartões salvos oferecer:

const { savedInstruments, savedCardCheckoutEnabled } =
  await tokeflow.checkout.getContext();

const oneClickCards = savedCardCheckoutEnabled
  ? savedInstruments.filter((card) => card.reusable)
  : [];

O navegador nunca cobra um instrumento salvo — savedInstruments é somente leitura e o SDK não tem chamada charge(). Quando o cliente escolhe um cartão salvo, envie o id dele ao seu servidor, que paga a sessão com POST /transactions e checkout_session_id, payment_instrument_id e credential_on_file: true. Veja Checkout com cartão salvo. reusable é consultivo: a cobrança ainda pode ser recusada, então mantenha o formulário de cartão disponível como alternativa.

Métodos

O módulo Checkout fica disponível em tokeflow.checkout depois de init().

MethodReturnsDescrição
getContext()Promise<CheckoutContext>Busca e armazena em cache o contexto do checkout. Rejeita com NO_CHECKOUT_SESSION se nenhuma sessão estiver vinculada.
getCachedContext()CheckoutContext | nullRetorna o contexto em cache de forma síncrona (sem chamada de rede); null se ainda não tiver sido buscado.
refresh()Promise<CheckoutContext>Busca novamente o contexto depois que seu backend modifica o checkout (identifica o cliente, altera itens e assim por diante).
hasCheckoutSession()booleanSe uma sessão de checkout está vinculada a este bridge.

Leituras em cache vs. atualizadas

getContext() armazena o resultado em cache. Recorra a getCachedContext() quando precisar do contexto já buscado de forma síncrona — por exemplo, durante uma renderização — sem disparar uma chamada de rede.

// First read: network fetch + cache
const context = await tokeflow.checkout.getContext();

// Later, synchronously (no network):
const cached = tokeflow.checkout.getCachedContext();
if (cached) {
  renderSummary(cached.checkout.items);
}

Atualizar após mutações no backend

O contexto do checkout é um snapshot. Quando seu backend modifica a sessão — identifica o cliente, altera itens de linha ou troca a moeda — chame refresh() para obter o estado mais recente.

// e.g. after your server identifies the customer on the checkout
const updated = await tokeflow.checkout.refresh();
console.log(updated.checkout.customerEmail);   // now populated
console.log(updated.savedInstruments.length);  // saved cards now available

Identificar o cliente no lado do servidor e então chamar refresh() é como os cartões salvos aparecem: savedInstruments é preenchido apenas quando um cliente é vinculado à sessão.

Salvando o cartão com que o cliente está pagando

Para que um cliente recorrente pule a digitação do cartão da próxima vez, tokenize com saveCard: true quando ele marcar "salvar meu cartão". Para uma oferta avulsa isso emite um token cadastrável; uma oferta recorrente sempre cadastra. Veja Tokenização → Opções.

const token = await tokeflow.cards.tokenize({ card: cardElement }, { saveCard: true });

Lidando com a ausência de sessão vinculada

Se o bridge foi criado sem checkoutSessionId, as chamadas de checkout não têm nada para ler. getContext() rejeita com o código de erro NO_CHECKOUT_SESSION; proteja-se com hasCheckoutSession() ou capture o erro.

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

if (!tokeflow.checkout.hasCheckoutSession()) {
  // No checkout linked — fall back to a standalone tokenization flow.
}

try {
  const context = await tokeflow.checkout.getContext();
} catch (error) {
  if (error.code === TokeflowErrorCode.NO_CHECKOUT_SESSION) {
    // The bridge was initialized without `checkoutSessionId`.
  }
}

getContext() sempre reflete o estado do servidor. Trate valores, moeda e métodos de pagamento disponíveis como autoritativos — nunca deixe o navegador sobrescrever o que o servidor precificou ou habilitou.

React

Use o hook useCheckout() para buscar, armazenar em cache e re-renderizar o contexto do checkout. Ele exige que checkoutSessionId esteja definido na configuração do TokeflowProvider.

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

function App() {
  return (
    <TokeflowProvider
      config={{
        publicKey: 'pk_live_mer_xxx',
        checkoutSessionId: 'cks_a1b2c3d4e5', // from your backend
      }}
    >
      <CheckoutSummary />
    </TokeflowProvider>
  );
}

function CheckoutSummary() {
  const { context, isLoading, error, refresh } = useCheckout();

  if (error) return <p>{error.message}</p>;
  if (isLoading || !context) return <p>Loading…</p>;

  const { checkout, paymentMethods, savedInstruments } = context;

  return (
    <div>
      <ul>
        {checkout.items.map((item) => (
          <li key={item.id}>
            {item.offerId} — {item.amount} {item.currency} × {item.quantity}
          </li>
        ))}
      </ul>

      {paymentMethods.cards && <p>Card payments available</p>}
      {paymentMethods.pix && <p>PIX available</p>}

      {savedInstruments.length > 0 && (
        <ul>
          {savedInstruments.map((pi) => (
            <li key={pi.id}>
              {pi.brand} •••• {pi.last4} — {pi.expMonth}/{pi.expYear}
            </li>
          ))}
        </ul>
      )}

      <button onClick={() => refresh()}>Refresh</button>
    </div>
  );
}

O hook useCheckout() retorna:

FieldTypeDescrição
contextCheckoutContext | nullO contexto buscado, ou null durante o carregamento ou antes da busca.
isLoadingbooleanSe a busca inicial está em andamento.
errorTokeflowError | nullO erro de busca, se houver (ex.: NO_CHECKOUT_SESSION).
refresh() => Promise<CheckoutContext>Busca novamente o contexto após uma mutação no backend.

Próximos passos

Nesta página