안녕하세요, 이 플러그인에 다음과 같은 변경 사항을 적용했으며, Discourse 팀이 PR을 받아줄 의향이 있는지 궁금합니다.
다른 분들도 광범위한 테스트를 해주시면 좋겠습니다. 저는 현재 저에게 중요한 시나리오를 중심으로 플로우를 테스트하고 있습니다.
기존 플러그인은 훌륭한 기반이지만 주로 Stripe를 통한 정기 구독에 초점을 맞추고 있습니다. 다음과 같은 변경 사항을 적용했습니다:
새로운 기능 및 개선 사항 요약
1. 멀티 프로바이더 결제 시스템 (Razorpay 지원) 플러그인은 더 이상 Stripe에 하드코딩되지 않았습니다. 이제 여러 결제 게이트웨이를 허용하는 프로바이더 기반 아키텍처를 사용합니다.
Razorpay 통합: Razorpay가 두 번째 결제 프로바이더로 완전히 통합되었습니다. 이는 Razorpay가 선호되는 게이트웨이인 인도와 같은 시장의 커뮤니티에 매우 중요합니다.
보안 웹훅: Razorpay 통합은 견고하며, 결제 확인을 위해 서버 간에 보안 웹훅 핸들러를 포함하고 있습니다. 이를 통해 사용자가 결제 후 브라우저를 닫더라도 구독이 누락되지 않도록 보장합니다.
2. 일시적(기간 한정) 구독 표준 정기 구독을 넘어선 새로운 유연한 상품 유형을 도입했습니다.
만료되는 접근 권한: 관리자는 이제 고정된 기간(예: 7일 이벤트 패스, 30일 체험판, 또는 90일 패키지) 동안 그룹 접근 권한을 부여하는 일시적 결제 플랜을 생성할 수 있습니다.
자동 만료 처리: 매일 자동으로 실행되는 백그라운드 작업이 만료된 구독을 확인하고 관련 그룹에서 사용자를 제거하여 접근 권한 관리가 완전히 자동화되도록 합니다.
3. 가격 페이지 전면 개편 사용자 대상 기본 구독 페이지가 전환율 및 사용자 경험 향상을 위해 완전히 재구성되었습니다.
모던한 카드 기반 UI: 기존 상품 목록은 가독성과 비교가 용이한 깔끔하고 반응형인 카드 기반 레이아웃으로 대체되었습니다.
테마 인식: 새로운 디자인은 Discourse의 테마 변수를 사용하며 라이트 모드와 다크 모드 모두와 완벽하게 호환됩니다.
단일 페이지 체크아웃: 이제 전체 체크아웃 프로세스가 가격 페이지에서 이루어집니다. "구독"을 클릭하면 페이지에 바로 결제 양식이 표시되어 불필요한 단계를 제거하고 사용자 마찰을 줄입니다.
4. 고급 업셀링 및 가치 표시 로직 새로운 가격 카드는 강력한 업셀링 도구로 설계되었습니다.
실질 월별 비용: UI는 모든 플랜 유형(3개월 또는 연 단위 일시 결제 플랜 포함)에 대해 실질적인 "월별 비용"을 자동으로 계산하여 표시하므로, 사용자가 다른 옵션의 가치를 쉽게 비교할 수 있습니다.
명시적인 절감액 표시: 장기 플랜에는 “₹X 절약” 배지가 자동으로 표시되어, 기준 플랜보다 높은 가치의 플랜을 선택할 때의 이점을 명확하게 전달합니다.
5. 통합 관리자 및 사용자 대시보드 관리자와 사용자의 청구 페이지가 모두 더 단순하고 강력하도록 리팩토링되었습니다.
단일 통합 뷰: 서로 다른 결제 유형을 위한 별도의 목록 대신, 이제 모든 프로바이더(Stripe, Razorpay, 수동)의 모든 구독을 보여주는 단일 테이블이 있습니다.
명확한 정보: 이러한 뷰는 모든 거래에 대해 프로바이더, 상태, 만료/갱신 날짜, 금액을 명확하게 표시하여 관리자와 사용자에게 권한의 완전한 이력을 제공합니다.
6. 관리자를 위한 수동 구독 관리 관리자가 더 많은 제어권을 가질 수 있도록 새로운 도구 세트가 추가되었습니다.
구독 부여: 관리자는 이제 특정 기간 동안 모든 사용자에게 원하는 구독 플랜을 수동으로 부여할 수 있습니다. 이는 오프라인 결제 처리, 무료 접근 권한 제공, 또는 오류 수정에 완벽합니다.
접근 권한 철회: 비정기 플랜의 접근 권한은 관리자 대시보드에서 즉시 철회할 수 있습니다.
7. 그룹 관리에 대한 주요 버그 수정
기존 그룹 제거 로직의 주요 버그가 수정되었습니다. 구독이 취소되거나 철회되면, 시스템은 이제 해당 그룹에 대해 사용자가 다른 활성 구독이 있는지 확인하는 "안전 체크"를 수행합니다. 사용자는 해당 그룹에 접근할 다른 유효한 방법이 없는 경우에만 그룹에서 제거되므로, 사용자가 잘못 제거되는 것을 방지합니다.
A Discourse plugin that allows payments and subscription management via Stripe.
pfaffman
(Jay Pfaffman)
7월 7, 2025, 11:50오전
2
깃허브 저장소 링크를 포함해 주실 수 있나요?
네 네, 물론이죠. 하루만 주세요. 새 필드가 포함된 이 플러그인 버전으로 전환할 때 Stripe의 레거시 데이터를 처리하는 것과 관련된 몇 가지 버그를 해결하고 있어요.
레포지토리를 포함하여 첫 번째 게시물을 업데이트했습니다.
설정 및 구성 가이드
이 가이드에서는 필요한 결제 제공자를 설정하고 첫 번째 제품과 플랜을 만드는 방법을 안내합니다.
1. 제공자 설정
먼저 Admin > Settings > Plugins(관리자 > 설정 > 플러그인)으로 이동하여 discourse_subscriptions_payment_provider 설정에서 주요 결제 제공자를 선택하세요. 그런 다음 아래에 나와 있는 선택한 제공자의 지침을 따르세요.
A) Stripe 구성
Stripe를 제공자로 선택한 경우:
API 키 입력: Discourse 설정에서 Stripe API 키를 제공하세요:
discourse_subscriptions_public_key (Stripe 공개(Publishable) 키)
discourse_subscriptions_secret_key (Stripe 비밀(Secret) 키)
Webhook 설정: 이 단계는 정기 결제, 취소 및 기타 구독 이벤트를 추적하는 데 매우 중요합니다.
Stripe 대시보드 에서 Developers > Webhooks (개발자 > Webhooks)로 이동하세요.
“Add an endpoint” (엔드포인트 추가)을 클릭하세요.
Endpoint URL (엔드포인트 URL)에 https://your-discourse-url.com/s/hooks를 입력하세요.
“Select events” (이벤트 선택)을 클릭하고 다음 세 가지 이벤트를 추가하세요:
checkout.session.completed
customer.subscription.deleted
customer.subscription.updated
“Add endpoint” (엔드포인트 추가)을 클릭하세요.
다음 페이지에서 Signing secret (서명 비밀키)을 찾으세요(whsec_...로 시작합니다).
이 비밀키를 복사하여 Discourse의 discourse_subscriptions_webhook_secret 설정에 붙여넣으세요.
B) Razorpay 구성
Razorpay를 제공자로 선택한 경우:
API 키 입력:
Razorpay 대시보드 에서 Settings > API Keys (설정 > API 키)로 이동하여 새로운 키 쌍을 생성하세요.
키를 복사하여 해당 Discourse 설정에 붙여넣으세요:
discourse_subscriptions_razorpay_key_id
discourse_subscriptions_razorpay_key_secret
Webhook 설정: 이 단계는 결제가 성공적으로 캡처되었음을 확인하는 데 매우 중요합니다.
Razorpay 대시보드 에서 Settings > Webhooks (설정 > Webhooks)로 이동하세요.
“+ Add New Webhook” (+ 새 Webhook 추가)을 클릭하세요.
Webhook URL 에 https://your-discourse-url.com/s/hooks/razorpay를 입력하세요.
Secret (비밀키)을 생성하고 다음 단계를 위해 안전하게 보관하세요.
Active Events (활성 이벤트)에서 **payment.captured**만 선택하세요.
“Create Webhook” (Webhook 생성)을 클릭하세요.
방금 생성한 비밀키를 복사하여 Discourse의 discourse_subscriptions_razorpay_webhook_secret 설정에 붙여넣으세요.
2. 제품 및 플랜 생성
제품과 플랜을 관리하려면 Admin > Plugins > Subscriptions(관리자 > 플러그인 > 구독)으로 이동하세요.
제품 생성
Products (제품) 탭으로 이동하세요.
“Create New Product” (새 제품 생성)를 클릭하세요.
세부 정보를 입력하세요. “Description”(설명) 필드는 마크다운을 지원하며 새로운 가격 페이지에서 사용자에게 표시됩니다.
제품을 위한 플랜 생성
제품을 생성한 후, 해당 제품 옆의 수정 아이콘(✎)을 클릭하세요.
“Pricing Plans” (가격 플랜) 섹션에서 “Add New Plan” (새 플랜 추가)을 클릭하세요.
두 가지 유형의 플랜을 만들 수 있습니다:
정기 플랜(예: 월간/연간) 생성:
“Recurring Plan?” (정기 플랜?) 상자를 체크하세요.
Amount (금액)과 Billing Interval (청구 주기)(월, 년 등)을 설정하세요.
User Group (사용자 그룹)에 할당하세요.
일회성, 기간 제한 플랜(예: 30일 패스) 생성:
“Recurring Plan?” (정기 플랜?) 상자를 체크 해제 하세요.
Amount (금액)을 설정하세요.
“Duration (in days)” (기간(일))이라는 새 필드가 나타납니다. 사용자가 액세스할 수 있는 일수(예: 30)를 입력하세요.
User Group (사용자 그룹)에 할당하세요.
3. 새로운 관리자 도구
이 버전에는 구독을 수동으로 관리하기 위한 새로운 도구가 포함되어 있습니다.
구독 부여:
메인 Admin > Plugins > Subscriptions(관리자 > 플러그인 > 구독) 페이지에서 “Grant Subscription” (구독 부여) 버튼을 클릭하세요.
나타나는 모달에서 사용자 이름과 플랜을 선택하세요.
선택한 플랜이 일회성 플랜인 경우, 일 단위의 기간을 지정할 수 있습니다. 이 필드를 비워 두면 해당 그룹에 대한 영구 액세스 권한이 사용자에게 부여됩니다.
구독 취소:
관리자 섹션의 Subscriptions (구독) 탭으로 이동하세요.
비정기 구독(즉, 수동 또는 Razorpay)에는 “Revoke Access” (액세스 취소) 버튼이 있습니다.
이 버튼을 클릭하면 해당 사용자가 관련 그룹에서 즉시 제거되어 액세스가 종료됩니다.
다음과 같은 변경 사항/수정 사항으로 저장소를 업데이트했습니다. 이제 프로덕션 사이트에 설치하여 사용할 준비가 되었습니다.
안정성 및 보안 강화 요약
1. 최신 Stripe Checkout 통합 플러그인이 최신 리다이렉트 기반 Stripe Checkout 플로우를 사용하도록 업데이트되었습니다.
의미: 페이지 내 신용카드 입력 폼 대신, 사용자는 이제 Stripe가 호스팅하는 안전한 페이지로 이동하여 결제를 완료하게 됩니다.
장점: 이는 Stripe가 권장하는 방식입니다. 보안을 강화하고 사이트의 PCI 준수 부담을 줄이며, Apple Pay 및 Google Pay와 같은 결제 방법을 지원하여 더 나은 사용자 경험을 제공합니다.
2. 탄탄한 재구매 로직 이미 활성 구독이 있는 사용자가 해당 제품을 다시 구매하는 것을 방지하는 로직이 완전히 재설계되었습니다.
수정 사항: 각 로컬 구독 레코드에 product_id가 추가되었습니다. 이제 체크는 로컬 데이터베이스에 대한 단순하고 번개처럼 빠른 쿼리로 수행되며 외부 API 호출이 전혀 없으므로 100% 신뢰할 수 있습니다.
결과: 활성 구독(정기 또는 기간 한정)이 있는 사용자는 해당 구독이 만료될 때까지 동일한 제품을 재구매하는 것이 올바르게 차단됩니다.
3. 모든 대시보드의 데이터 무결성 사용자 청구 페이지와 관리자 구독 대시보드가 항상 정확하고 실시간인 데이터를 표시하도록 수정되었습니다.
수정 사항: 이제 두 페이지 모두 모든 구독의 최신 상태 및 갱신/만료일을 결제 제공업체(Stripe)에서 직접 가져옵니다.
결과: 관리자 패널에서 보는 내용은 사용자가 보는 내용과 항상 완벽하게 일치하며, 두 곳 모두 Stripe에서 구독의 실제 상태를 반영합니다. 플랜 세부 정보가 "N/A"로 표시되거나 “활성” 상태가 잘못 표시되던 버그는 해결되었습니다.
4. 견고한 Webhook 및 Job 처리
더 이상 중복 구독 없음: Webhook 처리기가 Stripe에서 오는 이벤트 시퀀스를 올바르게 처리하도록 수정되어, 한 건의 트랜잭션이 정확히 하나 의 구독 레코드를 생성하도록 보장됩니다.
신뢰할 수 있는 만료 Job: 일시적 플랜을 만료시키는 일일 백그라운드 작업이 강화되었습니다. 이제 필요한 API 키를 올바르게 설정하며, 원래 플랜이 Stripe에서 삭제되었더라도 구독을 만료시킴으로써 그룹 권한이 항상 정확하도록 보장합니다.
blake
(Blake Erickson)
7월 11, 2025, 10:22오후
7
와, 이렇게 많은 변경 사항을 만들어 주셔서 감사합니다!
하지만 현재 상태로는 아주 큰 변경 사항을 한꺼번에 병합할 수 없습니다. discourse-subscriptions 플러그인에 이 변경 사항들을 병합하고 싶다면, 각 변경 사항을 개별적으로 분리하고 테스트를 포함하여 별도의 PR을 생성해야 합니다. 또한, 현재 구독 플러그인을 사용 중이고 이미 많은 구독자가 있는 기존 사용자들에게 깨지는 변경 사항(breaking changes)이 없도록 반드시 확인해 주세요.
네, 감사합니다. 스펙을 정리한 후 시간을 내서 여러 개의 PR을 만들겠습니다.