让 Stripe 订阅与后端服务配合使用可能会很棘手,并且常常会导致开发人员所说的可怕的“大脑分裂”——同步管理 Stripe 的逻辑和您自己的后端数据。
在 Vratix,我们在构建开源 Stripe 订阅 API 模块时正面解决了这个问题。以下是我们如何在 Node.js 中处理 Stripe 订阅计费,以保持事情简单、可扩展且对开发人员友好。
关键是将尽可能多的逻辑转移到Stripe,同时保持数据库最小化。我们只存储:
这样,我们就可以避免:
通过这种方法,您仍然拥有功能齐全的订阅计费系统,同时依赖 Stripe 作为唯一的事实来源。
在本指南结束时,您将拥有一个基于订阅的应用程序,支持:
我们首先设计一个干净、最小的数据库表:
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) );
要点:
我们使用工厂函数来保持业务逻辑模块化和可测试。这是我们的 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 }, }; }); }
主要亮点:
我们的 createCheckout 函数设置订阅结账会话:
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! };
我们已将所有内容打包到一个现成的开源模块中。 不到 30 秒,您可以设置:
运行这个:
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) );
查看我们的 Stripe 订阅模块文档以了解更多详细信息。
完整代码可在我们的 GitHub 存储库中获取。
在此处观看演示视频,了解如何使用工作 UI 完成所有这些操作。
我很想听听您的想法 - 这是否会让构建订阅 API 变得更容易?让我们知道您接下来想看到哪些功能!
以上是Node.js 中的 Stripe 订阅集成 [终极指南]的详细内容。更多信息请关注PHP中文网其他相关文章!