올해는 머신러닝이다.
flutter 인앱 결제 구독 복원 Flow 본문
Flutter 인앱 결제 구독 복원(restore) 기능 구현
앱을 삭제하고 다시 설치했을 때 구독 상태를 복원하는 방법을 자세히 설명할게.
---
1. 구독 복원 원리
iOS: 사용자는 이미 구독한 상품을 다시 구매할 수 없고, restorePurchases()를 호출하면 기존 구독 정보를 가져올 수 있음.
Android: 자동으로 복원되지 않으므로, queryPastPurchases()를 호출하여 과거 구매 내역을 가져와야 함.
---
2. 구독 복원 코드 구현
(1) 과거 구매 내역 조회 (구독 복원)
Flutter에서 구독 상태를 확인하려면 queryPastPurchases()를 사용해야 해.
Future<void> restorePurchases() async {
final QueryPurchaseDetailsResponse response = await InAppPurchase.instance.queryPastPurchases();
if (response.error != null) {
print('구매 내역 조회 실패: ${response.error}');
return;
}
for (var purchase in response.pastPurchases) {
_handlePurchase([purchase]); // 기존 구매 내역을 다시 처리
}
}
---
(2) 결제 완료된 구매 처리 (복원 포함)
restorePurchases()가 호출되면 _handlePurchase() 함수에서 상태를 확인하고 처리해야 해.
void _handlePurchase(List<PurchaseDetails> purchaseDetailsList) {
for (var purchaseDetails in purchaseDetailsList) {
if (purchaseDetails.status == PurchaseStatus.purchased ||
purchaseDetails.status == PurchaseStatus.restored) {
// ✅ 구독이 활성화되었음을 확인 후 기능 제공
unlockPremiumFeatures();
}
if (purchaseDetails.pendingCompletePurchase) {
InAppPurchase.instance.completePurchase(purchaseDetails);
}
}
}
---
(3) 앱 실행 시 자동 복원
앱이 실행될 때 구독 여부를 확인하여 자동으로 복원할 수도 있어.
@override
void initState() {
super.initState();
checkSubscriptionStatus();
}
Future<void> checkSubscriptionStatus() async {
final bool available = await InAppPurchase.instance.isAvailable();
if (!available) return;
final QueryPurchaseDetailsResponse response = await InAppPurchase.instance.queryPastPurchases();
for (var purchase in response.pastPurchases) {
if (purchase.status == PurchaseStatus.purchased || purchase.status == PurchaseStatus.restored) {
unlockPremiumFeatures();
}
}
}
---
(4) UI에서 구독 복원 버튼 추가
유저가 수동으로 구독을 복원할 수 있도록 UI에도 버튼을 추가하면 좋아.
ElevatedButton(
onPressed: restorePurchases,
child: Text('구독 복원'),
)
---
3. 테스트 방법
iOS
1. App Store Sandbox Tester 계정을 설정하고 앱을 실행
2. 구독한 후 앱 삭제 후 재설치
3. restorePurchases() 호출하여 복원 확인
Android
1. Play Store 테스터 계정으로 구독
2. 앱 삭제 후 재설치
3. restorePurchases() 호출하여 복원 확인
4. Android는 ‘구독 복원’ 버튼을 눌러야 할 수도 있음 (자동 복원이 보장되지 않음)
---
4. 구독 상태를 백엔드에서 검증 (선택 사항)
구독 상태를 로컬에서만 확인하는 것은 보안상 위험하므로, 백엔드에서 Google과 Apple 서버를 통해 구독 상태를 검증하는 것이 더 안전해.
Google: Google Play Developer API에서 영수증 검증
Apple: App Store Server API에서 구독 상태 조회
앱에서 구독 여부를 백엔드에서 받아오도록 구현하면 더 안전해.
---
결론
1. restorePurchases()를 사용하여 구독 복원 기능 추가
2. 앱 실행 시 자동으로 queryPastPurchases()로 구독 확인 가능
3. iOS는 기본적으로 자동 복원이 되지만, Android는 사용자가 직접 버튼을 눌러야 할 수도 있음
4. 백엔드에서 구독 상태를 검증하는 것이 보안상 더 안전함
이제 앱을 삭제하고 재설치해도 구독 상태를 유지할 수 있어!
'스터디 > Flutter' 카테고리의 다른 글
Flutter MVVM 아키텍쳐 추천(Riverpod과 Freezed) (0) | 2025.02.17 |
---|---|
flutter에서 인앱 결제 구독 단계별 성명 (0) | 2025.02.16 |
Flutter + Riverpod 카운터앱 (0) | 2023.12.11 |
Dart 에서 Promise.all 을 구현해보자 (0) | 2020.02.29 |
Flutter + Node + docker Sample Code (0) | 2019.06.14 |