웹훅을 제대로 설정하셨나요? 설정하는 법이 꽤 까다로웠던 것 같은데, 설명서가 좀 더 명확했으면 좋았을 텐데 싶어요.
네, 웹훅을 잘 설정해 두었더니 응답이 정상적으로 돌아오고 있었습니다.
문제를 찾았어요. Stripe 가격 설정 페이지에서 그룹 이름으로 승격할 커스텀 태그를 설정해야 한다는 부분이 설명서에 빠져 있었습니다.
지금은 제 쪽에서 잘 작동하고 있어요. 플러그인은 훌륭하지만, 문서가 좀 더 상세했으면 좋겠습니다.
문서 업데이트를 담당할 수 있도록 이 부분을 조금 더 자세히 설명해 주시겠습니까? 어떤 커스텀 태그를 어디에 추가하셨나요?
[가이드] Stripe 가격 테이블을 사용하여 Discourse 구독 설정하기 (및 일반적인 함정)
안녕하세요,
긴 시간의 문제 해결 과정을 거친 후, Stripe 가격 테이블이라는 최신 방법을 사용하여 공식 discourse-subscriptions 플러그인을 설정하는 데피니티브한 가이드를 공유하고자 합니다. 이 방법은 강력하지만, 바로 눈에 띄지 않는 몇 가지 중요한 단계가 있으며, 이를 무시하면 웹훅 실패(404 Not Found)나 결제 성공 후에도 사용자가 그룹에 추가되지 않는 등의 오류가 발생할 수 있습니다.
다음은 확인된 정상 작동하는 단계별 프로세스입니다.
1부: Stripe 설정
이 프로세스에서는 모든 제품과 가격에 대해 Stripe를 "진실의 원천(source of truth)"으로 사용합니다.
1. 제품 및 가격 생성
- Stripe 대시보드에서 **Live Mode(실제 모드)**에 있는지 확인하십시오.
- Products(제품) > **Product catalog(제품 카탈로그)**로 이동합니다.
- 먼저 주요 제품(예: “Premium Membership”, “VIP Access”)을 생성합니다.
- 각 제품 아래에서 관련 가격(예:
XX / month,XXX / year)을 모두 생성합니다.
2. 매우 중요한 메타데이터 단계 플러그인이 사용자를 자동으로 그룹에 추가하려면, 생성하는 모든 Price(가격) 객체에 특정 메타데이터를 추가해야 합니다. Stripe 대시보드 UI에서는 이를 찾기 어려울 수 있습니다.
- 새 가격을 생성할 때(또는 “Edit price” 옵션을 찾을 수 있는 경우), 메타데이터를 추가해야 합니다. 가격 생성 중 **“Additional options(추가 옵션)”**을 클릭해야 메타데이터 필드가 표시될 수 있습니다.
- **+ Add metadata(메타데이터 추가)**를 클릭하고 다음을 입력하십시오:
- KEY(키):
group_name - VALUE(값): Discourse에서 해당 그룹의 고유하고 URL에 안전한 슬러그/핸들, 전체 이름이 아닙니다.
- KEY(키):
예시:
- Discourse 그룹의 전체 이름이 **“Enclave Plus”**인 경우, 그 슬러그는
EnclavePlus일 가능성이 높습니다.- 값으로
EnclavePlus를 사용해야 합니다. 공백이 포함된"Enclave Plus"를 사용하면 실패합니다.
- 그룹과 연결하려는 모든 가격 플랜에 대해 이 과정을 반복해야 합니다.
3. Stripe 가격 테이블 생성
- **Products > Pricing tables(제품 > 가격 테이블)**로 이동합니다.
- 새 테이블을 만들고 방금 설정한 가격들을 추가합니다.
- 테이블을 게시한 후, “Copy code(코드 복사)” 버튼을 클릭하여 가격 테이블 ID(
prctbl_...로 시작)를 가져옵니다.
4. 웹훅 엔드포인트 구성 (404 오류 수정) 이는 가장 흔한 실패 지점입니다.
- **Developers > Webhooks(개발자 > 웹훅)**로 이동하고 **+ Add endpoint(엔드포인트 추가)**를 클릭합니다.
- **Endpoint URL(엔드포인트 URL)**은 다음 형식이어야 합니다:
https://your-discourse-site.com/s/hooks참고: 올바른 경로는/s/hooks이며,/s/stripe/webhook이 아닙니다. - **Events to send(보낼 이벤트)**에는 최소한 다음을 추가하십시오:
checkout.session.completedcustomer.subscription.deleted
- 엔드포인트를 생성하고 Signing secret(서명 시크릿)(
whsec_...로 시작)을 복사합니다.
2부: Discourse 설정
이제 Stripe에서 설정한 모든 것을 사용하도록 플러그인을 구성해 보겠습니다.
1. API 키 및 가격 테이블 ID 입력
Admin > Settings(관리자 > 설정)로 이동하여discourse subscriptions을 검색합니다.- 라이브 Stripe 키를 입력하십시오:
discourse subscriptions public key(pk_live_...)discourse subscriptions secret key(sk_live_...)discourse subscriptions webhook secret(whsec_...)
- 가격 테이블 모드를 활성화합니다:
discourse subscriptions pricing table enabled상자를 체크합니다.discourse subscriptions pricing table id필드에prctbl_...ID를 붙여넣습니다.
2. Stripe 제품을 Discourse 그룹과 연결 가격 테이블을 사용하더라도 Discourse에 어떤 그룹이 어떤 제품에 속하는지 알려야 합니다.
Admin > Plugins > Subscriptions(관리자 > 플러그인 > 구독)로 이동하여 Products(제품) 탭을 클릭합니다.- **Create New Product(새 제품 생성)**을 클릭합니다.
- Stripe의 제품 이름과 완전히 일치하는 제품 이름(예:
Enclave Plus)을 입력합니다. - 제품을 저장합니다. 제품 페이지에서 아래로 스크롤하여 **Add New Plan(새 플랜 추가)**을 클릭합니다.
- 이 플랜은 단순히 "다리(bridge)
방금 이 방법을 테스트해 보았는데 완벽했습니다! 원래 문서에도 이 내용을 포함하도록 업데이트하겠습니다!
문서에 빠져 있는 핵심 부분이 바로 이것입니다. 다른 부분을 인용하셨으니 이 점도 짚어드립니다.
이 기능을 사용하여 앵커 날짜를 자동으로 설정할 수 있는 방법이 있을까요? 누군가 결제하면 Stripe에서 모든 사용자의 구독 기간을 매월 1일에 리셋되도록 수동으로 조정해야 합니다.
Stripe 문서에는 결제 시 API로 이를 수행할 수 있다고 되어 있지만, 현재 플러그인에서 이를 조정할 수 있는 방법이 없습니다.
업데이트를 게시할 때 내용이 길어질 수 있으므로 이 내용을 새 스레드로 옮깁니다.
이 플러그인은 이제 Bundling more popular plugins with Discourse core 언급된 대로 Discourse 코어에 번들링되었습니다. 셀프 호스팅 환경에서 해당 플러그인을 사용 중이라면 다음 업그레이드 전에 app.yml에서 제거해야 합니다.
업그레이드 전에 코어에서 이 플러그인을 제거하는 방법은 무엇인가요? 제가 개선했던 플러그인 포크를 사용하게 될 것이기 때문입니다.
이런 식으로
rm - rf discourse-subscroptions
git clone을 실행하기 전에.
미안합니다, 이해가 잘 안 되는데, 리빌드 과정에서 이 통합 플러그인 코드를 가져와서 빌드하는 것이 전부 한 단계에서 이루어지는 거 아닌가요?
이 부분은 테스트하지는 않았지만, 꽤 확신합니다:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- rm -rf discourse-subscriptions
- git clone https://github.com/yourForkUser/discourse-subscriptions
이 코드는 플러그인 디렉터리에서 실행되므로, 현재 코어에 포함된 discourse-subscriptions를 삭제하고 그 대신 과거에 사용하던 것으로 교체합니다. 따라서 이 플러그인이나 포함되지 않거나 교체하려는 다른 플러그인에 대해 git clone 전에 app.yml에 단순히 rm -rf만 추가하면 원하는 대로 코어 플러그인을 자신의 포크로 교체할 수 있습니다.
자, 어떤 플러그인이 이제 코어의 일부가 되었다고 할 때, 그들이 말하는 것은 해당 플러그인이 플러그인 디렉토리에 포함된 코어 저장소에 사전 패키징되어, 우리가 별도로 그 코드를 선택적으로 가져올 필요가 없다는 뜻이죠. 알겠습니다. 구조적으로는 아무것도 변하지 않네요.
지금은 사전 패키징 상태인가요? 플러그인 버전에서 모든 데이터를 잃게 되나요? 처음부터 다시 설정해야 하는지, 아니면 이전 설정이 유지되는지 궁금합니다.
데이터가 손실되지 않습니다. app.yml에서 해당 줄을 삭제하면 플러그인은 이전과 동일하게 계속 작동합니다.
쿠폰 코드를 입력한 후 구독 총액이 즉시 업데이트되지 않는 것이 정상적인 동작인가요?
Discourse 3.5.0.beta8-dev에서 테스트했습니다.
사용자가 가입을 시도했는데 결제가 실패하면, 해당 사용자를 Stripe 고객 ID와 연결하는 discourse_subscriptions_customer 테이블의 항목이 삭제되는 것을 확인했습니다. 이 동작이 의도된 것인지 확실하지 않지만, 어쨌든 Stripe에서 수동으로 삭제해야 하는 고아 고객(orphaned customers)이 생성되므로 좋은 동작이라고 생각하지 않습니다. 또한 사용자가 재시도할 경우 중복 고객이 생성되어 보고(reports)에 영향을 미칠 수 있습니다.
캠페인을 초기화하는 방법이 있을까요? 매달 기부 목표를 설정하고 싶었는데, 새 달이 시작되었는데도 목표를 0으로 초기화하여 새로운 월간 목표를 설정하는 방법을 찾지 못하겠습니다.
이 플러그인이 실제로 사이트에서 작동하는 모습을 보고 싶어요. 구독 플러그인을 사용하는 포럼 링크를 공유해 주실 분 계신가요? 감사합니다!
