>  기사  >  웹 프론트엔드  >  Node.js의 스트라이프 구독 통합 [최종 가이드]

Node.js의 스트라이프 구독 통합 [최종 가이드]

Barbara Streisand
Barbara Streisand원래의
2024-11-22 15:57:37639검색

Stripe Subscription Integration in Node.js [ltimate Guide]

백엔드 서비스와 함께 작동하는 Stripe 구독을 얻는 것은 까다로울 수 있으며 종종 개발자가 두려운 "두뇌 분할"이라고 부르는 상황으로 이어집니다. 즉, Stripe의 로직과 자체 백엔드 데이터를 동기화하여 관리하는 것입니다.

Vratix에서는 오픈 소스 Stripe Subscriptions API 모듈을 구축하면서 이 문제를 정면으로 해결했습니다. 간단하고 확장 가능하며 개발자 친화적인 상태를 유지하기 위해 Node.js에서 Stripe 구독 청구에 접근하는 방법은 다음과 같습니다.

핵심 원칙: Stripe을 진실의 원천으로 삼으세요

핵심은 데이터베이스를 최소화하면서 논리를 Stripe로 최대한 전환하는 것입니다. 다음 항목만 저장합니다:

  • 고객ID
  • 구독ID
  • 계획

이렇게 하면 다음을 피할 수 있습니다.

  • 과도하게 복잡한 백엔드 로직
  • 대시보드 변경 사항 동기화를 위한 오류가 발생하기 쉬운 웹훅 구현
  • 데이터 이중화

이 접근 방식을 사용하면 단일 정보 소스로서 Stripe에 의존하면서 여전히 모든 기능을 갖춘 구독 청구 시스템을 사용할 수 있습니다.

구현의 특징

이 가이드가 끝나면 다음을 지원하는 구독 기반 앱을 갖게 됩니다.

  • 사용자 구독 계획
  • 결제 세션
  • 구독 상향 판매
  • 사용 가능한 계획 목록

기술 스택

  • 포스트그레SQL
  • Node.js Express.js
  • 타입스크립트

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: 구독 계획을 추적합니다
  • subscribe_id: Stripe 구독 ID
  • is_owner: 기본 구독 소유자를 표시합니다

2단계: 컨트롤러

우리는 비즈니스 로직을 모듈화하고 테스트 가능하게 유지하기 위해 팩토리 기능을 사용합니다. 다음은 Stripe Subscription Controller의 스니펫입니다.

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단계: 간소화된 스트라이프 체크아웃

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의 스트라이프 구독 통합 [최종 가이드]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.