Files
bowlingManager/mobile/docs/subscription_integration.md
T
2025-08-01 16:45:26 +09:00

161 lines
6.2 KiB
Markdown

# 볼링 매니저 구독 및 인앱 결제 통합 문서
## 개요
볼링 매니저 앱은 구독 기반 비즈니스 모델을 채택하여 다양한 기능을 제공합니다. 이 문서는 Flutter 모바일 앱에서 구독 및 인앱 결제 기능의 구현과 통합에 대한 상세 정보를 제공합니다.
## 아키텍처 개요
구독 및 인앱 결제 시스템은 다음 주요 구성 요소로 이루어져 있습니다:
1. **모델 (Models)**
- `Subscription`: 사용자의 구독 정보를 나타냅니다.
- `SubscriptionPlan`: 사용 가능한 구독 플랜의 세부 정보를 포함합니다.
2. **서비스 (Services)**
- `SubscriptionService`: 구독 상태 관리 및 백엔드 API와의 통신을 담당합니다.
- `InAppPurchaseService`: 플랫폼별 인앱 결제 처리를 담당합니다.
3. **백엔드 API**
- 구독 검증, 상태 관리, 영수증 검증 등의 서버 측 로직을 제공합니다.
## 데이터 흐름
### 구독 구매 프로세스
1. 사용자가 구독 구매 버튼을 클릭합니다.
2. `SubscriptionService.createSubscription()`이 호출됩니다.
3. `InAppPurchaseService.purchaseSubscription()`이 호출되어 플랫폼별 결제 프로세스를 시작합니다.
4. 결제가 완료되면 `InAppPurchaseService``purchaseStream`이 업데이트됩니다.
5. 결제 상태가 `PurchaseStatus.purchased`로 변경되면 `_verifyAndSavePurchase()` 메서드가 호출됩니다.
6. `_verifyAndSavePurchase()`는 플랫폼별 영수증 데이터를 추출하고 서버에 전송하여 검증합니다.
7. 서버는 영수증을 검증하고 구독 정보를 데이터베이스에 저장합니다.
8. 검증이 성공하면 `SubscriptionService`는 서버에서 최신 구독 정보를 가져와 로컬 상태를 업데이트합니다.
### 구독 상태 확인 및 기능 접근 제어
1. 앱이 시작되면 `SubscriptionService.loadCurrentSubscription()`이 호출되어 현재 구독 상태를 로드합니다.
2. 사용자가 특정 기능에 접근하려고 할 때 `SubscriptionService.canAccessFeature()`가 호출됩니다.
3. 현재 구독 상태에 따라 기능 접근 권한이 결정됩니다.
4. 접근 권한이 없는 경우 업그레이드 안내 대화상자가 표시됩니다.
## 주요 클래스 및 메서드
### SubscriptionService
```dart
class SubscriptionService extends ChangeNotifier {
// 주요 속성
Subscription? _currentSubscription;
List<SubscriptionPlan> _availablePlans;
InAppPurchaseService _purchaseService;
// 주요 메서드
Future<void> loadCurrentSubscription();
Future<bool> createSubscription(SubscriptionPlanType planType, bool isYearly);
Future<bool> restoreSubscriptions();
Future<bool> changePlan(SubscriptionPlanType newPlanType, bool isYearly);
Future<bool> toggleAutoRenew();
bool canAccessFeature(SubscriptionFeature feature);
Future<bool> checkFeatureAccess(SubscriptionFeature feature, BuildContext context);
int getMaxMembersAllowed();
int getMaxEventsAllowed();
}
```
### InAppPurchaseService
```dart
class InAppPurchaseService extends ChangeNotifier {
// 주요 속성
List<ProductDetails> _products;
List<PurchaseDetails> _purchases;
bool _purchaseVerified;
Map<String, dynamic>? _verifiedPurchase;
// 주요 메서드
Future<void> initialize();
Future<bool> purchaseSubscription(SubscriptionPlanType planType);
Future<bool> restorePurchases();
Future<bool> _verifyAndSavePurchase(PurchaseDetails purchaseDetails);
}
```
## 구독 플랜 및 기능
볼링 매니저는 다음과 같은 구독 플랜을 제공합니다:
1. **무료 (Free)**
- 기본 볼링 점수 추적
- 최대 10명의 회원 관리
- 최대 5개의 이벤트 관리
2. **기본 (Basic)**
- 모든 무료 기능
- 최대 30명의 회원 관리
- 최대 10개의 이벤트 관리
- 기본 통계 분석
3. **프리미엄 (Premium)**
- 모든 기본 기능
- 최대 100명의 회원 관리
- 최대 50개의 이벤트 관리
- 고급 통계 분석
- 커스터마이징 옵션
4. **프로 (Pro)**
- 모든 프리미엄 기능
- 최대 500명의 회원 관리
- 최대 200개의 이벤트 관리
- 우선 지원
- 모든 고급 기능 접근
## 영수증 검증 프로세스
1. **iOS 영수증 검증**
- App Store 영수증 데이터 추출
- 서버에 영수증 데이터 전송
- 서버는 Apple 서버에 영수증 검증 요청
- 검증 결과에 따라 구독 상태 업데이트
2. **Android 영수증 검증**
- Google Play 영수증 데이터(JSON) 추출
- 서버에 영수증 데이터 전송
- 서버는 Google Play API를 통해 영수증 검증
- 검증 결과에 따라 구독 상태 업데이트
## 오류 처리
- 결제 프로세스 중 발생하는 오류는 `_error` 속성에 저장되고 UI에 표시됩니다.
- 네트워크 오류, 서버 오류, 검증 오류 등 다양한 오류 상황에 대한 처리가 구현되어 있습니다.
- 오류 발생 시 사용자에게 적절한 피드백을 제공하고 필요한 경우 재시도 옵션을 제공합니다.
## 테스트 및 QA
구독 및 인앱 결제 기능을 테스트하려면:
1. **샌드박스 환경 설정**
- iOS: App Store Connect에서 샌드박스 테스터 계정 설정
- Android: Google Play Console에서 테스트 트랙 설정
2. **테스트 시나리오**
- 구독 구매
- 구독 복원
- 플랜 변경
- 자동 갱신 설정 변경
- 구독 만료 처리
- 다양한 오류 상황 테스트
## 백엔드 API 엔드포인트
- `/subscriptions/current`: 현재 구독 정보 조회
- `/subscriptions/plans`: 사용 가능한 구독 플랜 목록 조회
- `/subscriptions/subscribe`: 새 구독 생성
- `/subscriptions/verify-receipt`: 인앱 결제 영수증 검증
- `/subscriptions/change-with-features`: 구독 플랜 변경
- `/subscriptions/autorenew`: 자동 갱신 설정 변경
## 결론
볼링 매니저의 구독 및 인앱 결제 시스템은 Flutter의 `in_app_purchase` 패키지와 커스텀 백엔드 API를 통합하여 안전하고 사용자 친화적인 결제 경험을 제공합니다. 이 문서는 시스템의 주요 구성 요소와 데이터 흐름을 설명하여 개발자들이 시스템을 이해하고 유지보수할 수 있도록 돕습니다.