Maison > interface Web > js tutoriel > Intégration de l'abonnement Stripe dans Node.js [Guide ultime]

Intégration de l'abonnement Stripe dans Node.js [Guide ultime]

Barbara Streisand
Libérer: 2024-11-22 15:57:37
original
685 Les gens l'ont consulté

Stripe Subscription Integration in Node.js [ltimate Guide]

Faire fonctionner les abonnements Stripe avec les services backend peut être délicat et conduit souvent à ce que les développeurs appellent la redoutable « division cérébrale » : gérer à la fois la logique de Stripe et vos propres données backend en synchronisation.

Chez Vratix, nous avons abordé ce problème de front lors de la création de notre module API d'abonnement Open Source Stripe. Voici comment nous abordons la facturation des abonnements Stripe dans Node.js pour que les choses restent simples, évolutives et conviviales pour les développeurs.

Principe fondamental : laissez Stripe être la source de la vérité

La clé est de déplacer autant de logique vers Stripe tout en gardant votre base de données minimale. Nous stockons uniquement :

  • Identifiant client
  • ID d'abonnement
  • Planifier

De cette façon, on évite :

  • Logique backend trop compliquée
  • Implémentations de webhooks sujettes aux erreurs pour la synchronisation des modifications du tableau de bord
  • Redondance des données

Avec cette approche, vous disposez toujours d'un système de facturation d'abonnement entièrement fonctionnel tout en vous appuyant sur Stripe comme source unique de vérité.

Caractéristiques de notre mise en œuvre

À la fin de ce guide, vous disposerez d'une application par abonnement prenant en charge :

  • Forfaits d'abonnement utilisateur
  • Séances de paiement
  • Ventes incitatives d'abonnements
  • Liste des forfaits disponibles

Pile technologique

  • PostgreSQL
  • Node.js Express.js
  • TypeScript

Étape 1 : Conception de la base de données

Nous commençons par concevoir une table de base de données propre et minimale :

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)  
);
Copier après la connexion
Copier après la connexion

Points clés :

  • user_id : fait référence à votre table utilisateur interne
  • plan : suit le plan d'abonnement
  • souscription_id : L'identifiant d'abonnement Stripe
  • is_owner : signale le titulaire principal de l'abonnement

Étape 2 : contrôleurs

Nous utilisons une fonction d'usine pour garder la logique métier modulaire et testable. Voici un extrait de notre contrôleur d'abonnement Stripe :

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 },  
    };  
  });  
}  
Copier après la connexion

Points forts :

  • Clés d'abonnement personnalisées : dérivées du nom du produit ou de lookup_key pour des vérifications de plan propres (user.plan === 'pro_plan').
  • Approche axée sur Stripe : nous récupérons les données d'abonnement directement à partir de Stripe, évitant ainsi la « division du cerveau ».

Étape 3 : Paiement Stripe simplifié

Notre fonction createCheckout met en place une session de paiement d'abonnement :

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! };  
Copier après la connexion

Vous voulez éviter tout cela ?

Nous avons tout regroupé dans un module Open Source prêt à l’emploi. En moins de 30 secondes, vous pouvez mettre en place :

  • Intégration des rayures
  • Authentification
  • Configuration de la base de données
  • Routes prédéfinies et requêtes SQL

Exécutez ceci :

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)  
);
Copier après la connexion
Copier après la connexion

Consultez la documentation du module d'abonnement Stripe pour plus de détails.

Le code complet est disponible sur notre dépôt GitHub.

Voir une vidéo de démonstration expliquant comment faire tout cela avec une interface utilisateur fonctionnelle ici.

J'aimerais connaître votre avis : cela facilite-t-il la création d'API d'abonnement ? Faites-nous savoir quelles fonctionnalités vous aimeriez voir ensuite !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal