«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

flutter 인앱 결제 구독 복원 Flow 본문

스터디/Flutter

flutter 인앱 결제 구독 복원 Flow

행복한 수지아빠 2025. 2. 16. 19:41

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. 백엔드에서 구독 상태를 검증하는 것이 보안상 더 안전함



이제 앱을 삭제하고 재설치해도 구독 상태를 유지할 수 있어!