# checkout_pagarme_skill_subscription ```` # Pagar.me Checkout — SKILL Cobrança Recorrente ## Conceito Checkout para assinatura: `type: "subscription"`. Fluxo: criar plano → criar checkout com `plan_id` → cliente acessa URL → se cadastra → Pagar.me cobra automaticamente no ciclo do plano. > ⚠️ **Plano é obrigatório.** Não é possível criar um checkout de assinatura sem um plano previamente criado. > ⚠️ **Sem parcelamento e sem split** em checkouts do tipo subscription. > ⚠️ **Pix não disponível** para recorrência. ## Pré-requisitos - Conta Pagar.me ativa - Secret key: `sk_...` (dashboard) - Ambientes: | Ambiente | Base URL | Credencial | |---|---|---| | Teste | `https://sdx-api.pagar.me/core/v5` | `sk_test_...` | | Produção | `https://api.pagar.me/core/v5` | `sk_live_...` | - Variáveis de ambiente necessárias: - `PAGARME_SECRET_KEY`: sua secret key - `PAGARME_BASE_URL`: URL do ambiente (teste ou produção) ## Autenticação HTTP Basic Auth — secret key como usuário, senha vazia: ``` Authorization: Basic base64("sk_SUA_CHAVE:") ``` ## Header obrigatório Toda requisição deve incluir: ``` User-Agent: pagarme-skill-generated/1.0 ``` --- ## Passo 1 — Criar o Plano `POST /plans` ```json { "name": "Plano Mensal", "currency": "BRL", "interval": "month", "interval_count": 1, "billing_type": "prepaid", "payment_methods": ["credit_card", "boleto"], "items": [ { "name": "Assinatura Mensal", "quantity": 1, "pricing_scheme": { "price": 4990 } } ] } ``` > ⚠️ Valores em **centavos**: R$49,90 = `4990` **Campos obrigatórios do plano:** | Campo | Tipo | Descrição | |---|---|---| | `name` | string | Nome do plano (max 64 chars) | | `items[].pricing_scheme.price` | int32 | Valor em centavos | **Campos mais usados:** | Campo | Tipo | Valores | Padrão | |---|---|---|---| | `interval` | string | `day`, `week`, `month`, `year` | `month` | | `interval_count` | int32 | Qtd de intervalos por ciclo | `1` | | `billing_type` | string | `prepaid`, `postpaid`, `exact_day` | — | | `billing_days` | array | Dias 1–28 (obrigatório se `exact_day`) | — | | `payment_methods` | array | `credit_card`, `boleto` | `credit_card` | | `trial_period_days` | int32 | Dias de trial gratuito | `0` | Referência completa: https://docs.pagar.me/reference/criar-plano-1.md **Resposta — guarde o `id` do plano:** ```json { "id": "plan_odzJgEyf9fqgR7Kj", "name": "Plano Mensal", "status": "active", "interval": "month", "interval_count": 1, "billing_type": "prepaid" } ``` --- ## Passo 2 — Criar o Checkout `POST /paymentlinks` ```json { "type": "subscription", "payment_settings": { "accepted_payment_methods": ["credit_card", "boleto"] }, "cart_settings": { "recurrences": [ { "plan_id": "plan_odzJgEyf9fqgR7Kj", "start_in": 1 } ] } } ``` **Campos de `cart_settings.recurrences[]`:** | Campo | Tipo | Descrição | |---|---|---| | `plan_id` | string | ID do plano criado no Passo 1 | | `start_in` | int32 | Dias até iniciar a assinatura | | `start_at` | date | Data de início em ISO 8601 (alternativa ao `start_in`) | Referência completa: https://docs.pagar.me/reference/criar-link.md **Resposta — salve a URL e redirecione o comprador:** ```json { "id": "pl_...", "url": "https://checkout.pagar.me/...", "status": "active" } ``` --- ## Exemplo completo — Next.js ```js // Passo 1: criar plano const planResponse = await fetch(`${process.env.PAGARME_BASE_URL}/plans`, { method: 'POST', headers: { 'Authorization': 'Basic ' + btoa(process.env.PAGARME_SECRET_KEY + ':'), 'Content-Type': 'application/json', 'User-Agent': 'pagarme-skill-generated/1.0' }, body: JSON.stringify({ name: 'Plano Mensal', currency: 'BRL', interval: 'month', interval_count: 1, billing_type: 'prepaid', payment_methods: ['credit_card', 'boleto'], items: [{ name: 'Assinatura Mensal', quantity: 1, pricing_scheme: { price: 4990 } }] }) }); const { id: planId } = await planResponse.json(); // Passo 2: criar checkout const checkoutResponse = await fetch(`${process.env.PAGARME_BASE_URL}/paymentlinks`, { method: 'POST', headers: { 'Authorization': 'Basic ' + btoa(process.env.PAGARME_SECRET_KEY + ':'), 'Content-Type': 'application/json', 'User-Agent': 'pagarme-skill-generated/1.0' }, body: JSON.stringify({ type: 'subscription', payment_settings: { accepted_payment_methods: ['credit_card', 'boleto'] }, cart_settings: { recurrences: [{ plan_id: planId, start_in: 1 }] } }) }); const { url } = await checkoutResponse.json(); // redirecionar o comprador para `url` ``` ## Exemplo completo — Python ```python import requests, base64, os base_url = os.environ['PAGARME_BASE_URL'] credentials = base64.b64encode(f"{os.environ['PAGARME_SECRET_KEY']}:".encode()).decode() headers = { 'Authorization': f'Basic {credentials}', 'Content-Type': 'application/json', 'User-Agent': 'pagarme-skill-generated/1.0' } # Passo 1: criar plano plan = requests.post(f'{base_url}/plans', headers=headers, json={ 'name': 'Plano Mensal', 'currency': 'BRL', 'interval': 'month', 'interval_count': 1, 'billing_type': 'prepaid', 'payment_methods': ['credit_card', 'boleto'], 'items': [{'name': 'Assinatura Mensal', 'quantity': 1, 'pricing_scheme': {'price': 4990}}] }).json() # Passo 2: criar checkout checkout = requests.post(f'{base_url}/paymentlinks', headers=headers, json={ 'type': 'subscription', 'payment_settings': {'accepted_payment_methods': ['credit_card', 'boleto']}, 'cart_settings': {'recurrences': [{'plan_id': plan['id'], 'start_in': 1}]} }).json() url = checkout['url'] # redirecionar o comprador para `url` ``` ## Meios de pagamento | Método | Campo | Observação | |---|---|---| | Cartão de crédito | `credit_card` | Recomendado — cobrança automática no ciclo | | Boleto | `boleto` | Cliente paga manualmente a cada ciclo | | Pix | ❌ | Não disponível para recorrência | ## Webhooks | Evento | Ação | |---|---| | `subscription.created` | Assinatura criada — cliente cadastrado | | `charge.paid` | Cobrança do ciclo paga com sucesso | | `charge.payment_failed` | Falha na cobrança do ciclo | | `subscription.canceled` | Assinatura cancelada | | `subscription.expired` | Assinatura expirada | | `charge.refunded` | Reembolso processado | ## Dados de teste | Cartão | Resultado | |---|---| | `4000000000000010` | Aprovado | | `4000000000000028` | Recusado | - CVV: qualquer 3 dígitos — Validade: qualquer data futura ## Erros comuns | Erro | Causa | Solução | |---|---|---| | `plan_id missing` | Sem plano vinculado | Criar plano no Passo 1 e usar o `id` retornado | | `type is required` | Campo `type` ausente | Adicionar `"type": "subscription"` | | Valor incorreto | Enviou em reais | Converter para centavos | | Pix rejeitado | Método não suportado | Remover `pix` de `accepted_payment_methods` | | Credencial inválida | Chave errada | Verificar `sk_...` no dashboard | ## Checklist de produção - [ ] Trocar `PAGARME_BASE_URL` de teste para produção - [ ] Trocar chave de teste pela chave de produção - [ ] Verificar `interval` e `billing_type` do plano com o modelo de negócio - [ ] Configurar `trial_period_days` se oferecer período gratuito - [ ] Configurar endpoint de webhook com HTTPS - [ ] Validar assinatura do webhook - [ ] Testar fluxo completo de cancelamento de assinatura - [ ] Armazenar `plan.id` e `payment_link.id` no banco de dados ````