[TIL] Day 77 Flutter 인앱 결제 정리

현서·2026년 3월 18일

[TIL] Flutter 9기

목록 보기
89/102

Flutter 인앱 결제 정리

전체 흐름 요약

mock 결제 구조 파악
→ in_app_purchase 패키지 추가
→ purchaseStream 구독
→ 스토어 상품 조회 & 구매 요청
→ 서버 검증 연결
→ 구매 이력 동기화

핵심 개념

mock → 실제 결제로 전환

  • 처음엔 DashPurchases가 mock 데이터로 동작
  • in_app_purchase 패키지 추가 후 실제 스토어와 연결
  • 패키지만 추가한다고 동작하는 게 아님 → Play Console, Firebase 세팅 필수

purchaseStream 구독 패턴

  • 결제는 버튼 클릭보다 stream 수신 흐름이 핵심
  • 생성자에서 열고 dispose에서 닫는 패턴 사용
  • onDone, onError 처리도 함께 넣기
_subscription = InAppPurchase.instance.purchaseStream.listen(
  _handlePurchase,
  onDone: () => _subscription.cancel(),
  onError: (e) => print(e),
);

상품 조회 & 구매 요청

  • queryProductDetails()로 Play Console 상품 가져옴
  • 상품 ID는 Play Console에 등록한 값과 정확히 일치해야 함
  • 소비형 → buyConsumable, 비소비형·구독 → buyNonConsumable
  • pendingCompletePurchase == true반드시 completePurchase() 호출

서버 검증 (중요)

  • 앱이 직접 결제 결과를 믿으면 안 됨 → 서버에 검증 위임
  • 앱은 source, productId, verificationData, userId를 서버로 전송
  • 서버는 Google Play Developer API로 토큰 진위 확인
  • 검증 완료 후에만 혜택 적용

구매 이력 동기화

  • 앱이 꺼진 사이에도 구독 갱신·만료는 계속 발생
  • 서버가 Google Cloud Pub/Sub으로 스토어 이벤트 수신 → DB 갱신
  • 앱은 IAPRepo로 서버 구매 상태를 다시 읽어와서 UI 복원

코드 외 세팅 체크리스트

  • Google Play Console 앱 생성 & 상품 등록
  • release keystore 준비
  • 테스트 트랙 업로드 & 테스트 계정 등록
  • Firebase 프로젝트 생성 & Android SHA-1 등록
  • Firebase / Google Play API service account JSON 준비
  • Google Cloud Pub/Sub topic 생성 & Play Console 연결

느낀 점

결제는 클라이언트 코드보다 서버 검증 + 스토어 콘솔 세팅이 훨씬 많은 비중을 차지함.
stream 구독 패턴을 확실히 잡아두면 흐름 자체는 어렵지 않음.

0개의 댓글