Node.js での Stripe サブスクリプションの統合 [最終ガイド]

Barbara Streisand
リリース: 2024-11-22 15:57:37
オリジナル
634 人が閲覧しました

Stripe Subscription Integration in Node.js [ltimate Guide]

Stripe サブスクリプションをバックエンド サービスと連携させるのは難しい場合があり、多くの場合、Stripe のロジックと独自のバックエンド データの両方を同期して管理する、開発者が言う恐ろしい「頭脳の分裂」につながります。

Vratix では、オープンソースの Stripe サブスクリプション API モジュールを構築する際に、この問題に正面から取り組んできました。ここでは、シンプルでスケーラブルで開発者にとって使いやすいものにするために、Node.js で Stripe サブスクリプションの請求にどのようにアプローチするかを説明します。

基本原則: Stripe を真実のソースにしましょう

重要なのは、データベースを最小限に抑えながら、可能な限り多くのロジックを Stripe に移行することです。私たちが保管するのは以下のみです:

  • 顧客ID
  • サブスクリプション ID
  • 計画

このようにして、次のことを回避します。

  • 複雑すぎるバックエンド ロジック
  • ダッシュボードの変更を同期するためのエラーが発生しやすい Webhook 実装
  • データの冗長性

このアプローチでは、Stripeを唯一の信頼できる情報源として利用しながら、完全に機能するサブスクリプション請求システムを維持できます。

導入の特徴

このガイドを終えると、以下をサポートするサブスクリプションベースのアプリが完成します。

  • ユーザーサブスクリプションプラン
  • チェックアウトセッション
  • サブスクリプションのアップセル
  • ご利用可能なプラン一覧

技術スタック

  • PostgreSQL
  • Node.js Express.js
  • TypeScript

ステップ 1: データベースの設計

クリーンで最小限のデータベース テーブルを設計することから始めます。

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)  
);
ログイン後にコピー
ログイン後にコピー

重要なポイント:

  • user_id: 内部ユーザーテーブルを参照します
  • plan: サブスクリプション プランを追跡します
  • subscription_id: Stripe サブスクリプション ID
  • is_owner: プライマリ サブスクリプション所有者にフラグを立てます

ステップ 2: コントローラー

ビジネス ロジックをモジュール化してテスト可能に保つために、ファクトリ関数を使用します。以下は、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 },  
    };  
  });  
}  
ログイン後にコピー

主なハイライト:

  • カスタム サブスクリプション キー: 製品名またはクリーン プラン チェック用の lookup_key から派生します (user.plan === 'pro_plan')。
  • ストライプファーストアプローチ: サブスクリプションデータを Stripe から直接取得し、「頭脳分割」を回避します。

ステップ 3: 合理化された Stripe チェックアウト

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 秒以内で、以下をセットアップできます。

  • ストライプ統合
  • 認証
  • データベース構成
  • 事前構築されたルートと SQL クエリ

これを実行します:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート