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
Barbara Streisandoriginal
2024-11-22 15:57:37702parcourir

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)  
);

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 },  
    };  
  });  
}  

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! };  

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)  
);

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!

Déclaration:
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