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
Updated 2 days ago
