Heim >Web-Frontend >js-Tutorial >Stripe-Abonnement-Integration in Node.js [ltimate Guide]

Stripe-Abonnement-Integration in Node.js [ltimate Guide]

Barbara Streisand
Barbara StreisandOriginal
2024-11-22 15:57:37702Durchsuche

Stripe Subscription Integration in Node.js [ltimate Guide]

Stripe-Abonnements mit Back-End-Diensten zum Laufen zu bringen, kann schwierig sein und führt oft zu dem, was Entwickler als die gefürchtete „Gehirnspaltung“ bezeichnen – die synchrone Verwaltung der Stripe-Logik und Ihrer eigenen Backend-Daten.

Bei Vratix haben wir dieses Problem direkt angegangen, als wir unser Open-Source-API-Modul für Stripe-Abonnements entwickelt haben. So gehen wir an die Abrechnung von Stripe-Abonnements in Node.js heran, um die Dinge einfach, skalierbar und entwicklerfreundlich zu halten.

Kernprinzip: Lassen Sie Stripe die Quelle der Wahrheit sein

Der Schlüssel besteht darin, so viel von der Logik auf Stripe zu verlagern und gleichzeitig Ihre Datenbank minimal zu halten. Wir speichern nur:

  • Kundennummer
  • Abonnement-ID
  • Planen

Auf diese Weise vermeiden wir:

  • Überkomplizierte Backend-Logik
  • Fehleranfällige Webhook-Implementierungen zum Synchronisieren von Dashboard-Änderungen
  • Datenredundanz

Mit diesem Ansatz verfügen Sie immer noch über ein voll funktionsfähiges Abonnement-Abrechnungssystem und können sich gleichzeitig auf Stripe als Single Source of Truth verlassen.

Merkmale unserer Implementierung

Am Ende dieses Leitfadens verfügen Sie über eine abonnementbasierte App, die Folgendes unterstützt:

  • Benutzerabonnements
  • Checkout-Sitzungen
  • Abonnement-Upsells
  • Verfügbare Planliste

Tech-Stack

  • PostgreSQL
  • Node.js Express.js
  • TypeScript

Schritt 1: Datenbankdesign

Wir beginnen mit dem Entwurf einer sauberen, minimalen Datenbanktabelle:

CREATE TABLE user_subscriptions (  
    "id" SERIAL PRIMARY KEY,  
    "plan" VARCHAR NOT NULL,  
    "user_id" INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,  
    "customer_id" VARCHAR,  
    "subscription_id" VARCHAR NOT NULL,  
    "is_owner" BOOLEAN NOT NULL DEFAULT TRUE,  
    "created_at" TIMESTAMP NOT NULL DEFAULT NOW(),  
    UNIQUE (user_id, subscription_id)  
);

Wichtige Punkte:

  • user_id: Referenziert Ihre interne Benutzertabelle
  • Plan: Verfolgt den Abonnementplan
  • subscription_id: Die Stripe-Abonnement-ID
  • is_owner: Markiert den primären Abonnementinhaber

Schritt 2: Controller

Wir verwenden eine Factory-Funktion, um die Geschäftslogik modular und testbar zu halten. Hier ist ein Ausschnitt aus unserem Stripe-Abonnement-Controller:

async getSubscriptions() {  
  const stripePrices = await stripe.prices.list({  
    active: true,  
    type: "recurring",  
    expand: ["data.product"],  
  });  

  return stripePrices.data.map((price) => {  
    const product = price.product as Stripe.Product;  
    return {  
      plan: price.lookup_key || product.name.toLowerCase().replaceAll(" ", "_"),  
      name: product.name,  
      priceId: price.id,  
      interval: price.recurring!.interval,  
      price: { currency: price.currency, amount: price.unit_amount },  
    };  
  });  
}  

Wichtige Highlights:

  • Benutzerdefinierte Abonnementschlüssel: Abgeleitet vom Produktnamen oder Lookup_Key für saubere Planprüfungen (user.plan === 'pro_plan').
  • Stripe-First-Ansatz: Wir rufen Abonnementdaten direkt von Stripe ab und vermeiden so den „Brain Split“.

Schritt 3: Optimierter Stripe-Checkout

Unsere Funktion „createCheckout“ richtet eine Abonnement-Checkout-Sitzung ein:

const checkout = await stripe.checkout.sessions.create({  
  line_items: [  
    {  
      price: priceId,  
      adjustable_quantity: { enabled: true },  
      quantity: seats || 1,  
    },  
  ],  
  mode: "subscription",  
  subscription_data: { metadata: { userId } },  
  success_url: CHECKOUT_SUCCESS_URL,  
  cancel_url: CHECKOUT_CANCEL_URL,  
});  

return { url: checkout.url! };  

Möchten Sie das alles überspringen?

Wir haben alles in ein gebrauchsfertiges Open-Source-Modul gepackt. In weniger als 30 Sekunden können Sie Folgendes einrichten:

  • Stripe-Integration
  • Authentifizierung
  • Datenbankkonfiguration
  • Vorgefertigte Routen und SQL-Abfragen

Führen Sie Folgendes aus:

CREATE TABLE user_subscriptions (  
    "id" SERIAL PRIMARY KEY,  
    "plan" VARCHAR NOT NULL,  
    "user_id" INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,  
    "customer_id" VARCHAR,  
    "subscription_id" VARCHAR NOT NULL,  
    "is_owner" BOOLEAN NOT NULL DEFAULT TRUE,  
    "created_at" TIMESTAMP NOT NULL DEFAULT NOW(),  
    UNIQUE (user_id, subscription_id)  
);

Weitere Informationen finden Sie in unseren Dokumenten zum Stripe-Abonnementmodul.

Der vollständige Code ist in unserem GitHub-Repo verfügbar.

Sehen Sie sich hier ein Demovideo an, wie Sie das alles mit einer funktionierenden Benutzeroberfläche machen können.

Ich würde gerne Ihre Meinung hören – erleichtert dies die Erstellung von Abonnement-APIs? Teilen Sie uns mit, welche Funktionen Sie als Nächstes sehen möchten!

Das obige ist der detaillierte Inhalt vonStripe-Abonnement-Integration in Node.js [ltimate Guide]. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn