# SlimPay — integrar Pagamentos via API PIX > Docs humanas: https://slimpay.com.br/docs ## O que fazer 1. Criar cobrança no servidor 2. Mostrar o PIX (QR + copia e cola) pro cliente 3. Receber o webhook `charge.paid` e liberar o pedido Pronto. Não precisa de mais nada para receber PIX. ## Regras (não quebre) - Valores em **centavos inteiros**: R$ 149,90 → `14990` - Header `Authorization: Bearer sp_SUA_CHAVE` (chave só no servidor) - Em todo POST: header `Idempotency-Key` (use o id do pedido) - Não faça polling de status — use webhook - Não invente campos (`fee`, `provider`, `expires_in`, etc.) ## 1. Criar cobrança `POST https://app.slimpay.com.br/api/v1/charges` ```bash curl https://app.slimpay.com.br/api/v1/charges \ -H "Authorization: Bearer sp_SUA_CHAVE" \ -H "Idempotency-Key: pedido-1042" \ -H "Content-Type: application/json" \ -d '{ "amount": 14990, "description": "Pedido #1042", "reference_id": "1042", "customer": { "name": "Maria Silva", "tax_id": "12345678909" } }' ``` Resposta (use estes campos): - `id` — `chg_...` - `brcode` — PIX copia e cola - `qrcode_url` — URL pública da imagem do QR (``) - `expires_at` — validade ## 2. Mostrar o PIX - QR: `` - Copia e cola: texto do `brcode` - Mostre os dois ## 3. Webhook (pagamento confirmado) No painel SlimPay → Webhooks: cadastre sua URL HTTPS e guarde o segredo `whsec_...`. A SlimPay envia `POST` com: ```json { "id": "evt_...", "type": "charge.paid", "data": { "id": "chg_...", "status": "paid", "amount": 14990, "reference_id": "1042" } } ``` Header: `SlimPay-Signature: t=,v1=` Verifique assim (corpo **bruto**, sem re-serializar JSON): ```ts import crypto from "node:crypto"; function verify(rawBody: string, header: string, secret: string) { const map = new Map(header.split(",").map((p) => { const i = p.indexOf("="); return [p.slice(0, i), p.slice(i + 1)]; })); const t = map.get("t"); const v1 = map.get("v1"); if (!t || !v1) return false; if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex"); const a = Buffer.from(expected, "hex"); const b = Buffer.from(v1, "hex"); return a.length === b.length && crypto.timingSafeEqual(a, b); } ``` No handler: se `type === "charge.paid"` e assinatura ok → liberar o pedido. Ignore `event.id` repetido. Responda `200` rápido. ## Env ``` SLIMPAY_API_KEY=sp_... SLIMPAY_WEBHOOK_SECRET=whsec_... ``` ## Extra (só se pedir) - Consultar: `GET https://app.slimpay.com.br/api/v1/charges/{id}` - Cancelar (ainda não paga): `DELETE https://app.slimpay.com.br/api/v1/charges/{id}` - Docs: https://slimpay.com.br/docs