Exemplo de Caso de Uso Completo: Implementação de Checkout para E-commerce
Cenário
Uma loja virtual precisa implementar um processo de checkout completo, permitindo ao cliente:
- Cadastrar-se ou fazer login
- Adicionar/selecionar endereço de entrega
- Escolher método de pagamento (cartão, boleto ou PIX)
- Visualizar opções de parcelamento
- Finalizar a compra
- Receber notificações sobre o status da transação
Fluxo de Implementação com a API Selectwin
O diagrama abaixo resume a sequência de chamadas dos passos a seguir — do cadastro do cliente à confirmação assíncrona via webhook:
sequenceDiagram
autonumber
participant C as Cliente (Browser)
participant L as Loja (Backend)
participant API as Selectwin API
participant WH as Webhook (Loja)
C->>L: Inicia checkout
L->>API: GET /v1/customers?email=...
alt cliente não existe
L->>API: POST /v1/customers
API-->>L: cus_...
end
L->>API: POST /v1/addresses
API-->>L: addr_...
opt cartão de crédito
L->>API: POST /v1/cards
API-->>L: card_...
L->>API: GET /v1/simulators/installments?amount=...
API-->>L: tabela de parcelas
end
L->>API: POST /v1/transactions
API-->>L: tra_... (201, status: pending)
opt PIX ou boleto
API-->>WH: POST webhook · transaction.pending (QR Code ou linha digitável)
WH-->>API: 200 OK
end
API-->>WH: POST webhook · transaction.approved (assíncrono)
WH-->>API: 200 OK
Note over L,WH: O resultado vem pelo webhook (não faça polling). Um GET pontual é opcional.Passo 1: Cadastro/Login do Cliente
// 1. Verificar se o cliente já existe
GET /v1/customers?email=cliente@exemplo.com
// 2. Se não existir, criar novo cliente
POST /v1/customers
{
"firstName": "João",
"lastName": "Silva",
"email": "cliente@exemplo.com",
"document": {
"type": "cpf",
"number": "12345678909"
},
"telephone": {
"countryCode": "55",
"areaCode": "11",
"number": "999998888"
}
}
// Resposta (salvar ID para próximos passos)
{
"id": "cus_123456789",
"firstName": "João",
"lastName": "Silva",
...
}Passo 2: Gerenciamento de Endereço
// 1. Listar endereços existentes do cliente (o filtro é customerid, tudo minúsculo)
GET /v1/addresses?customerid=cus_123456789
// 2. Se não houver endereço ou o cliente desejar cadastrar um novo
POST /v1/addresses
{
"customerId": "cus_123456789",
"street": "Avenida Paulista",
"number": "1000",
"complement": "Apto 123",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"postcode": "01310-100",
"primary": true
}
// Resposta (salvar ID para a transação)
{
"id": "addr_123456789",
"ownerType": "customer",
"ownerId": "cus_123456789",
...
}Passo 3: Criação do Cartão (quando aplicável)
// Se o cliente optar por salvar o cartão para futuras compras
POST /v1/cards
{
"customerId": "cus_123456789",
"holderName": "JOAO SILVA",
"numbering": "4111111111111111",
"expirationMonth": 12,
"expirationYear": 2030,
"securityCode": "123"
}
// Resposta (salvar ID para a transação)
{
"id": "card_123456789",
"holderName": "JOAO SILVA",
"firstDigits": "411111",
"lastDigits": "1111",
"brand": "visa",
...
}Passo 4: Opções de Parcelamento (cartão)
Para mostrar as parcelas ao cliente, simule a tabela para o valor do pedido:
GET /v1/simulators/installments?amount=10000
// Resposta (resumida): uma linha por número de parcelas, até o máximo da conta
{
"resource": "credit",
"installments": [
{ "installment": 1, "installmentAmountCents": 10000, "totalAmountCents": 10000,
"extraFee": false, "description": "sem juros" },
{ "installment": 3, "installmentAmountCents": 3333, "totalAmountCents": 10000,
"extraFee": false, "description": "sem juros" },
{ "installment": 6, "installmentAmountCents": 1783, "totalAmountCents": 10700,
"extraFee": true, "description": "com juros" },
...
],
...
}installmentAmountCentsé o valor de cada parcela etotalAmountCents, o total que o cliente paga;extraFee: truemarca as linhas com juros do comprador (os configurados na conta).- Na cobrança, envie o
amountdo pedido (sem juros) e o número deinstallmentsescolhido: a API aplica o mesmo cálculo da simulação e cobra o total daquela linha (payment.financeInstallments, ligado por padrão). Com juros, oamountda transação passa a ser o total financiado, e ooriginalAmountguarda o valor do pedido. - Pedir mais parcelas do que a tabela oferece responde
422.
Passo 5: Processamento da Transação
Cartão de crédito
// Criação da transação com cartão de crédito em 3x
POST /v1/transactions
{
"amount": 10000,
"externalReference": "PEDIDO-123",
"customer": {
"id": "cus_123456789"
},
"payment": {
"method": "credit",
"currency": "BRL",
"installments": 3,
"card": {
"id": "card_123456789"
}
},
"billing": {
"address": {
"id": "addr_123456789"
}
},
"items": [
{
"name": "Smartphone XYZ",
"unitPrice": 10000,
"quantity": 1
}
],
"metadata": {
"source": "website",
"campaign": "summer_sale"
}
}
// Resposta da transação (a criação é ASSÍNCRONA: nasce "pending")
{
"id": "tra_123456789",
"amount": 10000,
"status": "pending",
"method": "credit",
...
}O desfecho chega por webhook: transaction.approved ou transaction.failed.
PIX
// PIX: o QR Code vale 30 minutos
POST /v1/transactions
{
"amount": 10000,
"externalReference": "PEDIDO-124",
"customer": {
"id": "cus_123456789"
},
"payment": {
"method": "pix",
"currency": "BRL",
"pix": {
"expiresInMinutes": 30
}
},
"items": [
{
"name": "Smartphone XYZ",
"unitPrice": 10000,
"quantity": 1
}
]
}
// Resposta: nasce "pending", ainda sem o QR Code
{
"id": "tra_223456789",
"amount": 10000,
"status": "pending",
"method": "pix",
...
}O QR Code chega logo depois, no webhook transaction.pending, e fica na leitura da transação
(GET /v1/transactions/{id}):
{
"type": "transaction.pending",
"payload": {
"object": {
"id": "tra_223456789",
"externalReference": "PEDIDO-124",
"status": "pending",
"method": "pix",
"payment": {
"pixQrCodeEmv": "000201010212...",
"pixQrCodeUrl": "https://...",
"expirationDate": "2023-06-15T15:00:45Z"
}
}
}
}- Mostre ao cliente o copia e cola (
payment.pixQrCodeEmv) e gere a imagem do QR Code a partir dele: a API não gera a imagem (payment.pixQrCodeImagevem semprenull). - Sem
pix.expiresInMinutes, vale o prazo configurado na conta (o padrão é 30 minutos). - Pago, chega
transaction.approved. Vencido sem pagamento,transaction.canceled; se o pagamento ainda chegar depois disso, a transação é aprovada (transaction.approved).
Boleto
// Boleto: vence em 3 dias; o endereço de cobrança é obrigatório
POST /v1/transactions
{
"amount": 10000,
"externalReference": "PEDIDO-125",
"customer": {
"id": "cus_123456789"
},
"payment": {
"method": "billet",
"currency": "BRL",
"billet": {
"expiresInDays": 3
}
},
"billing": {
"address": {
"id": "addr_123456789"
}
},
"items": [
{
"name": "Smartphone XYZ",
"unitPrice": 10000,
"quantity": 1
}
]
}
// Resposta: nasce "pending", ainda sem a linha digitável
{
"id": "tra_323456789",
"amount": 10000,
"status": "pending",
"method": "billet",
...
}Como no PIX, os dados do boleto chegam no webhook transaction.pending e ficam na leitura da transação:
a linha digitável em payment.billetBarcode, o link do boleto em payment.billetUrl e o vencimento em
payment.expirationDate. Pago, chega transaction.approved. O boleto fica pending até o vencimento e não é
cancelado automaticamente quando vence: continua pending até ser pago (transaction.approved, inclusive com
atraso) ou baixado (transaction.canceled).
Passo 6: Configuração de Webhook para Notificações
Uma vez só, antes da primeira cobrança:
// Configurar webhook para receber notificações de status
POST /v1/webhooks
{
"name": "Notificações de Transações",
"endpoint": "https://minhalojavirtual.com/webhooks/selectwin",
"events": [
"transaction.pending",
"transaction.approved",
"transaction.failed",
"transaction.canceled",
"transaction.refunded"
]
}
// Resposta (traz o `secret` whsec_... — guarde-o para verificar a assinatura)
{
"id": "wbe_123456789",
"name": "Notificações de Transações",
"endpoint": "https://minhalojavirtual.com/webhooks/selectwin",
"secret": "whsec_...",
...
}O transaction.pending traz o QR Code do PIX e a linha digitável do boleto (passo 5).
Passo 7: Recebimento e Processamento de Eventos
O servidor da loja virtual deverá implementar um endpoint para receber as notificações via webhook. Exemplo de evento recebido:
O objeto do recurso é entregue em payload.object (mesma estrutura da leitura do recurso) — não
há chave data/resource no nível raiz.
{
"id": "wbh_123456789",
"type": "transaction.approved",
"source": "automatic",
"payload": {
"object": {
"id": "tra_123456789",
"externalReference": "PEDIDO-123",
"amount": 10000,
"status": "approved",
"method": "credit",
"payment": {
"cardFirstDigits": "411111",
"cardLastDigits": "1111",
"cardBrand": "visa",
"installments": 3
},
"customer": {
"id": "cus_123456789",
"firstName": "João",
"lastName": "Silva"
}
}
},
"createdAt": "2023-06-15T14:35:30Z"
}Passo 8: Consulta de Status da Transação
// Para verificar o status atual de uma transação (uma consulta pontual, não polling)
GET /v1/transactions/tra_123456789
// Resposta (resumida)
{
"id": "tra_123456789",
"externalReference": "PEDIDO-123",
"status": "approved",
"method": "credit",
"payment": {
"installments": 3,
"paidAt": "2023-06-15T14:31:15Z",
...
},
...
}Passo 9: Listagem de Transações para Painel do Cliente
// Listar as transações do cliente para exibir em um painel (a mais recente primeiro)
GET /v1/transactions?customerId=cus_123456789&limit=10
// Resposta (cada item é uma projeção leve: amount vem como string, e customId é o identificador gerado pela API)
{
"offset": 0,
"limit": 10,
"total": 2,
"page": {
"offset": {
"first": 0,
"prev": 0,
"next": 0,
"last": 0
},
"current": 1,
"total": 1
},
"hasMore": false,
"data": [
{
"id": "tra_123456789",
"customId": "E5D4C3B2A1",
"customerId": "cus_123456789",
"amount": "10000",
"status": "approved",
"method": "credit",
"createdAt": "2023-06-15T14:30:45Z"
},
{
"id": "tra_987654321",
"customId": "K7M8N9P2Q3",
"customerId": "cus_123456789",
"amount": "5000",
"status": "approved",
"method": "pix",
"createdAt": "2023-06-10T11:22:33Z"
}
]
}Considerações Finais
Este caso de uso demonstra como utilizar os diferentes recursos da API Selectwin de forma integrada para criar uma experiência de checkout completa. Os principais aspectos implementados incluem:
- Gestão de Clientes: Criação e consulta de perfis de cliente
- Gestão de Endereços: Adição e seleção de endereços
- Pagamentos: Suporte a cartão, PIX e boleto, com parcelamento no cartão
- Processamento de Transações: Execução de pagamentos com diferentes métodos
- Notificações em Tempo Real: Configuração de webhooks para receber atualizações de status
- Consulta de Histórico: Listagem e verificação de transações anteriores
A flexibilidade da API permite personalizar cada etapa de acordo com as necessidades específicas do negócio, oferecendo uma solução completa e robusta para processamento de pagamentos online.
Atualizado em 21 de outubro de 2026