Carregando
Integração completa de PIX e Cartão de Crédito com Woovi, Stripe e Pagar.me usando Padrão Adapter
Por que isso é importante
Como integrar PIX e cartão em Node.js/TypeScript sem acoplar um único PSP: crie uma interface PaymentGateway (Adapter), implemente Woovi/OpenPix, Stripe e Pagar.me, e trate webhook com HMAC + idempotência. Trocar PSP vira checklist — não rewrite do SaaS.
Leitura relacionada: Curso Node.js · Webhook Stripe · Abacate Pay · monetizar apps com IA.
export abstract class PaymentGateway {
abstract createCharge(data: any): Promise<any>;
abstract deleteCharge(id: string): Promise<any>;
abstract getCharge(id: string): Promise<any>;
}Use o padrão Adapter com TypeScript para uma interface unificada de PIX e cartão sobre Woovi, Stripe e Pagar.me. Sem Adapter, cada PSP vaza SDK e status codes no domínio do app — com Adapter, o SaaS fala só com createCharge/getCharge/webhooks normalizados.
TypeScript garante tipagem estática e segurança do código em todas as implementações de gateway de pagamento, reduzindo erros em produção.
Interface comum permite trocar gateways de pagamento facilmente sem alterar o código principal da API Node.js.
Suporte nativo para PIX, cartão de crédito e assinaturas em todos os gateways como Woovi, Stripe e Pagar.me.
Organização modular com padrão Adapter para facilitar a manutenção e escalabilidade do código de gateway de pagamento
src/
├── contracts/
│ └── PaymentGateway.ts
├── adapters/
│ ├── WooviAdapter.ts
│ ├── StripeAdapter.ts
│ ├── PagarmeAdapter.ts
│ └── index.ts
└── config/
└── env.tsexport abstract class PaymentGateway {
abstract createCharge(data: any): Promise<any>;
abstract deleteCharge(id: string): Promise<any>;
abstract getCharge(id: string): Promise<any>;
abstract createSubscription(data: any): Promise<any>;
abstract getSubscription(id: string): Promise<any>;
abstract createCustomer(data: any): Promise<any>;
abstract getCustomer(id: string): Promise<any>;
abstract getChargeByCustomer(data: any): Promise<any>;
}Implemente múltiplos gateways de pagamento com uma única interface
Veja como é simples implementar um gateway de pagamento usando o padrão Adapter
async createCharge(data: any): Promise<any> {
const { correlationID, value, comment } = data;
try {
const { data } = await axios.post(
https://api.openpix.com.br/api/v1/charge?return_existing=true,
{ correlationID, value, comment },
{
headers: {
Authorization: this.apiKey,
content-type: application/json
},
}
);
return data;
} catch (e: any) {
return e?.response?.data;
}
}Bootcamp completo para desenvolvedores pleno/sênior que desejam dominar Node.js, TypeScript e padrões avançados de projeto.
Design Patterns, TDD
Sem restrições
Sistema completo
Personagens brasileiros
Quer ir além? Leia como criar API REST com Node.js, veja como criar um SaaS com IA, explore modelos de receita para apps, o curso de pagamentos crypto e os cursos da CrazyStack.
Adapter unifica PIX e cartão; o que segura produção é o webhook. Nunca confie só no front — o PSP reenvia o mesmo evento.
Confira a doc atual do PSP para o header exato. O padrão mental é o mesmo: verify → idempotent upsert → side effects uma vez.
Com PaymentGateway estável, trocar PSP é checklist — não rewrite:
Modele estados explícitos: criado → aguardando PIX → pago | expirado | estornado | chargeback. O usuário e o backend precisam ver a mesma máquina de estados.
| Falha | O que fazer |
|---|---|
| PIX expirado | UI: “gere novo QR”; backend não libera acesso; ignore webhook paid antigo se o charge foi rotacionado. |
| Cobrança duplicada | Idempotency key evita liberar duas assinaturas; se o PSP cobrou 2×, abra estorno — não “ignore”. |
| Pago no PSP, falha no DB | Job de reconciliação consulta a API e fecha o gap. |
| Chargeback | Suspenda o benefício; registre disputa; não apague histórico fiscal. |
Revisão em agosto de 2026. Este tutorial é padrão de engenharia (Adapter + webhooks) — não aconselhamento financeiro nem taxa contratual de PSP. Taxas %, liquidação PIX e chargeback mudam por contrato; valide no sandbox e na doc oficial antes de produção.
Camada com Adapter/interface comum sobre PSPs (PIX/cartão) — troca Woovi, Stripe ou Pagar.me sem reescrever o app.
Com webhooks assinados e idempotência no servidor. Nunca marque pedido como pago só pelo front.
Cada PSP tem SDK e payload diferentes. Um contrato único (createCharge, webhook, etc.) isola o domínio do vendor lock-in.
Um PSP, um webhook com verificação de assinatura e estados de pedido claros (pendente/pago/expirado/falha).