Google Play 문제

0:10:00

Google Play 구성 문제는 RevenueCat을 Android 앱과 연동할 때 가장 흔하게 발생하는 문제 중 하나입니다. 이 단계에서는 상품 설정, 서비스 자격 증명, 테스트 과정에서 마주치는 어려움을 다룹니다.

문제 1: 상품을 찾을 수 없음 오류

오류 메시지

text
BillingClient: Product not found
Error: The item you were attempting to purchase could not be found

흔한 원인

  1. 상품 미게시: 상품은 존재하지만 Google Play Console에 게시되지 않은 경우입니다.
  2. 상품 ID 불일치: RevenueCat의 상품 ID가 Google Play와 일치하지 않습니다.
  3. 앱 미게시: 앱이 게시되지 않았습니다(내부 테스트용으로도 게시되지 않음).
  4. 잘못된 패키지 이름: 패키지 이름이 앱과 일치하지 않습니다.

해결 단계

1단계: Google Play Console에서 상품 상태 확인

  1. Google Play Console로 이동합니다.
  2. 수익 창출 → 상품 → 인앱 상품 또는 구독으로 이동합니다.
  3. 상품 상태가 "활성"인지 확인합니다.
  4. "비활성" 또는 "초안"으로 표시되면 활성화해야 합니다.

2단계: 상품 ID 일치 여부 확인

  1. Google Play Console에서 정확한 상품 ID를 복사합니다.
  2. RevenueCat 대시보드로 이동합니다.
  3. 상품 카탈로그 → 상품으로 이동합니다.
  4. Google Play 상품 ID가 정확히 일치하는지 확인합니다(대소문자 구분).
중요: 상품 ID는 대소문자를 구분합니다. "premium_monthly"와 "premium_Monthly"는 서로 다릅니다.

3단계: 테스트용으로 앱 게시

  1. 앱은 최소한 내부 테스트 트랙에 게시되어야 합니다.
  2. Google Play Console에서 테스트 → 내부 테스트로 이동합니다.
  3. 출시를 생성하고 APK/AAB를 업로드합니다.
  4. 본인을 테스터로 추가합니다.
  5. Google Play가 출시를 처리하도록 1~2시간 정도 기다립니다.

4단계: 패키지 이름 확인

  1. 앱의 build.gradle에서 applicationId를 확인합니다.
  2. RevenueCat 대시보드에서 App → Google Play 패키지 이름이 일치하는지 확인합니다.

문제 2: 서비스 자격 증명 / API 액세스 문제

오류 메시지

text
Error: Unable to fetch Google Play purchases
Google Play credentials are invalid or expired

흔한 원인

  1. 서비스 계정 미생성: Google Cloud 서비스 계정을 설정하지 않았습니다.
  2. 권한 누락: 서비스 계정에 필요한 권한이 없습니다.
  3. 만료된 자격 증명: 서비스 계정 키가 만료되었습니다.
  4. 잘못된 프로젝트 연결: 서비스 계정이 다른 Google Cloud 프로젝트의 것입니다.

해결 단계

1단계: 서비스 계정 생성(생성하지 않은 경우)

  1. Google Cloud Console로 이동합니다.
  2. Google Play Console에 연결된 프로젝트를 선택하거나 생성합니다.
  3. IAM 및 관리자 → 서비스 계정으로 이동합니다.
  4. 서비스 계정 만들기를 클릭합니다.
  5. 이름을 "RevenueCat Service Account"로 지정합니다.
  6. 만들고 계속하기를 클릭합니다.
  7. 역할 할당은 건너뜁니다(Google Play Console에서 진행).
  8. 완료를 클릭합니다.

2단계: Google Play Console에서 권한 부여

  1. Google Play Console로 이동합니다.
  2. 설정 → API 액세스로 이동합니다.
  3. Google Cloud 프로젝트를 연결합니다(아직 연결되지 않은 경우).
  4. 서비스 계정을 찾아 액세스 권한 부여를 클릭합니다.
  5. 다음 권한을 부여합니다.
    • 재무 데이터 보기.
    • 주문 및 구독 관리.
  6. 사용자 초대를 클릭합니다.

3단계: 서비스 계정 키 생성 및 업로드

  1. Google Cloud Console에서 진행합니다.
  2. IAM 및 관리자 → 서비스 계정으로 이동합니다.
  3. 서비스 계정을 클릭합니다.
  4. 탭으로 이동합니다.
  5. 키 추가 → 새 키 만들기를 클릭합니다.
  6. JSON 형식을 선택합니다.
  7. 키 파일을 다운로드합니다.
  8. RevenueCat 대시보드에서 다음을 진행합니다.
    • 프로젝트로 이동합니다.
    • Apps & providers → Google Play로 이동합니다.
    • JSON 키 파일을 업로드합니다.
보안 경고: 서비스 계정 JSON 파일은 절대 버전 관리 시스템에 커밋하지 마세요. 안전하게 보관하고 키를 정기적으로 교체하세요.

문제 3: 테스트 문제 및 라이선스 테스터

오류 메시지

text
Error: This version of the application is not configured for billing through Google Play

흔한 원인

  1. 라이선스 테스터로 미등록: Google 계정이 라이선스 테스트 목록에 없습니다.
  2. 잘못된 Google 계정 사용: 라이선스 테스터가 아닌 계정으로 테스트하고 있습니다.
  3. 적절한 설정 없이 에뮬레이터에서 테스트: 에뮬레이터에는 별도의 구성이 필요합니다.
  4. Play 스토어에서 다운로드하지 않은 앱: 사이드로드한 앱으로는 테스트 구매를 할 수 없습니다.

해결 단계

1단계: 라이선스 테스터 추가

  1. Google Play Console로 이동합니다.
  2. 설정 → 라이선스 테스트로 이동합니다.
  3. 테스터의 Gmail 주소를 추가합니다.
  4. 응답을 RESPOND_NORMALLY로 설정합니다.
  5. 변경 사항을 저장합니다.

2단계: 내부 테스트 사용자 추가

  1. 테스트 → 내부 테스트로 이동합니다.
  2. 테스터 탭에서 목록을 만들거나 이메일 주소를 추가합니다.
  3. 테스터는 프로그램에 참여하려면 참여 링크를 수락해야 합니다.

3단계: 앱 올바르게 설치

  1. 테스터는 Play 스토어 참여 링크를 통해 설치해야 합니다.
  2. 구매 테스트를 위해 APK를 사이드로드하지 마세요.
  3. 기기가 라이선스 테스터 Google 계정으로 로그인되어 있는지 확인합니다.

4단계: 버전 코드 일치 여부 확인

  1. 업로드한 APK/AAB의 버전 코드는 로컬 빌드와 일치해야 합니다.
  2. build.gradle에서 versionCode를 확인합니다.
  3. Google Play Console의 버전과 일치하는지 확인합니다.
팁: Google Play 설정의 번거로움 없이 더 빠르고 안정적으로 테스트하려면 RevenueCat Test Store를 사용하세요.

문제 4: 캐시 및 상태 문제

증상

  • 정상 작동하던 상품이 갑자기 사용할 수 없게 됩니다.
  • 구매에 성공해도 구매 상태가 업데이트되지 않습니다.
  • 제거한 이전 상품이 계속 표시됩니다.

해결 단계

1단계: Google Play 스토어 캐시 삭제

  1. 기기 설정 → 앱으로 이동합니다.
  2. Google Play 스토어를 찾습니다.
  3. 저장용량 → 캐시 삭제를 탭합니다.
  4. 기기를 재시작합니다.

2단계: 앱 캐시 삭제

kotlin
// 고객 정보 강제 새로고침
Purchases.sharedInstance.invalidateCustomerInfoCache()

3단계: 앱 재설치

  1. 앱을 완전히 제거합니다.
  2. Play 스토어 참여 링크에서 다시 설치합니다.
  3. 이렇게 하면 깨끗한 상태가 보장됩니다.

문제 5: 내부 테스트 중 실제 결제 발생(테스트 거래 아님)

증상

Google Play의 내부 테스트 트랙을 통해 구독이나 인앱 구매를 테스트하는데, 결제 수단(예: 신용카드, UPI, Google Pay)에 실제 결제가 처리됩니다. Google Play 결제 대화상자에 "테스트 카드, 항상 승인" 옵션 대신 실제 결제 옵션이 표시되고, 거래가 프로덕션 구매로 나타납니다.

발생 이유

많은 개발자가 놓치는 아주 중요한 구분이 있습니다. 내부 테스트 테스터라이선스 테스터는 Google Play Console에서 완전히 다른 두 가지 구성입니다.

구성위치용도
내부 테스트 테스터테스트 → 내부 테스트 → 테스터 탭테스트 트랙에서 앱을 다운로드할 수 있는 권한을 부여합니다.
라이선스 테스터설정 → 라이선스 테스트구매를 테스트 거래로 처리합니다(실제 결제 없음).

사용자를 내부 테스트 테스터로 추가하면 앱을 다운로드할 수만 있습니다. 이는 구매를 무료로 만들지 않습니다. 구매를 테스트 거래로 처리하려면 라이선스 테스트에도 반드시 해당 Gmail 주소를 추가해야 합니다.

경고: 라이선스 테스트를 구성하지 않으면 앱 자체가 테스트 트랙에 있더라도 내부 테스트 트랙에서 발생하는 모든 구매는 실제 돈이 청구되는 실제 프로덕션 거래입니다.

해결 단계

1단계: 테스터를 라이선스 테스트에 추가(계정 수준)

가장 흔히 빠뜨리는 단계입니다.

  1. Google Play Console로 이동합니다.
  2. 설정 → 라이선스 테스트로 이동합니다(앱별 설정이 아니라 계정 수준 설정에 있습니다).
  3. 각 테스터의 Gmail 주소를 추가합니다.
  4. 라이선스 응답을 RESPOND_NORMALLY로 설정합니다.
  5. 변경 사항 저장을 클릭합니다.
  6. 변경 사항이 반영되도록 15~30분 정도 기다립니다.
참고: Gmail 주소는 테스트 기기의 기본 Google 계정과 일치해야 합니다. 기기에 Google 계정이 여러 개 있다면 Play 스토어에서 설치할 때 사용한 계정이 중요합니다.

2단계: 기기에서 올바른 Google 계정 확인

라이선스 테스트를 구성했더라도 기기에서 잘못된 계정을 사용하면 실제 결제가 발생합니다.

  1. 테스트 기기에서 Google Play 스토어 앱을 엽니다.
  2. 오른쪽 상단의 프로필 아이콘을 탭합니다.
  3. 어떤 Google 계정이 활성 상태인지 확인합니다.
  4. 이 계정은 라이선스 테스트에 등록된 이메일과 동일해야 합니다.
  5. 여러 계정을 사용 중이라면 구매하기 전에 올바른 계정으로 전환합니다.

3단계: 참여 링크에서 앱 재설치

앱은 올바른 테스트 채널을 통해 설치해야 합니다.

  1. 기기에서 앱을 제거합니다.
  2. Google Play Console → 테스트 → 내부 테스트 → 테스터 탭으로 이동합니다.
  3. 참여 URL("웹에서 참여" 링크)을 복사합니다.
  4. 올바른 Google 계정으로 테스트 기기에서 이 링크를 엽니다.
  5. 초대를 수락하고 Play 스토어에서 앱을 설치합니다.

4단계: 테스트 모드 작동 확인

라이선스 테스트가 올바르게 구성되면 결제 대화상자에 다음이 표시됩니다.

  • 상단에 "테스트 카드, 항상 승인" 결제 수단이 표시됩니다.
  • 구매 금액이 $0.00으로 표시되거나 테스트 주문으로 표시됩니다.
  • 실제 결제 수단(신용카드, UPI, Google Pay)이 기본 옵션으로 표시되지 않아야 합니다.

모든 단계를 따랐는데도 실제 결제 옵션이 계속 보이면 30분 정도 기다린 후 다시 시도하세요. 라이선스 테스트 변경 사항이 Google 시스템에 반영되기까지 시간이 걸릴 수 있습니다.

실수로 발생한 실제 결제 환불받기

테스트 중에 실제 돈이 청구되었다면 환불을 진행할 수 있습니다.

방법 1: Google Play Console을 통한 환불(개발자용)

  1. Google Play Console로 이동합니다.
  2. 주문 관리(수익 창출 아래)로 이동합니다.
  3. 사용자 이메일이나 주문 ID로 주문을 찾습니다.
  4. 주문을 클릭하고 환불을 선택합니다.
  5. 환불을 선택하고 필요하면 액세스 권한을 취소합니다.

방법 2: Google Play 지원을 통한 요청(테스터용)

  1. Google Play 주문 내역을 엽니다.
  2. 해당 결제를 찾아 문제 신고를 클릭합니다.
  3. 사유를 선택하고 환불을 요청합니다.
팁: 실수로 인한 결제를 완전히 피하려면 Google Play의 라이선스 테스트 대신 RevenueCat의 Test Store 사용을 고려해 보세요. Test Store는 실제 결제 위험이 없는 결정적 테스트 거래를 제공하며, 별도의 계정 설정이 필요 없고 CI/CD 환경에서도 작동합니다.

흔한 문제 빠른 참조

문제가능한 원인해결 방법
RevenueCat에서 상품을 찾을 수 없음 Google Play Console과 RevenueCat 대시보드 간 상품 ID 불일치. Google Play Console → 수익 창출 → 상품에서 정확한 상품 ID를 복사합니다. RevenueCat → 상품 카탈로그 → 상품에 붙여 넣습니다. ID는 대소문자를 구분하며 문자 하나까지 정확히 일치해야 합니다.
RevenueCat에서 상품을 찾을 수 없음 상품이 Google Play Console에서 "초안" 또는 "비활성" 상태입니다. Google Play Console → 수익 창출 → 상품에서 각 상품 상태가 활성으로 표시되는지 확인합니다. 초안 상태인 상품을 활성화하고 변경 사항이 반영되도록 몇 분 정도 기다립니다.
RevenueCat에서 상품을 찾을 수 없음 앱이 어떤 테스트 트랙에도 게시되지 않았습니다. 앱은 서명된 APK/AAB와 함께 최소한 내부 테스트 트랙에 게시되어야 합니다. Google Play Console → 테스트 → 내부 테스트 → 새 출시 만들기로 이동합니다.
"결제를 사용할 수 없음" 오류 Google Play 서비스가 없는 에뮬레이터에서 테스트하고 있습니다. 실제 기기나 Google Play 스토어가 포함된 에뮬레이터 이미지를 사용하세요(Google API만으로는 부족함). Android Studio에서 "Google Play" 열이 표시된 시스템 이미지를 선택합니다.
"결제를 사용할 수 없음" 오류 앱이 Play 스토어를 통하지 않고 사이드로드되었습니다. 테스터는 내부 테스트 트랙의 Play 스토어 참여 링크를 통해 앱을 설치해야 합니다. 사이드로드한 APK로는 테스트 구매를 할 수 없습니다.
서비스 자격 증명 오류 서비스 계정 JSON 키가 업로드되지 않았거나 만료되었습니다. RevenueCat 대시보드 → Apps & providers → Google Play에서 유효한 JSON 키 파일을 업로드합니다. 필요하면 Google Cloud Console → IAM 및 관리자 → 서비스 계정 → 키에서 새 키를 생성합니다.
서비스 자격 증명 오류 서비스 계정에 필요한 권한이 없습니다. Google Play Console → 설정 → API 액세스에서 서비스 계정에 재무 데이터 보기주문 및 구독 관리 권한을 부여합니다. 반영까지 최대 36시간이 걸릴 수 있습니다.
서비스 자격 증명 오류 Google Cloud 프로젝트가 Play Console에 연결되지 않았습니다. Google Play Console → 설정 → API 액세스에서 서비스 계정이 포함된 올바른 Google Cloud 프로젝트를 연결합니다. 한 번에 하나의 프로젝트만 연결할 수 있습니다.
"이 버전은 결제용으로 구성되지 않았습니다" 로컬 빌드와 Play 스토어 간 버전 코드 불일치. build.gradleversionCode가 테스트 트랙에 업로드된 버전과 일치하는지 확인합니다. 다르면 새 빌드를 업로드합니다.
테스트 구매에 실제 돈이 청구됨 Google 계정이 라이선스 테스터로 추가되지 않았습니다(계정 수준 설정). Google Play Console → 설정 → 라이선스 테스트(앱 수준 테스터가 아님)로 이동합니다. Gmail 주소를 추가합니다. 응답을 RESPOND_NORMALLY로 설정합니다. 15~30분 정도 기다립니다. 내부 테스트 테스터와 라이선스 테스터는 별개의 구성입니다. 위의 상세 가이드를 참고하세요.
테스트 구매에 실제 돈이 청구됨 기기에서 잘못된 Google 계정이 활성 상태입니다. 기기의 기본 Google 계정(Play 스토어에서 설치할 때 사용한 계정)은 라이선스 테스트의 이메일과 일치해야 합니다. Play 스토어를 열고 → 프로필 아이콘을 탭해 활성 계정을 확인합니다. 계정이 여러 개라면 올바른 계정으로 전환합니다.
테스트 구매에 실제 돈이 청구됨 라이선스 테스트 변경 사항이 아직 반영되지 않았습니다. 라이선스 테스터를 추가한 후 테스트하기 전에 15~30분 정도 기다립니다. Google Play 스토어 캐시를 삭제하고(설정 → 앱 → Google Play 스토어 → 캐시 삭제) 기기를 재시작하면 반영 속도를 높일 수 있습니다.
상품에 이전 데이터가 계속 표시됨 기기의 Google Play 스토어 캐시가 오래되었습니다. 기기에서 설정 → 앱 → Google Play 스토어 → 저장용량 → 캐시 삭제로 이동합니다. 그런 다음 Play 스토어를 강제 종료하고 앱을 다시 엽니다.
구매는 성공했지만 Entitlement가 부여되지 않음 RevenueCat에서 Entitlement가 상품에 연결되지 않았습니다. RevenueCat 대시보드 → 상품 카탈로그 → Entitlement에서 Entitlement가 존재하고 상품이 연결되어 있는지 확인합니다. 각 상품은 최소한 하나의 Entitlement에 연결되어야 합니다.
구독 갱신이 감지되지 않음 Google 실시간 개발자 알림이 구성되지 않았습니다. Google 실시간 개발자 알림을 설정해 RevenueCat이 구독 상태 업데이트를 즉시 받을 수 있도록 합니다.
구독을 가져오지 못함(새로운 Play 모델) 기본 플랜이 "이전 버전과 호환"으로 표시되지 않았습니다. Google Play Console에서 구독을 열고 기본 플랜을 클릭합니다. "이전 버전과 호환" 태그가 활성화되어 있는지 확인합니다. 구독당 하나의 기본 플랜만 이전 버전과 호환되어야 합니다. RevenueCat에서는 subscriptionId:basePlanId 형식을 사용합니다. 커뮤니티 토론을 참고하세요.
"이미 이 항목을 보유하고 있습니다" 이전 테스트 구매가 소비되거나 환불되지 않았습니다. 비소비성 상품은 Google Play Console을 통해 구매를 환불하고 취소합니다. RevenueCat 대시보드에서 테스트 사용자를 삭제해 샌드박스 상태를 정리합니다. 소비성 상품은 SDK가 구매를 올바르게 소비하도록 합니다. 커뮤니티 토론을 참고하세요.
"요청한 항목을 구매할 수 없습니다" 앱이 flutter run으로 로컬에서 실행되었거나 사이드로드되었습니다. 서명된 앱을 Google Play 테스트 트랙에 업로드하고 승인받습니다. 테스터는 참여 링크를 통해 설치해야 합니다. Play 스토어 배포 없이 로컬 디버그 빌드로는 구매를 지원할 수 없습니다. 커뮤니티 토론을 참고하세요.
상품을 가져올 때 SERVICE_UNAVAILABLE 발생 BillingClient 연결이 아직 완료되지 않았습니다. 기기에 Google Play 서비스가 설치되어 있고 최신 상태인지 확인합니다. SDK는 자동으로 재시도합니다. configure() 직후에 Offering을 가져오지 마세요. RevenueCat SDK를 최신 버전으로 업데이트합니다. 커뮤니티 토론을 참고하세요.

Google Play 설정 빠른 체크리스트

이 체크리스트로 Google Play 구성을 확인하세요.

  • ☐ Google Play Console에서 상품이 활성 상태입니다.
  • ☐ Google Play와 RevenueCat 간 상품 ID가 정확히 일치합니다.
  • ☐ 앱이 최소한 내부 테스트 트랙에 게시되었습니다.
  • build.gradle과 RevenueCat의 패키지 이름이 일치합니다.
  • ☐ 서비스 계정을 생성하고 JSON 키를 RevenueCat에 업로드했습니다.
  • ☐ Google Play Console에서 서비스 계정에 올바른 권한이 있습니다.
  • ☐ Google Play Console에 라이선스 테스터를 추가했습니다(설정 → 라이선스 테스트, 앱 수준 테스터가 아님).
  • ☐ 실제 기기에서 올바른 Google 계정으로 테스트하고 있습니다.
  • ☐ Play 스토어 참여 링크를 통해 앱을 설치했습니다(사이드로드 아님).