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.
La clé est de déplacer autant de logique vers Stripe tout en gardant votre base de données minimale. Nous stockons uniquement :
De cette façon, on évite :
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é.
À la fin de ce guide, vous disposerez d'une application par abonnement prenant en charge :
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 :
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 :
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! };
Nous avons tout regroupé dans un module Open Source prêt à l’emploi. En moins de 30 secondes, vous pouvez mettre en place :
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!