agentleFS
BappozBappoz/My-Claude-Skills/skills/engineering/payment-systems/SKILL.md

payment-systems

Skill1 starsChanged 4 months agoMITView on GitHub

Integração de sistemas de pagamento production-grade: Stripe, PIX, cartões, assinaturas, webhooks, idempotência, PCI-DSS, 3DS/SCA, reconciliação e ledger de partidas dobradas. Use quando o usuário mencionar: "pagamento", "checkout", "Stripe", "PIX", "cobrança", "assinatura", "billing", "webhook de pagamento", "PCI", "reembolso", "split de pagamento", "gateway", "cartão de crédito".

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

Files
SKILL.md

Payment Systems

Você atua como engenheiro de pagamentos. Objetivo: integrações corretas antes de bonitas — dinheiro não perdoa. Idempotência, consistência e trilha de auditoria vêm antes de qualquer feature.

Leis inegociáveis

  1. Nunca confie no cliente para o valor — preço e moeda são definidos/validados no servidor. O front só envia o id do que comprar.
  2. Idempotência em toda operação de escrita — toda criação de cobrança/refund manda Idempotency-Key. Retry sem duplicar dinheiro.
  3. Webhook é a fonte da verdade, não o redirect — o pagamento se confirma pelo evento assinado (payment_intent.succeeded), nunca pelo "voltou pra /success".
  4. Verifique a assinatura do webhook — valide o header de assinatura; rejeite o resto. Endpoint de webhook é alvo.
  5. Nunca toque em PAN — não armazene número de cartão. Use tokenização do provedor (Stripe Elements/Checkout) → PCI-DSS SAQ-A.
  6. Ledger imutável — registre cada movimento como append-only (partidas dobradas). Saldo é derivado, nunca editado no lugar.

Fluxo Stripe (cartão, server-driven)

1. Cliente escolhe item → front pede ao SEU backend
2. Backend cria PaymentIntent (valor/moeda no servidor) com Idempotency-Key
   → retorna client_secret
3. Front confirma com Stripe.js (Payment Element) → 3DS/SCA se exigido
4. Stripe processa → dispara webhook payment_intent.succeeded
5. Backend (webhook, assinatura verificada) marca pedido pago + escreve no ledger
6. Reconcilia depois com o balanço/payout do Stripe
// Backend: criar intent idempotente, valor no servidor
const intent = await stripe.paymentIntents.create(
  { amount: priceFromDB.amountCents, currency: 'brl', metadata: { orderId } },
  { idempotencyKey: `order_${orderId}_v1` }
);

// Webhook: verificar assinatura ANTES de confiar
const event = stripe.webhooks.constructEvent(rawBody, sig, endpointSecret);
if (event.type === 'payment_intent.succeeded') { /* marcar pago (idempotente por event.id) */ }

PIX (Brasil)

  • Assíncrono: gere cobrança (QR estático/dinâmico via PSP ou API do banco/Pix) → cliente paga → confirmação chega por webhook do PSP. Nunca marque pago no "gerei o QR".
  • Idempotência por txid — cada cobrança tem txid único; use-o como chave de idempotência e de reconciliação.
  • Expiração — cobranças PIX expiram; trate o estado expirada.
  • Devolução via API de devolução do PSP (não "estorno de cartão").

Assinaturas / billing

  • Estados: trialing → active → past_due → canceled/unpaid. Modele a máquina de estados explicitamente.
  • Dunning — retries automáticos de fatura falha + comunicação; não corte acesso no 1º erro.
  • Proration ao trocar de plano no meio do ciclo.
  • Fonte da verdade do acesso = webhooks de invoice.* / customer.subscription.*, não o clique de "assinar".

Segurança e conformidade

TemaRegra
PCI-DSSTokenize no cliente (Elements/Checkout) → escopo SAQ-A. Nunca logue PAN/CVV.
IdempotênciaChave por operação lógica; persista a resposta associada à chave.
WebhooksVerifique assinatura; responda 2xx rápido; processe async; trate reentrega (dedupe por event id).
SCA/3DSSuporte a autenticação forte (obrigatória na UE; boa prática sempre).
SegredosChaves secretas só no servidor; use chaves restritas; rotacione.
ValoresInteiros em centavos; nunca float para dinheiro.

Reconciliação

  • Concilie diariamente seus registros vs. os do provedor (payouts/balance transactions).
  • Toda linha do seu ledger casa com um evento do provedor. Divergência = alarme.
  • Guarde provider_event_id em cada movimento para auditoria.

Recursos externos

RecursoO que pegar
Stripe DocsReferência de PaymentIntents, Checkout, Billing, Connect.
Stripe — Idempotent requestsComo e por que usar Idempotency-Key.
Stripe — WebhooksVerificação de assinatura, boas práticas, reentrega.
Stripe — SCA / 3D SecureAutenticação forte.
Banco Central — Pix / APIRegras do arranjo Pix (txid, devolução, QR).
PCI DSS Quick ReferenceEscopo de conformidade e SAQ.
Martin Kleppmann — DDIA (consistência)Consistência/idempotência em sistemas distribuídos.

Do / Don't

DoDon't
Valor definido no servidorConfiar no amount do front
Confirmar por webhook assinadoConfiar no redirect de sucesso
Idempotency-Key em toda escritaRetry que duplica cobrança
Tokenizar cartão (Elements)Tocar/armazenar PAN
Centavos em inteiroFloat para dinheiro
Ledger append-onlyEditar saldo no lugar

Checklist

  • Preço/moeda validados no servidor
  • Idempotency-Key em criação de cobrança/refund
  • Webhook com assinatura verificada + dedupe por event id
  • Confirmação de pagamento vem do webhook, não do redirect
  • Cartão tokenizado no cliente (sem PAN no backend)
  • PIX/assinatura tratam estados assíncronos e expiração
  • Ledger append-only + reconciliação diária com o provedor
  • Dinheiro em inteiros (centavos), segredos só no servidor

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.