Stripe, Twilio & Padrões de SDK
Stripe e Twilio são os SDKs pagos mais comuns em APIs B2B Node. Esta página cobre timeouts, idempotência, modos de teste e pareamento de webhooks.
Busque em todas as páginas da documentação
Stripe e Twilio são os SDKs pagos mais comuns em APIs B2B Node. Esta página cobre timeouts, idempotência, modos de teste e pareamento de webhooks.
Cartão de receita de referência rápida - pronto para copiar e colar.
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: "2024-11-20.acacia",
timeout: 10_000,
maxNetworkRetries: 0,
});
const intent = await stripe.paymentIntents.create(
{ amount: 2500, currency: "usd", automatic_payment_methods: { enabled: true } },
{ idempotencyKey: req.header("Idempotency-Key") ?? undefined }
);Quando usar isso:
// src/integrations/payments-service.ts
import Stripe from "stripe";
import twilio from "twilio";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: "2024-11-20.acacia",
timeout: 10_000,
maxNetworkRetries: 0,
});
const twilioClient = twilio(process.env.TWILIO_ACCOUNT_SID!, process.env.TWILIO_AUTH_TOKEN!);
export async function createPaymentIntent(
amountCents: number,
currency: string,
idempotencyKey: string
) {
return stripe.paymentIntents.create(
{ amount: amountCents, currency, automatic_payment_methods: { enabled: true } },
{ idempotencyKey }
);
}
export async function sendOtpSms(to: string, code: string) {
return twilioClient.messages.create({
to,
from: process.env.TWILIO_FROM_NUMBER!,
body: `Seu código é ${code}`,
statusCallback: `${process.env.PUBLIC_API_URL}/webhooks/twilio/sms`,
});
}
// Rota Express
app.post("/payments/intent", async (req, res, next) => {
try {
const key = req.header("Idempotency-Key");
if (!key) return res.status(400).json({ error: "missing_idempotency_key" });
const pi = await createPaymentIntent(req.body.amountCents, "usd", key);
res.status(201).json({ clientSecret: pi.client_secret, id: pi.id });
} catch (err) {
next(mapStripeError(err));
}
});O que isso demonstra:
| Operação | Padrão |
|---|---|
| Cobrança única | PaymentIntent |
| Cobrança SaaS | Customer + Subscription + Prices |
| Marketplace Connect | cabeçalho stripeAccount nas requisições |
| Reembolsos | Idempotente na criação de refund com chave |
// Recuperar com expand - usar com moderação
const sub = await stripe.subscriptions.retrieve(id, { expand: ["customer", "latest_invoice"] });payment_intent.succeeded, invoice.paid, customer.subscription.updatedevent.id - veja Verificação de Webhook// Verificar chamador em chamadas recebidas - webhook TwiML
app.post("/voice/inbound", express.urlencoded({ extended: false }), (req, res) => {
const twiml = new twilio.twiml.VoiceResponse();
twiml.say("Hello");
res.type("text/xml").send(twiml.toString());
});# Cartão de teste Stripe 4242 4242 4242 4242
STRIPE_SECRET_KEY=sk_test_...
# Números mágicos do Twilio para teste de SMSidempotencyKey ao habilitar maxNetworkRetries do SDKclient_secret - vazamento de pagamento nos logs. Correção: registrar apenas o ID do pagamento.apiVersion no código.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Paddle/Lemon Squeezy | Comerciante do registro | Marketplace Connect personalizado |
| MessageBird/Vonage | Preços/recursos do Twilio | Já padronizado no Twilio |
| Adyen/Braintree | Mix de pagamentos corporativos | Equipe conhece Stripe |
| Resend + OTP por e-mail | Apenas códigos por e-mail | Requeribilidade de entrega de SMS |
Checkout hospedado com escopo PCI mais rápido. Elementos UI personalizada - ainda use PaymentIntent no lado do servidor.
A API Verify gerencia o ciclo de vida do OTP - menos código SMS personalizado do que a API de Mensagens bruta.
API Account Links para contas conectadas Express/Standard - manipuladores de webhook separados.
PaymentIntent capture_method: manual para autorizar e depois capturar um valor menor posteriormente.
Não assuma a ordem. Use uma máquina de estados idempotente no status do pagamento.
Stripe lida com o fluxo 3DS no lado do cliente; ouça eventos requires_action.
Enfileire envios de SMS; backoff exponencial em 429; serviço de mensagens ajuda no roteamento.
Bom padrão - API enfileira, worker chama Stripe para fulfillment após webhook.
Stripe fornece tipos; tipos Twilio incluídos - fixe versões para consistência.
Módulo comunitário @nestjs/stripe ou um serviço wrapper fino - mesmas regras de idempotência.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026