Checkout hospedado de cartão internacional
A sessão de checkout é uma cobrança de cartão internacional de uso único que o comprador paga na
página hospedada da Lezty Pay. Você não tokeniza cartão nem trata 3DS: cria a sessão no seu servidor,
manda o comprador para a url e espera o webhook.
Vale para card em EUR, USD e GBP, com as mesmas regras de
Cartão e carteiras internacionais: gates, limites, taxa, saldo
internacional e webhook.
1. Crie a sessão
POST /v1/checkout-sessions com a sua chave de API (ou o token OAuth) com a permissão charges. O
header Idempotency-Key é obrigatório: use o id do pedido no seu sistema.
curl https://api.leztypay.com/v1/checkout-sessions \
-H "Authorization: Bearer $LEZTY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-A123" \
-d '{
"amount": 4990,
"currency": "EUR",
"description": "Plano anual",
"payment_method": "card",
"metadata": { "order_id": "A123" },
"postback_url": "https://loja.exemplo.com.br/webhooks/lezty",
"return_url": "https://loja.exemplo.com.br/obrigado",
"expires_in_seconds": 3600
}'
| Campo | Regra |
|---|---|
amount |
Centavos da moeda, mínimo 500 (5,00) |
currency |
EUR, USD ou GBP |
description |
Até 140 caracteres; o comprador vê na página |
payment_method |
Só card |
metadata |
As mesmas regras do metadata de POST /v1/transactions |
postback_url |
https, com o mesmo filtro de POST /v1/transactions; recebe os eventos da cobrança |
return_url |
https, sem usuário nem senha; o comprador volta para cá |
expires_in_seconds |
De 300 a 86400, padrão 3600 |
splits |
Mesma validação de POST /v1/transactions para cartão (hoje recusados) |
Resposta 201:
{
"id": "cs_01j9x5k8p2q3r4s5t6u7v8w9xy",
"object": "checkout_session",
"url": "https://pay.leztypay.com/s/cs_01j9x5k8p2q3r4s5t6u7v8w9xy",
"status": "open",
"mode": "live",
"payment_method": "card",
"amount": 4990,
"currency": "EUR",
"description": "Plano anual",
"metadata": { "order_id": "A123" },
"postback_url": "https://loja.exemplo.com.br/webhooks/lezty",
"return_url": "https://loja.exemplo.com.br/obrigado",
"transaction_id": null,
"expires_at": "2030-03-10T13:00:00.000Z",
"created_at": "2030-03-10T12:00:00.000Z"
}
Os gates do cartão internacional e os limites por venda e por dia rodam na criação, então um
503 payment_method_unavailable ou 400 intl_ticket_above_limit aparece aqui, antes de o comprador
abrir a página. Eles rodam de novo na hora do pagamento.
Repetir a mesma Idempotency-Key com o mesmo corpo devolve a mesma sessão, com
Idempotent-Replayed: true e o corpo da criação (o status ali é o de quando ela nasceu; para o
estado atual use o GET). Com corpo diferente, 409 idempotency_conflict.
2. Mande o comprador para a url
Na página, o comprador vê o valor, a descrição e o nome da sua loja, preenche nome, e-mail, telefone, documento e país e digita o cartão. O cartão vai direto para o adquirente; o 3DS, quando existe, acontece ali mesmo.
Uma sessão aceita no máximo um pagamento aprovado:
- cartão recusado: o comprador pode tentar outro cartão até
expires_at; - enquanto uma tentativa está sendo confirmada, a página não aceita outra;
- depois de paga, a sessão fica
completede recusa novas tentativas; - depois de
expires_atnenhuma tentativa nova começa, mas uma que já estava sendo confirmada (3DS, por exemplo) ainda pode ser paga: até ela resolver, a sessão continuaopen.
3. Confirme pelo webhook
A cobrança criada pela página leva o seu metadata e o seu postback_url, e dispara os eventos de
sempre (transaction.created, transaction.paid e os seguintes) com a assinatura da chave que criou
a sessão. Confirme o pedido só pelo transaction.paid.
4. Receba o comprador de volta
Depois do pagamento, a página leva o comprador para o return_url com session_id,
transaction_id e status=paid na query. Esses parâmetros são só navegação: não confirme o pedido
por eles. Consulte a sessão:
curl https://api.leztypay.com/v1/checkout-sessions/cs_01j9x5k8p2q3r4s5t6u7v8w9xy \
-H "Authorization: Bearer $LEZTY_API_KEY"
status |
Significado |
|---|---|
open |
Aceita pagamento até expires_at, ou tem uma tentativa ainda sendo confirmada |
completed |
Paga: transaction_id é a cobrança paga |
expired |
Venceu sem pagamento aprovado e sem tentativa em andamento |
transaction_id é a cobrança paga ou, antes disso, a última tentativa (null antes da primeira). O
detalhe, com o metadata, está em GET /v1/transactions/{id}. Se uma tentativa antiga for paga
depois de outra (raro, pagamento atrasado no banco), você recebe dois transaction.paid com o mesmo
metadata: a Lezty Pay estorna um deles, e a sessão segue completed com a primeira paga.
Erros da criação
| Resposta | Quando |
|---|---|
400 validation_failed |
Corpo inválido, return_url fora de https ou expires_in_seconds fora da faixa |
400 amount_too_small |
amount abaixo de 500 |
400 unsupported_currency |
Moeda fora de EUR, USD e GBP |
400 unsupported_payment_method |
payment_method diferente de card |
400 splits_unsupported_for_payment_method |
splits[] na sessão |
400 intl_ticket_above_limit |
Acima do limite por venda (details.limit_cents) |
409 intl_daily_limit_exceeded |
Acima do limite por dia |
409 idempotency_conflict |
Mesma Idempotency-Key com corpo diferente |
503 payment_method_unavailable |
Cartão nessa moeda indisponível para você agora (details.reason) |
Referência: Cria uma sessão de checkout (cartão internacional hospedado) e Consulta uma sessão de checkout.