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 moreExemplo 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.
| Field | Type | Descrição |
|---|---|---|
id | string | Id da sessão de checkout (cks_…). |
merchantId | string | Merchant que é dono da sessão (mrc_…). |
offerId | string | A oferta sendo comprada (ofr_…). |
customerId | string | null | Cliente vinculado (cust_…), ou null até ser identificado. |
customerEmail | string | null | E-mail do cliente, ou null até ser identificado. |
customerName | string | null | Nome do cliente, ou null até ser identificado. |
selectedCurrency | string | null | Moeda ISO 4217 selecionada para a sessão (ex.: "BRL"). |
status | string | Um de initiated, customer_identified, payment_pending, completed, expired, abandoned. |
externalSessionId | string | null | Sua própria referência de sessão/conta, se definida. |
expiresAt | string | null | Timestamp de expiração em ISO 8601. |
completedAt | string | null | Timestamp em ISO 8601 definido quando a sessão é concluída. |
createdAt | string | Timestamp de criação em ISO 8601. |
updatedAt | string | Timestamp da última atualização em ISO 8601. |
items | array | Os itens de linha precificados (veja abaixo). |
Cada entrada em items:
| Field | Type | Descrição |
|---|---|---|
id | string | Id do item de linha (cki_…). |
checkoutSessionId | string | Id da sessão de checkout pai (cks_…). |
offerId | string | A oferta precificada (ofr_…). |
currency | string | Código de moeda ISO 4217. |
amount | integer | Snapshot do preço em unidades menores (ex.: 9900 = R$99.00). |
firstChargeAmount | integer | null | Quanto 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. |
quantity | integer | Quantidade desta linha. |
installments | integer | Parcelas selecionadas pelo cliente (1 = cobrança única). |
createdAt | string | Timestamp 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.
| Field | Type | Descrição |
|---|---|---|
cards | boolean | Pagamentos com cartão são aceitos. |
pix | boolean | PIX é aceito. |
boleto | boolean | Boleto é aceito — true apenas quando um conector para o qual o merchant roteia boleto consegue cobrar um. |
applePay | boolean | Apple Pay é aceito. |
googlePay | boolean | Google Pay é aceito. |
cardBrands | string[] | Bandeiras de cartão aceitas (ex.: ["visa", "mastercard"]). |
installmentsSupported | boolean | Se o parcelamento está disponível. |
installmentOptions | object | min/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".
| Field | Type | Descrição |
|---|---|---|
id | string | Id do instrumento de pagamento salvo (pi_…). |
instrumentType | string | O tipo de instrumento (ex.: "card"). |
brand | string | null | Bandeira do cartão (ex.: "visa"), ou null. |
last4 | string | null | Últimos quatro dígitos, ou null. |
expMonth | integer | null | Mês de expiração (1–12), ou null. |
expYear | integer | null | Ano de expiração com quatro dígitos, ou null. |
reusable | boolean | Dica 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().
| Method | Returns | Descriçã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 | null | Retorna 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() | boolean | Se 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 availableIdentificar 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:
| Field | Type | Descrição |
|---|---|---|
context | CheckoutContext | null | O contexto buscado, ou null durante o carregamento ou antes da busca. |
isLoading | boolean | Se a busca inicial está em andamento. |
error | TokeflowError | null | O 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
- Colete um cartão e tokenize ele para o método de pagamento selecionado.
- Veja a superfície completa do SDK na visão geral do Bridge SDK.
- Gerencie sessões de checkout no lado do servidor pela API de sessões de checkout.
- Revise o tratamento de erros do SDK e o código
NO_CHECKOUT_SESSION.