알림: 2020년 11월 1일까지 앱에서 계정 보류 및 복원 기능을 지원해야 합니다. 또한 명시적으로 선택 해제하지 않는 한 정기 결제 일시중지 및 정기 결제 재개도 기본적으로 사용 설정됩니다. 자세히 알아보기

정기 결제 판매

이 주제에서는 갱신 및 만료와 같은 정기 결제 수명 주기 이벤트를 처리하는 방법을 설명합니다. 또한 프로모션을 제공하고 사용자가 자신의 정기 결제를 관리하도록 허용하는 등의 추가 정기 결제 기능도 설명합니다.

이 주제를 읽기 전에 먼저 앱에서 제품을 판매하고 관리하는 방법에 대한 일반적인 안내를 보려면 앱에 Google Play 결제 라이브러리 통합을 꼭 읽어보세요.

앱의 정기 결제 제품을 구성하지 않았다면 제품 생성 및 구성을 참조하세요.

정기 결제 수명 주기 처리

정기 결제는 전체 수명 주기 동안 다양한 상태 변경을 거칠 수 있으며 앱은 각 변경에 응답해야 합니다. 정기 결제 사용자의 상태를 확인하기 위해 앱은 Google Play 결제 라이브러리의 BillingClient.queryPurchases() 또는 Google Play Developer API의 Purchases.subscriptions:get을 사용하여 쿼리할 수 있습니다.

BillingClient.queryPurchases() Purchases.subscriptions:get
상태 반환됩니까? isAutoRenewing 반환됩니까? expiryTimeMillis paymentState autoRenewing
활성 True 미래 1(결제 수신) True
취소됨 False 미래 1(결제 수신) False
유예 기간 중 True 미래 0(결제 대기 중) True
보류 중 아니요 N/A 과거 0(결제 대기 중) True
일시중지됨 아니요 N/A 과거 1(결제 수신) True
만료됨 아니요 N/A 과거 1(결제 수신) False

앱이 보안 백엔드 서버에 정기 결제 상태를 저장하면 앱은 실시간 개발자 알림을 사용하여 상태가 동기화된 상태로 유지되도록 상태 변경을 수신 대기해야 합니다. 갱신 및 취소와 같이 정기 결제 상태에 영향을 주는 이벤트에 대해 SubscriptionNotification이 전송됩니다. 전체 상태를 파악하고 자체 백엔드 상태를 업데이트하려면 실시간 개발자 알림을 받은 후 개발자 API를 호출해야 합니다. 이러한 알림은 정기 결제 상태가 변경되었음을 알려줄 뿐입니다. 전반적인 정기 결제 상태에 관한 완전한 정보를 제공하지는 않습니다.

앱은 다음 섹션에 설명되어 있는 상태 변경을 처리해야 합니다.

신규 정기 결제

신규 구매 처리를 위한 권장사항을 따르세요. 정기 결제가 구매되면 BillingClient.queryPurchases()에 의해 정기 결제가 반환되고 SUBSCRIPTION_PURCHASED 알림이 전송됩니다. 이 알림을 받으면 앱은 Google Play Developer API를 쿼리하여 최신 정기 결제 상태를 가져와야 합니다. 정기 결제 리소스는 다음과 유사합니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": next_renewal_date,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

갱신

정기 결제가 성공적으로 갱신되면 그 정기 결제는 BillingClient.queryPurchases()에 의해 계속 반환됩니다.

또한 정기 결제가 갱신될 때 SUBSCRIPTION_RENEWED 알림이 전송됩니다. 앱은 사용자에게 여전히 정기 결제 자격이 있는지 확인한 후 Google Play Developer API에서 반환된 정기 결제 리소스에 제공된 새로운 expiryTimeMillis로 정기 결제 상태를 업데이트해야 합니다. 정기 결제 리소스는 다음과 유사합니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": updated_expiration_time,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

만료

정기 결제가 만료되면 그 정기 결제는 BillingClient.queryPurchases()에서 더 이상 반환되지 않으며 사용자는 정기 결제에 액세스할 수 없게 됩니다.

또한 정기 결제가 만료될 때 SUBSCRIPTION_EXPIRED 알림이 전송됩니다. 이 알림을 받으면 앱은 Google Play Developer API를 쿼리하여 최신 정기 결제 상태를 가져와야 합니다. 정기 결제 리소스는 다음과 유사합니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time_in_past,
  "autoRenewing": false,
  ...
  "paymentState": 1  # Payment received
}

취소

사용자는 Play 스토어에서 정기 결제를 자발적으로 취소하거나 계정 보류 상태에서 복구하지 않음으로써 정기 결제가 자동으로 취소되도록 할 수도 있습니다. 사용자가 정기 결제를 취소하더라도 현재 결제 주기가 끝날 때까지는 계속 콘텐츠에 액세스할 수 있습니다. 결제 주기가 끝나면 액세스 권한이 해지됩니다.

정기 결제가 취소되었지만 아직 만료되지 않았다면 BillingClient.queryPurchases()에서 반환됩니다. 정기 결제가 취소되면 SUBSCRIPTION_CANCELLED 알림이 트리거됩니다. 이 알림을 받으면 Google Play Developer API에서 반환된 정기 결제 리소스autoRenewing = false가 포함되며 expiryTimeMillis에는 사용자가 정기 결제에 액세스할 수 없게 되는 날짜가 포함됩니다. expiryTimeMillis가 기한이 지난 과거 상태이면 사용자는 즉시 액세스 자격을 잃게 됩니다. 만료 상태가 아니면 만료 시까지 사용자가 액세스 자격을 유지하게 됩니다. 정기 결제 리소스는 다음과 유사합니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time,
  "autoRenewing": false,
  ...
  "paymentState": 1  # Payment received
  "cancelReason": integer # Reason the subscription was cancelled: user, billing issue, etc.
}

앱은 Google Play Developer API에서 반환된 정기 결제 리소스cancelReason을 보고 정기 결제가 취소된 이유(예: 고객이 취소했거나 결제 문제가 있음)를 확인할 수 있습니다. 사용자가 정기 결제를 취소했다면 앱에서 cancelSurveyResult 필드를 보고 사용자가 정기 결제를 취소한 이유를 확인할 수 있습니다.

앱은 사용자에게 정기 결제가 취소되었음을 알리는 메시지(예: '_somedate에 정기 결제가 만료됩니다.')를 앱에 표시하려고 할 수 있습니다. 또한 앱은 Google Play 스토어로 딥 링크를 설정하여 사용자가 정기 결제를 복원하도록 할 수도 있습니다.

이 메시지를 표시한다면 메시지를 영구적으로 닫을 수 있는 기능도 사용자에게 제공해야 합니다.

특히 수동으로 정기 결제를 취소한 사용자라면 결제가 오래되어 정기 결제가 취소된 경우와 달리 취소 메시지가 달갑지 않을 수 있습니다. 따라서 정기 결제를 수동으로 취소한 사용자에게는 메시지를 알리지 않도록 선택할 수도 있습니다.

해지

앱에서 Purchases.subscriptions:revoke를 사용하여 정기 결제를 해지하거나 구매 지불을 거절하는 등 다양한 이유로 사용자가 정기 결제를 해지할 수 있습니다. 이 상황에서 앱은 즉시 사용자의 액세스 자격을 철회해야 합니다. 해지된 정기 결제는 BillingClient.queryPurchases()에서 더 이상 반환되지 않습니다. 또한 이 상황이 발생하면 SUBSCRIPTION_REVOKED 알림이 전송됩니다. 이 알림을 받으면 Google Play Developer API에서 반환된 정기 결제 리소스autoRenewing = false가 포함되며 expiryTimeMillis에는 사용자가 정기 결제에 액세스할 수 없게 되는 날짜가 포함됩니다. 정기 결제 리소스는 다음과 유사합니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time_in_past,
  "autoRenewing": false,
  ...
  "paymentState": 1  # Payment received
}

계정 보류

계정 보류는 사용자의 결제 방법이 실패하고 관련된 유예 기간이 결제 문제 해결 없이 종료될 때 시작되는 정기 결제 상태입니다. 정기 결제가 계정 보류 상태로 전환되면 콘텐츠 또는 서비스에 대한 액세스를 차단해야 합니다. 계정 보류 기간은 최대 30일 동안 지속됩니다.

계정 보류를 사용 설정하려면 다음 단계를 따르세요.

  1. Google Play Console에 로그인합니다.
  2. 앱을 선택합니다.
  3. 왼쪽 메뉴에서 앱 정보 > 인앱 상품을 선택합니다.
  4. 정기 결제 탭을 선택한 후 정기 결제 설정 섹션을 확장합니다.
  5. 계정 보류 활성화 확인란을 선택합니다.

계정 보류 중에는 정기 결제가 BillingClient.queryPurchases()에 의해 반환되지 않습니다.

계정 보류 중에는 필요에 따라 정기 결제의 취소, 복원 또는 재구매를 처리해야 합니다.

사용자가 계정 보류 상태로 전환되면 실시간 개발자 알림을 활용하여 정기 결제에 대한 액세스가 정지된 이유를 사용자에게 알려야 합니다. 앱 내에서 결제 수단을 수정하고 정기 결제에 대한 액세스 권한을 다시 얻는 방법에 관한 안내가 포함된 메시지를 제공해야 합니다. 사용자가 결제 수단을 수정할 수 있도록 메시지에 Google Play 정기 결제 설정 링크를 포함해야 합니다. 예를 들어 다음과 유사한 메시지를 사용할 수 있습니다.

"There is a problem with your subscription. Click here to go to the
Google Play subscription settings to fix your payment method."

사용자가 앱 외부의 정기 결제 콘텐츠에 액세스할 수 있다면 사용자에게 푸시 알림이나 이메일을 보내 정기 결제가 더 이상 활성 상태가 아님을 알릴 수 있습니다.

고객이 결제 문제를 해결할 수 있었다면 정기 결제가 복원되었을 때 이를 사용자에게 알리는 메시지를 앱에 표시할 수 있습니다. 예를 들어 다음과 유사한 메시지를 사용할 수 있습니다.

"Your form of payment was updated, and your subscription has
been recovered."

실시간 개발자 알림 사용 시 정기 결제가 계정 보류 상태가 되면 SUBSCRIPTION_ON_HOLD 알림을 받습니다. 보안 백엔드 서버에서 Google Play Developer API를 호출하여 새 정기 결제 정보를 검색할 수 있습니다. 계정 보류 중에는 정기 결제 리소스expiryTimeMillis가 기한이 지난 과거 타임스탬프로 설정되고 paymentState0으로 설정됩니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

사용자가 결제 수단을 수정하면 정기 결제가 활성 상태로 돌아갑니다. 그러면 결제한 콘텐츠에 대한 액세스 권한을 복원해야 합니다.

앱이 queryPurchases()만 사용하여 사용자에게 정기 결제 자격이 있는지 확인한다면 앱은 계정 보류에서 복구되는 정기 결제를 자동으로 처리해야 합니다.

앱이 정기 결제 상태를 백엔드와 동기화하면 앱은 정기 결제가 복구될 때 알림을 받을 수 있도록 SUBSCRIPTION_RECOVERED 알림을 수신 대기해야 하며 사용자는 액세스 권한을 다시 얻어야 합니다. 이 알림을 받은 후 정기 결제를 쿼리하면 expiryTimeMillis가 미래의 타임스탬프로 설정되고 paymentState1이 됩니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

계정 보류 기간이 종료되기 전에 사용자가 결제 수단을 수정하지 않으면 SUBSCRIPTION_CANCELLED 실시간 개발자 알림을 받게 됩니다. 취소 처리에 관한 안내는 정기 결제 취소를 참조하세요. 이러한 방식으로 취소된 정기 결제를 쿼리하면 반환된 expiryTimeMillis가 기한이 지난 과거 타임스탬프로 설정되고 cancelReason 값은 1이 됩니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": false,
  ...
  "cancelReason": 1  # The system cancelled the subscription
}

유예 기간

유예 기간이 사용 설정된 경우 결제 주기가 끝날 때 결제 문제가 있다면 정기 결제는 유예 기간으로 전환됩니다. 이 기간에 Google Play에서 정기 결제를 갱신하려고 시도하는 동안 사용자는 여전히 정기 결제 콘텐츠에 액세스할 수 있어야 합니다. Google Play Console의 인앱 상품 설정에서 유예 기간 길이를 지정할 수 있습니다.

앱이 queryPurchases()만 사용하여 사용자에게 정기 결제 자격이 있는지 확인한다면 queryPurchases()가 만료일 전에 취소된 구매를 계속 반환하므로 앱은 유예 기간을 자동으로 처리해야 합니다.

앱이 정기 결제 상태를 백엔드와 동기화하면 앱은 사용자가 유예 기간 상태로 전환될 때 알림을 받을 수 있도록 SUBSCRIPTION_IN_GRACE_PERIOD 실시간 개발자 알림을 수신 대기해야 합니다. 사용자가 유예 기간 상태에 있는 동안 정기 결제 리소스에는 autoRenewing = truepaymentState = 0(즉, 보류 중)이 포함됩니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

사용자가 유예 기간 상태로 전환될 때 사용자에게 결제 수단을 수정하는 방법을 알리는 메시지를 앱에 표시해야 합니다. 메시지를 표시하지 않으면 유예 기간이 종료되었을 때 사용자가 정기 결제 액세스 권한을 잃게 됩니다. 사용자가 정기 결제를 관리하는 데 도움이 되도록 이 메시지를 Google Play 스토어로 딥 링크 설정할 수 있습니다.

사용자가 결제 수단을 수정하는 즉시 정기 결제가 갱신되고 갱신에 설명된 대로 앱이 갱신을 처리할 수 있습니다.

사용자가 유예 기간 동안에 결제 수단을 수정하지 않으면 정기 결제는 계정 보류 상태가 됩니다(사용 설정된 경우). 그러지 않으면 정기 결제가 취소됩니다.

일시중지된 정기 결제

사용자가 정기 결제를 일시중지할 수 있도록 하여 자발적 앱 제거를 방지할 수 있습니다. 일시중지 기능을 사용하도록 설정하면 사용자가 반복 기간에 따라 1주일에서 3개월 사이에 일정 기간 정기 결제를 일시중지하도록 선택할 수 있습니다. 일시중지 옵션을 사용 설정하면 일시중지 옵션이 정기 결제 센터와 취소 흐름 모두에 표시됩니다. 연간 정기 결제는 일시중지할 수 없으며, 1주일 및 3개월의 일시중지 한도는 언제든지 변경될 수 있습니다.

사용자가 정기 결제를 일시중지할 수 있게 하려면 다음 단계를 따르세요.

  1. Google Play Console에 로그인합니다.
  2. 앱을 선택한 후 앱 정보 > 인앱 상품 > 정기 결제로 이동합니다.
  3. 정기 결제 설정 섹션을 펼칩니다.
  4. 일시중지 허용을 선택합니다.

정기 결제 일시중지는 현재 결제 기간이 종료된 이후에만 적용됩니다. 정기 결제가 일시중지된 동안에는 사용자가 정기 결제에 액세스할 수 없습니다. 일시중지 기간이 끝나면 정기 결제가 재개되고 Google에서 정기 결제 갱신을 시도합니다. 재개가 완료되면 정기 결제가 다시 활성화됩니다. 결제 문제로 인해 정기 결제가 재개되지 않으면 그림 1과 같이 사용자가 계정 보류 상태로 전환됩니다.

정기 결제가 일시중지된 후 사용자가 계정 보류 상태로 전환됩니다.
그림 1. 정기 결제가 일시중지된 후 사용자가 계정 보류 상태로 전환됩니다.

또한 사용자는 그림 2와 같이 일시중지 기간에 언제든지 수동으로 정기 결제를 재개하도록 선택할 수 있습니다. 사용자가 정기 결제를 수동으로 재개하면 결제일이 수동 재개 날짜로 변경됩니다.

사용자가 정기 결제를 일시중지한 후 재개합니다.
그림 2. 사용자가 정기 결제를 일시중지한 후 재개합니다.

사용자의 정기 결제가 일시중지되면 그 정기 결제는 queryPurchases()에 의해 반환되지 않습니다. 정기 결제가 재개되면 그 정기 결제는 queryPurchases()에 의해 반환됩니다.

앱이 정기 결제 상태를 보안 백엔드 서버와 동기화하면 앱은 실시간 개발자 알림을 수신 대기하여 상태를 유지해야 합니다. 이러한 알림을 통해 앱의 사용자에게 정기 결제가 일시중지되었으며 정기 결제 액세스 권한이 없음을 알릴 수 있습니다. 또한 Google Play로 연결되는 딥 링크를 사용하여 정기 결제를 수동으로 재개하는 방법을 사용자에게 제공해야 합니다.

사용자가 정기 결제 일시중지를 시작하면 SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED 실시간 개발자 알림이 전송됩니다. 이 시점에 사용자는 정기 결제에 계속 액세스할 수 있어야 하며 정기 결제 리소스에는 autoRenewing = true, paymentState = 1(결제 수신) 그리고 expiryTimeMillisautoResumeTimeMillis의 미래 값이 포함됩니다.

일시중지가 적용되면 SUBSCRIPTION_PAUSED 실시간 개발자 알림이 전송됩니다. 이 시점에 사용자는 정기 결제에 계속 액세스할 수 있어야 하며 정기 결제 리소스에는 autoRenewing = true, paymentState = 0(보류 중), autoResumeTimeMillis의 미래 값 및 expiryTimeMillis의 과거 값이 포함됩니다.

일시중지 기간이 끝날 때 정기 결제가 자동으로 재개되거나 사용자가 수동으로 정기 결제를 재개하도록 선택하면 SUBSCRIPTION_RENEWED 실시간 개발자 알림이 전송됩니다. 이는 갱신에 설명된 대로 처리해야 합니다.

정기 결제 재개를 시도하는 동안 결제 실패가 발생하면 SUBSCRIPTION_ON_HOLD 실시간 개발자 알림이 전송됩니다. 이는 계정 보류 섹션에 설명된 대로 처리해야 합니다.

복원

취소된 정기 결제는 만료일까지 Play 스토어 앱에 계속 표시됩니다. 사용자는 Google Play 스토어 앱의 정기 결제 섹션에서 정기 결제 재개(이전의 복원)를 클릭하여 취소된 정기 결제를 만료되기 전에 복원할 수 있습니다.

취소된 정기 결제와 정기 결제 재개 버튼이 표시된 Google Play 스토어 앱의 정기 결제 섹션
그림 3. 취소된 정기 결제와 정기 결제 재개 버튼이 표시된 Google Play 스토어 앱의 계정 > 정기 결제 섹션입니다.

앱이 queryPurchases()만 사용하여 사용자에게 정기 결제 자격이 있는지 확인한다면 queryPurchases()가 만료일 전에 취소된 구매를 계속 반환하므로 앱은 복원을 자동으로 처리해야 합니다. 복원된 정기 결제는 취소되지 않았던 것처럼 계속 갱신됩니다.

앱이 정기 결제 상태를 백엔드와 동기화하면 앱은 SUBSCRIPTION_RESTARTED 실시간 개발자 알림을 수신 대기해야 합니다. 알림을 수신하면 앱은 알림에 응답하고, 정기 결제가 이제 갱신되도록 설정되었음을 기록하며, 앱에 복원 메시지 표시를 중지할 수 있습니다. 정기 결제 리소스는 다음과 유사합니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

업그레이드, 다운그레이드 및 재가입

사용자가 업그레이드 또는 다운그레이드하거나 정기 결제를 다시 신청할 때 이전 정기 결제는 무효화되고 새 정기 결제가 새 구매 토큰과 함께 생성됩니다.

또한 Google Play Developer API에서 반환된 정기 결제 리소스에는 사용자가 업그레이드 또는 다운그레이드하거나 정기 결제를 다시 신청한 이전 구매를 나타내는 linkedPurchaseToken이 포함됩니다. linkedPurchaseToken을 사용하면 이전 정기 결제를 조회하고 기존 사용자 계정을 식별하여 새 구매를 동일한 계정과 연결할 수 있습니다. 또한 Google Play Developer API를 사용하여 구매를 확인함으로써 사용자 마찰을 줄이는 것이 좋습니다. 정기 결제 리소스는 다음과 유사합니다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": next_renewal_date,
  "autoRenewing": true,
  "linkedPurchaseToken": old_purchase_token
  ...
  "paymentState": 1  # Payment received
}

개발자는 고객이 정기 결제를 쉽게 관리할 수 있도록 해야 합니다. 사용자가 정기 결제를 관리할 수 있는 링크를 앱의 설정 또는 환경설정 화면에 포함해야 합니다. 이 링크의 예는 그림 4에 나와 있습니다.

이 이미지의 Google Play 정기 결제 버튼은 '정기 결제 관리' 링크의 예입니다.
그림 4. Google Play 정기 결제 버튼은 '정기 결제 관리' 링크의 예입니다.

사용자가 앱의 만료되지 않은 정기 결제를 보유하고 있는지 확인하는 로직을 이 링크의 클릭 핸들러에 추가합니다. 여기에서 expiryTimeMillis가 미래 시점이거나 autoRenewingtrue로 설정됩니다.

각 정기 결제의 SKU는 Play Console에서 생성 시에 할당한 제품 ID와 일치합니다. 프로그래매틱 방식으로 기존 정기 결제의 SKU를 확인하려면 앱의 백엔드에 특정 사용자와 관련된 정기 결제 목록을 쿼리합니다.

사용자에게 만료되지 않은 정기 결제가 있다면 'your-sub-product-id' 및 'your-app-package'를 정기 결제 ID 및 앱 패키지 정보로 바꿈으로써 다음과 유사한 URL로 사용자를 안내할 수 있습니다.

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

사용자에게 앱 내에 만료되지 않은 정기 결제가 없다면 다음 URL을 사용하여 그림 5 및 6과 같이 다른 모든 정기 결제를 표시하는 페이지로 사용자를 안내합니다.

https://play.google.com/store/account/subscriptions
Play 스토어 정기 결제 화면에는 사용자의 모든 정기 결제 상태가 표시됩니다.
그림 5. Play 스토어 정기 결제 화면에는 사용자의 모든 정기 결제 상태가 표시됩니다.
추가 세부정보를 보려면 정기 결제를 탭합니다.
그림 6. 추가 세부정보를 보려면 정기 결제를 탭합니다.

Classy Taxi 샘플 앱에서 정기 결제 링크 로직의 코드 예를 확인할 수 있습니다.

사용자가 정기 결제를 업그레이드, 다운그레이드 또는 변경할 수 있도록 허용

기본 등급 및 프리미엄 등급과 같은 다양한 정기 결제 등급을 사용자에게 제공할 수 있습니다. 그림 7은 두 개의 정기 결제 등급을 제공하는 화면을 보여줍니다.

이 앱에는 두 개의 정기 결제 등급이 포함되어 있습니다.
그림 7. 이 앱에는 두 개의 정기 결제 등급이 있습니다.

사용자가 정기 결제를 업그레이드하거나 다운그레이드하려면 그림 7과 유사한 화면에 액세스할 수 있어야 합니다. 정기 결제 업그레이드 또는 다운그레이드 시 비례 배분 모드를 설정하거나 변경사항이 정기 결제 사용자에게 영향을 주는 방식을 설정할 수 있습니다. 다음 표에는 사용 가능한 비례 배분 모드가 나와 있습니다.

비례 배분 모드설명
IMMEDIATE_WITH_TIME_PRORATION 정기 결제가 즉시 업그레이드 또는 다운그레이드됩니다. 남은 시간은 가격 차이를 기반으로 조정되며 다음 결제일을 앞당겨 새 정기 결제에 적립됩니다. 이 모드가 기본 동작입니다.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE 정기 결제가 즉시 업그레이드되며 결제 주기는 동일하게 유지됩니다. 남은 기간의 가격 차이는 사용자에게 청구됩니다.
IMMEDIATE_WITHOUT_PRORATION 정기 결제가 즉시 업그레이드 또는 다운그레이드되며 정기 결제가 갱신되면 새 가격이 청구됩니다. 결제 주기는 동일하게 유지됩니다.
DEFERRED 정기 결제가 갱신될 때만 업그레이드 또는 다운그레이드됩니다.

비례 배분 예

각 비례 배분 모드의 작동 방식을 이해하려면 다음 시나리오를 생각해 보세요.

샘와이즈는 Country Gardener 앱에서 온라인 콘텐츠를 정기적으로 결제하고 있습니다. 그리고 현재 텍스트 전용 콘텐츠의 Tier 1 버전을 매월 정기 결제하고 있습니다. 이 정기 결제는 월 2달러의 요금이 청구되며 매월 1일에 갱신됩니다.

4월 15일에 샘와이즈는 동영상 업데이트가 포함되며 요금이 연 36달러인 연간 버전의 Tier 2 정기 결제로 업그레이드하기로 했습니다.

정기 결제를 업그레이드할 때 개발자는 비례 배분 모드를 선택합니다. 다음 목록에서는 각 비례 배분 모드가 샘와이즈의 정기 결제에 영향을 주는 방식을 설명합니다.

IMMEDIATE_WITH_TIME_PRORATION
샘와이즈의 Tier 1 정기 결제가 즉시 종료됩니다. 그는 한 달(4월 1일~30일) 요금을 결제했는데 정기 결제 기간 중간에 업그레이드했으므로 월간 정기 결제 요금의 절반(1달러)은 새 정기 결제에 적용됩니다. 그러나 새 정기 결제 요금은 연간 36달러이므로 1달러의 잔액은 10일(4월 16일~25일)에 대해서만 결제됩니다. 따라서 4월 26일에 새 정기 결제의 요금으로 36달러가 청구되며, 다음 해부터 매년 4월 26일에 36달러가 청구됩니다.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE
시간 단위당 Tier 2 정기 결제 가격($36/년 = $3/월)이 시간 단위당 Tier 1 정기 결제 가격($2/월)보다 크므로 이 모드를 사용할 수 있습니다. 샘와이즈의 Tier 1 정기 결제는 즉시 종료됩니다. 그는 한 달 전체 요금을 결제했는데 기간의 절반만 사용했으므로 월간 정기 결제 요금의 절반(1달러)은 새 정기 결제에 적용됩니다. 그러나 새 정기 결제 요금은 1년에 36달러이므로 나머지 15일의 요금은 1.50달러입니다. 따라서 새 정기 결제 요금으로 0.50달러의 차액이 청구되며 5월 1일에 35.50의 추가 요금이 청구됩니다. 그 후에 샘와이즈에게 다음 해부터 매년 36달러가 청구됩니다.
IMMEDIATE_WITHOUT_PRORATION
샘와이즈의 Tier 1 정기 결제가 추가 비용 없이 Tier 2로 즉시 업그레이드됩니다. 그리고 5월 1일에 새 정기 결제 등급 요금으로 36달러가 청구되며, 다음 해부터 매년 5월 1일에 36달러가 청구됩니다.
DEFERRED
샘와이즈의 Tier 1 정기 결제는 4월 30일에 만료될 때까지 계속됩니다. 5월 1일에 Tier 2 정기 결제가 적용되며, 새 정기 결제 등급 요금으로 샘와이즈에게 36달러가 청구됩니다.

비례 배분 모드 선택 시 비례 배분 권장사항을 검토하세요.

앱은 구매 흐름 시작과 동일한 단계를 사용하여 사용자에게 업그레이드 또는 다운그레이드를 제공할 수 있습니다. 그러나 업그레이드 또는 다운그레이드할 때 다음 예와 같이 현재 정기 결제, 향후(업그레이드 또는 다운그레이드된) 정기 결제 및 사용할 비례 배분 모드에 관한 세부정보를 제공해야 합니다.

Kotlin

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync()
val flowParams = BillingFlowParams.newBuilder()
        .setOldSku(previousSku, purchaseTokenOfOriginalSubscription)
        .setReplaceSkusProrationMode(desiredProrationMode)
        .setSkuDetails(upgradeOrDowngradeSkuDetails)
        .build();
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

자바

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync()
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setOldSku(previousSku, purchaseTokenOfOriginalSubscription)
        .setReplaceSkusProrationMode(desiredProrationMode)
        .setSkuDetails(upgradeOrDowngradeSkuDetails)
        .build();
int responseCode = billingClient.launchBillingFlow(billingFlowParams);

즉시 대체 비례 배분 모드의 경우 앱은 PurchasesUpdatedListener에서 새 구매를 수신합니다. 또한 구매는 BillingClient.queryPurchases()에서도 사용할 수 있습니다. 구매 토큰을 수신할 때는 새 구매 토큰 인증 시와 동일한 인증 프로세스를 따릅니다. Google Play 결제 라이브러리의 BillingClient.acknowledgePurchase() 또는 Google Play Developer API의 Purchases.subscriptions:acknowledge를 사용하여 이러한 구매를 확인해야 합니다.

Google Play Developer API는 정기 결제 리소스에서 linkedPurchaseToken을 반환합니다. linkedPurchaseToken에서 제공된 토큰을 무효화하여, 서비스 액세스 권한을 얻는 데 이전 토큰이 사용되지 않도록 해야 합니다. 업그레이드 및 다운그레이드 구매 처리에 관한 자세한 내용은 linkedPurchaseToken을 사용하여 정기 결제 업그레이드, 다운그레이드 및 재가입 처리를 참조하세요.

지연된 대체 모드의 경우 앱은 빈 구매 목록 및 업그레이드 또는 다운그레이드 성공 여부 상태와 함께 PurchasesUpdatedListener 호출을 수신합니다. 대체가 적용될 때까지 BillingClient.queryPurchases()는 원래 정기 결제 요금제의 구매를 계속 반환합니다. 새 요금제가 적용되면 queryPurchases()는 새로운 정기 결제의 구매 데이터를 반환하고 SUBSCRIPTION_RENEWED 알림이 보안 백엔드 서버로 전송됩니다. 지연된 대체의 경우 이 알림을 수신 대기하고 Purchases.subscriptions:acknowledge를 사용하여 구매를 확인하는 것이 좋습니다. 정기 결제 리소스의 linkedPurchaseToken을 사용하면 정기 결제 백엔드에서(해당하는 경우) 새 자격으로 업데이트해야 할 사용자를 결정할 수 있습니다. 사용자가 요금제 변경이 적용된 후 3일 이내에 앱을 열지 않을 수 있으므로 앱은 사용자가 앱을 열고 BillingClient.acknowledgePurchase()를 통해 확인하는 것에 의존해서는 안 됩니다.

무료 체험판 또는 신규 할인 가격 혜택으로 업그레이드

무료 체험판 자격요건 설정은 사용자가 업그레이드 또는 다운그레이드할 때 적용됩니다. Google Play Console에서 무료 체험판 자격요건 설정을 조정할 수 있습니다.

다음 내용을 참고하세요.

  • 사용자가 앱에서 사용 가능한 모든 정기 결제와 관련하여 하나의 무료 체험판만 받을 수 있다면 사용자가 변경하려는 요금제에는 무료 체험판 또는 신규 할인 가격 혜택이 적용될 수 없습니다.
  • 정기 결제 제품당 하나의 무료 체험판을 제공한다면 사용자가 변경하려는 요금제에는 무료 체험판 또는 신규 할인 가격 혜택이 적용될 수 있습니다.

다음 표에서는 새 요금제와 이전 요금제에 모두 무료 체험판 혜택이 있으며 사용자가 무료 체험판 기간에 업그레이드할 때 각 비례 배분 모드의 동작을 설명합니다.

앱당 무료 체험판 1개 정기 결제 제품당 무료 체험판 1개
IMMEDIATE_WITH_TIME_PRORATION 사용자는 무료 체험판 혜택을 즉시 잃게 됩니다. 남은 무료 체험판 이용 기간은 가격 차이에 따라 새 등급의 동등한 무료 기간으로 전환됩니다. 사용자가 이전 무료 체험판 혜택을 잃게 되지만 새 무료 체험판 혜택을 즉시 시작합니다. 또한 이전 등급의 남은 무료 체험판 이용 기간은 새 등급의 동등한 무료 기간으로 전환되며 새로운 무료 체험판에 추가됩니다.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE

사용자는 무료 체험판 혜택을 즉시 잃게 됩니다. 남은 기간의 가격 차이는 사용자에게 청구됩니다. 다음 결제일은 변경되지 않고 유지됩니다.

참고: 이 옵션은 시간 단위당 가격이 상승하는 정기 결제 업그레이드에만 사용할 수 있습니다.

IMMEDIATE_WITHOUT_PRORATION 사용자가 새 등급으로 즉시 업그레이드됩니다. 사용자는 이전 결제 기간이 종료될 때까지 새 등급에 대한 무료 체험판 액세스 권한을 유지합니다.
DEFERRED 사용자는 다음 결제일까지 이전 정기 결제에 대한 무료 체험판 액세스 권한을 유지합니다.

기본적으로 앱당 하나의 무료 체험판이 적용되는 경우 무료 체험판 전환이 작동하는 방식을 이해하려면 다음 시나리오를 생각해 보세요.

마리아는 Country Gardener 앱에서 온라인 콘텐츠를 정기적으로 결제하고 있습니다. 그리고 현재 텍스트 전용 콘텐츠의 Tier 1 버전을 매월 정기 결제하고 있습니다. 이 정기 결제 요금은 월 10달러이며, 그녀는 4월 1일에 정기 결제를 시작했습니다. 그녀는 정기 결제를 처음 시작한 사용자로 30일 무료 체험판 혜택을 누리고 있으며 이는 첫 번째 결제가 5월 1일로 예정되어 있음을 의미합니다.

4월 15일에 마리아는 동영상 업데이트가 포함되며 요금이 월 20달러Tier 2 정기 결제로 업그레이드하기로 했습니다. 이 두 번째 정기 결제에도 30일 무료 체험판 혜택이 있습니다.

다음 목록은 각 비례 배분 모드의 무료 체험판 전환 방식을 설명합니다.

  • IMMEDIATE_WITH_TIME_PRORATION - 마리아는 Tier 2로 즉시 업그레이드됩니다. 마리아가 정기 결제 기간 중간에 업그레이드했으므로 월간 정기 결제 요금의 절반(월 10달러의 요금에서 15일분)은 새 정기 결제에 적용됩니다. 그러나 새 정기 결제 요금은 월 20달러이므로 15일의 잔액으로는 7.5일분만 결제할 수 있습니다. 마리아는 Tier 2에 대한 또 다른 무료 체험판을 사용할 수 없으므로 4월 22일부터 매월 20달러가 청구됩니다.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE - 시간 단위당 Tier 2 정기 결제 가격($20/월)이 시간 단위당 Tier 1 정기 결제 가격($10/월)보다 크므로 이 모드를 사용할 수 있습니다. 마리아의 Tier 1 정기 결제가 Tier 2로 즉시 업그레이드되며, 마리아는 무료 체험판 혜택을 잃게 됩니다. 마리아의 다음 결제일이 5월 1일이었으므로 4월 하반기의 요금으로 10달러가 오늘 청구되며, 이후 5월 1일부터 매월 20달러가 청구됩니다.
  • IMMEDIATE_WITHOUT_PRORATION - 마리아의 Tier 1 정기 결제가 Tier 2로 즉시 업그레이드됩니다. 마리아는 4월 30일까지 무료 체험판 혜택을 유지하며 이제 Tier 2 콘텐츠에 액세스할 수 있습니다. 5월 1일부터 매월 20달러가 청구됩니다.
  • DEFERRED - 마리아의 Tier 1 정기 결제는 다음 결제일인 5월 1일이 될 때까지 계속됩니다. 5월 1일에 Tier 2 정기 결제가 적용되며, 매월 1일에 마리아에게 20달러가 청구됩니다.

다음 목록은 개발자가 정기 결제당 하나의 무료 체험판을 허용하는 경우의 전환 동작을 설명합니다.

  • IMMEDIATE_WITH_TIME_PRORATION - 마리아는 Tier 2로 즉시 업그레이드됩니다. 마리아가 정기 결제 기간 중간에 업그레이드했으므로 월간 정기 결제 요금의 절반(월 10달러의 요금에서 15일분)은 새 정기 결제에 적용됩니다. 그러나 새 정기 결제 요금은 월 20달러이므로 15일의 잔액으로는 7.5일분만 결제할 수 있습니다. 마리아는 Tier 2에 대한 또 다른 무료 체험판을 사용할 수 있으므로 37.5일 동안에는 요금이 청구되지 않습니다. 5월 22일부터 매월 20달러가 청구됩니다.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE - 시간 단위당 Tier 2 정기 결제 가격($20/월)이 시간 단위당 Tier 1 정기 결제 가격($10/월)보다 크므로 이 모드를 사용할 수 있습니다. 마리아의 Tier 1 정기 결제가 Tier 2로 즉시 업그레이드되며, 마리아는 무료 체험판 혜택을 잃게 됩니다. 마리아의 다음 결제일이 5월 1일이었으므로 4월 하반기의 요금으로 10달러가 오늘 청구되며, 이후 5월 1일부터 매월 20달러가 청구됩니다.
  • IMMEDIATE_WITHOUT_PRORATION - 마리아의 Tier 1 정기 결제가 Tier 2로 즉시 업그레이드됩니다. 마리아는 4월 30일까지 무료 체험판 혜택을 유지하며 이제 *에 액세스할 수 있습니다.
  • DEFERRED - 마리아의 Tier 1 정기 결제는 다음 결제일인 5월 1일이 될 때까지 계속됩니다. 5월 1일에 Tier 2 정기 결제가 적용되며, 매월 1일에 마리아에게 20달러가 청구됩니다.

비례 배분 권장사항

다음 표는 다양한 비례 배분 시나리오와 함께 각 시나리오에 권장되는 사항을 보여줍니다.

시나리오 권장 비례 배분 모드 결과
비용이 더 많이 드는 등급으로 업그레이드 IMMEDIATE_AND_CHARGE_PRORATED_PRICE 사용자는 동일한 결제 기간을 유지하면서 즉시 액세스 권한을 받습니다.
비용이 더 적게 드는 등급으로 다운그레이드 DEFERRED 사용자는 비용이 더 많이 드는 등급에 대해 이미 결제했으므로 다음 결제일까지 액세스 권한을 유지합니다.
동일한 등급의 반복 기간 변경(예: 월간에서 연간으로) DEFERRED 사용자는 다음 결제일에 새로운 반복 가격을 지급합니다.
무료 체험판 사용 중 업그레이드하고, 무료 체험판 유지 IMMEDIATE_WITHOUT_PRORATION 사용자는 무료 체험판 액세스 권한을 유지하지만 남은 무료 체험판 기간에 대해 더 높은 등급으로 업그레이드합니다.
무료 체험판 사용 중 업그레이드 - 무료 체험판 액세스 종료 IMMEDIATE_AND_CHARGE_PRORATED_PRICE 사용자는 새 등급에 즉시 액세스할 수 있지만 무료 체험판을 더 이상 사용할 수 없습니다.

앱을 제거한 사용자 재확보

사용자가 정기 결제를 취소한 후 개발자는 앱에서 또는 Play 스토어를 통해 사용자를 재확보할 수 있습니다. 다음 표에서는 다양한 정기 결제 시나리오와 함께 관련 사용자 재확보 작업 및 앱 요구사항을 설명합니다.

정기 결제 만료 전 정기 결제 만료 후
앱 내에서 Play 스토어 내에서 앱 내에서 Play 스토어 내에서
재확보 특징 인앱 정기 결제 복원 인앱 정기 결제 정기 결제 재개
사용자가 결제 흐름을 거치는지 여부 아니요
사용자의 정기 결제가 동일한 SKU와 연결된 상태로 유지되는지 여부 사용자가 동일 SKU 또는 다른 SKU에 가입할 수 있음 사용자가 동일 SKU 또는 다른 SKU에 가입할 수 있음
새 구매 토큰 생성 여부 아니요
기본적으로 사용 설정되는지 여부 아니요 예, 모든 개발자에게 필요한 지원 아니요

결제 라이브러리 2.0 이상이 없는 앱: 아니요

결제 라이브러리 2.0 이상이 있는 앱: 예, 개발자는 콘솔에서 선택 해제할 수 있음

사용자에게 청구되는 시점

동일한 SKU를 사용하는 경우: 현재 결제 기간 종료 시

다른 SKU를 사용하는 경우: 비례 배분 모드에 따라 다름

현재 결제 기간 종료 시 즉시 즉시
필요한 구현 앱 내 재가입 UI 제공

정기 결제 상태 변경 감지

Play 스토어 딥 링크

앱 내 재가입 UI 제공 앱 외부 구매 처리

정기 결제 만료 전 - 앱 내에서

취소되었지만 아직 만료되지 않은 정기 결제의 경우 새 정기 결제 사용자와 동일한 인앱 상품 구매 흐름을 적용함으로써 정기 결제 사용자가 앱 내에서 정기 결제를 복원하도록 할 수 있습니다. UI가 사용자에게 기존 정기 결제가 있다는 점을 반영하는지 확인합니다. 예를 들어 재활성화 버튼을 사용하여 사용자의 현재 만료일 및 반복 가격을 표시할 수 있습니다.

일반적으로 개발자는 다음과 같이 사용자가 이미 정기 결제한 SKU 및 동일한 가격을 사용자에게 제공하려고 합니다.

  • 동일한 SKU를 사용하여 새 정기 결제 구매를 시작합니다.
  • 새 정기 결제는 이전 정기 결제를 대체하고 동일한 만료일에 갱신됩니다. 이전 정기 결제는 즉시 만료된 것으로 표시됩니다.
  • 예를 들어 아킬레스가 Example Music App을 정기 결제하고 있으며, 이 정기 결제는 8월 1일에 만료될 예정이라고 가정해 보겠습니다. 7월 10일에 그는 1개월 정기 결제를 동일한 월별 가격으로 다시 결제합니다. 그러면 새 정기 결제는 나머지 잔액으로 비례 배분되고, 즉시 활성화되며, 여전히 8월 1일에 갱신됩니다.

새로운 무료 체험판 또는 재확보 할인과 같은 다른 가격을 제공하려는 경우 다음과 같이 사용자에게 다른 SKU를 대신 제공하면 됩니다.

  • 비례 배분 모드 IMMEDIATE_WITHOUT_PRORATION을 사용하여 다른 SKU로 업그레이드 또는 다운그레이드를 시작합니다.
  • 새 정기 결제는 이전 정기 결제를 대체하고 동일한 만료일에 갱신됩니다. 원래 만료일에 신규 할인 가격을 포함한 새 SKU 가격이 사용자에게 청구됩니다.
  • 예를 들어 아킬레스가 Example Music App을 정기 결제하고 있으며, 이 정기 결제는 8월 1일에 만료될 예정이라고 가정해 보겠습니다. 7월 10일에 그는 연간 정기 결제를 신규 할인 가격으로 다시 결제합니다. 새 정기 결제가 즉시 활성화되며, 8월 1일에 신규 할인 가격이 사용자에게 청구됩니다.
  • winback SKU에 무료 체험판 또는 신규 할인 가격을 포함하기로 했다면 Google Play Console에서 사용자가 앱당 하나의 무료 체험판을 받도록 제한하는 옵션인 앱당 하나의 무료 체험판 허용 확인란을 선택 해제하여 사용자가 적격 대상이 될 수 있도록 합니다.

구매 토큰을 받으면 새 정기 결제에서와 마찬가지로 구매를 처리합니다. 또한 Google Play Developer API는 정기 결제 리소스에서 linkedPurchaseToken을 반환합니다. linkedPurchaseToken에서 제공된 토큰을 무효화하여 서비스 액세스 권한을 얻는 데 이전 토큰이 사용되지 않도록 해야 합니다.

정기 결제 만료 전 - Play 스토어에서

정기 결제가 취소되었지만 아직 활성 상태인 동안 사용자는 정기 결제 재개(이전의 복원)를 클릭하여 Google Play 정기 결제 센터에서 정기 결제를 복원할 수 있습니다. 이렇게 하면 동일한 정기 결제 및 구매 토큰이 유지됩니다.

취소된 정기 결제와 정기 결제 재개 버튼이 표시된 Google Play 스토어 앱의 정기 결제 섹션
그림 8. 취소된 정기 결제와 정기 결제 재개 버튼이 표시된 Google Play 스토어 앱의 계정 > 정기 결제 섹션입니다.

정기 결제 복원에 관한 자세한 내용은 복원을 참고하세요.

정기 결제 만료 후 - 앱 내에서

새 정기 결제 사용자와 동일한 인앱 상품 구매 흐름을 적용함으로써 만료된 정기 결제 사용자가 앱 내에서 정기 결제를 재개하도록 할 수 있습니다. 다음 내용을 참고하세요.

  • 사용자에게 할인을 제공하기 위해 정기 결제에 특별 가격이 적용된 제품 ID(winback SKU라고도 함)를 제공할 수 있습니다. 앱 내에서 쿠폰을 제공하거나 이메일과 같이 앱 외부에서 사용자에게 쿠폰을 알릴 수 있습니다.
  • 정기 결제 재확보를 시작하려면 Google Play 결제 라이브러리를 사용하여 Android 앱에서 구매 흐름을 시작합니다. 이 흐름은 새 정기 결제와 동일한 프로세스이지만, 사용자에게 제공할 SKU를 결정할 수 있습니다.
  • winback SKU에 무료 체험판 또는 신규 할인 가격을 포함하기로 했다면 Google Play Console에서 사용자가 앱당 하나의 무료 체험판을 받도록 제한하는 옵션인 앱당 하나의 무료 체험판 허용 확인란을 선택 해제하여 사용자가 적격 대상이 될 수 있도록 합니다.
  • 사용자가 동일한 SKU로 정기 결제를 재개하면 더 이상 무료 체험판 또는 신규 할인 가격을 사용할 수 없습니다. UI에 이 사항이 반영되었는지 확인합니다.

구매 토큰을 받으면 새 정기 결제에서와 마찬가지로 구매를 처리합니다. 정기 결제 리소스에서 linkedPurchaseToken을 수신하지 않습니다.

정기 결제 만료 후 - Play 스토어에서

정기 결제 재개를 사용 설정했다면 사용자는 Google Play 정기 결제 센터에서 정기 결제 재개를 클릭하여 만료 후 최대 1년 동안 동일한 SKU의 정기 결제를 재개할 수 있습니다. 그러면 새 정기 결제 및 구매 토큰이 생성됩니다.

취소된 정기 결제 및 만료된 정기 결제와 정기 결제 재개 버튼 및 삭제 버튼이 표시된 Google Play 스토어 앱의 정기 결제 섹션
그림 9. 취소된 정기 결제 및 만료된 정기 결제와 정기 결제 재개 버튼 및 삭제 버튼이 표시된 Google Play 스토어 앱의 계정 > 정기 결제 섹션입니다.

정기 결제 재개는 앱 외부 구매로 간주되므로 앱 외부에서 이루어진 구매 처리 권장사항을 따라야 합니다.

고객 관리

실시간 개발자 알림을 사용하면 사용자가 취소하기로 결정한 시점을 실시간으로 감지할 수 있습니다. 사용자가 정기 결제를 취소했지만 정기 결제가 만료되기 전이라면 사용자에게 푸시 알림 또는 인앱 메시지를 보내 정기 결제를 재개하도록 요청할 수 있습니다. 자세한 내용은 앱을 제거한 사용자 재확보를 참고하세요.

무료 체험판 및 신규 할인 가격

앱은 무료 체험판 및 신규 할인 가격 혜택을 제공하여 고객이 앱을 사용해 보도록 유도할 수 있습니다.

무료 체험판

사용자가 요금을 결제하기 전에 정기 결제를 사용해 보도록 할 수 있습니다. 무료 체험판은 지정된 기간 동안 실행되며 무료 체험판 사용 기간이 종료되면 자동으로 정식 정기 결제로 전환됩니다. 이렇게 전환된 정기 결제는 일반 정기 결제와 동일한 기간 및 가격을 사용합니다. 어떤 유형의 정기 결제든 무료 체험판을 설정할 수 있습니다.

무료 체험판을 시작하려면 사용자는 Google Play에서 정기 결제를 구매하는 표준 프로세스를 완료해야 합니다. 사용자가 무료 체험판을 사용할 자격이 있다면 무료 체험판 기간 동안 요금이 청구되지 않으며, 정기 결제에 무료 체험판 사용 기간이 포함되어 있다는 내용의 이메일 알림을 받습니다. Google Play에는 $0.00 거래로 기록되며, 무료 체험판 기간 동안 또는 취소 시까지 정기 결제를 구매한 것으로 표시됩니다.

무료 체험판을 시작하기 전에 Google Play는 사용자에게 유효한 결제 수단이 있는지 인증합니다. 일부 사용자에게 이 인증은 결제 수단에 대한 보류 또는 청구로 표시될 수 있습니다. 이 보류 또는 청구는 일시적이며 나중에 취소 또는 환불됩니다.

무료 체험판 기간이 종료되면 사용자의 결제 수단으로 정식 정기 결제 금액이 청구됩니다.

사용자가 무료 체험판 기간에 언제든지 정기 결제를 취소하면 정기 결제는 무료 체험판이 끝날 때까지 활성 상태로 유지되며 무료 체험판 사용 기간이 종료되면 요금이 청구되지 않습니다.

기본적으로 사용자는 앱에서 사용 가능한 모든 정기 결제와 관련하여 하나의 무료 체험판만 받을 수 있습니다. 정기 결제 제품당 하나의 무료 체험판을 제공하려면 Google Play Console에서 해당하는 설정을 변경하면 됩니다.

정기 결제에 무료 체험판을 추가하려면 Google Play 고객센터의 무료 체험판 안내를 참조하세요.

무료 체험판 혜택이 있는 정기 결제의 정기 결제 수명 주기 이벤트는 무료 체험판 혜택이 없는 정기 결제와 동일한 방식으로 작동합니다. 유일한 차이점은 갱신 기간이 일반 정기 결제 갱신 간격과 다를 수 있다는 점입니다.

사용자에게 판매 가능한 제품을 표시할 때 SkuDetails.getFreeTrialPeriod() 메서드를 사용하여 제품에 무료 체험판이 제공됨을 표시할 수 있습니다.

무료 체험판이 있는 정기 결제가 구매되었다면 Google Play Developer API에서 반환된 정기 결제에는 paymentState = 2(무료 체험판)가 있습니다. 정기 결제가 성공적으로 갱신되면 paymentState1(결제 수신)로 전환됩니다.

신규 할인 가격

무료 체험판과 마찬가지로 앱은 사용자에게 앱을 사용해 보도록 유도하는 신규 할인 가격 혜택을 제공할 수 있습니다. 신규 할인 가격 및 사용 설정 방법에 관해 자세히 알아보려면 정기 결제 만들기를 참조하세요.

신규 할인 가격이 적용되는 정기 결제의 정기 결제 수명 주기 이벤트는 신규 할인 가격이 적용되지 않는 정기 결제와 동일한 방식으로 작동합니다. 유일한 차이점은 갱신 기간이 일반 정기 결제 갱신 간격과 다를 수 있다는 것입니다.

사용자에게 판매 가능한 제품을 표시할 때 SkuDetails.getIntroductoryPrice() 및 관련 메서드를 사용하여 정기 결제에 신규 할인 가격 혜택이 제공됨을 사용자에게 표시할 수 있습니다.

정기 결제 프로모션

프로모션 코드를 만들어 기존 정기 결제 SKU에 대한 연장된 무료 체험판을 선택된 사용자에게 제공할 수 있습니다. 자세한 내용은 프로모션 코드를 참고하세요.

취소, 환불 또는 해지

Google Play Developer API를 사용하여 정기 결제를 취소, 환불 또는 해지할 수 있습니다. 이 기능은 Google Play Console에서도 사용할 수 있습니다.

  • 취소: 사용자가 Google Play에서 정기 결제를 취소할 수 있습니다. 또한 사용자가 앱 또는 웹사이트에서 취소할 수 있는 옵션을 제공할 수도 있습니다. 앱은 해지에 설명된 대로 이러한 취소를 처리해야 합니다.
  • 환불: 개발자가 환불할 때 사용자는 정기 결제를 계속 사용할 수 있습니다. 예를 들어 사용자가 제품에 액세스하지 못하게 하는 기술적 오류가 발생했지만 오류가 해결된 경우 환불을 사용할 수 있습니다. 가장 최근 결제 금액을 초과하여 환불하거나 부분 환불을 처리하려면 Google Play Console을 사용해야 합니다.
  • 해지: 개발자가 해지할 때 사용자는 정기 결제 액세스 권한을 즉시 잃게 됩니다. 예를 들어 사용자가 제품에 액세스하지 못하게 하는 기술적 오류가 발생했으며 사용자가 제품을 계속 사용하지 않으려는 경우에 해지를 사용할 수 있습니다. 앱은 해지에 설명된 대로 이러한 취소를 처리해야 합니다.

다음 표에서는 취소, 환불 및 해지의 차이점을 보여줍니다.

갱신 중지 환불 액세스 취소
취소 아니요 아니요
환불 아니요 아니요
해지

정기 결제 사용자의 결제 연기

Google Play Developer API의 Purchases.subscriptions:defer를 사용하여 정기 결제 사용자의 다음 결제일을 연기할 수 있습니다. 연기 기간 동안 사용자는 전체 액세스 권한으로 정기 결제 콘텐츠에 액세스할 수 있지만 요금이 청구되지 않습니다. 정기 결제 갱신일은 새로운 날짜를 반영하여 업데이트됩니다.

결제 연기를 통해 다음을 할 수 있습니다.

  • 영화 구매 1주일 무료 혜택 제공과 같은 특별 이벤트로 사용자에게 무료 액세스 권한을 부여합니다.
  • 서비스 차원으로 고객에게 무료 액세스 권한을 부여합니다.

결제는 API 호출당 최소 하루, 최대 1년까지 연기할 수 있습니다. 결제를 훨씬 더 연기하려면 새 결제일이 도래하기 전에 API를 다시 호출하면 됩니다.

예를 들어 다르시가 Fishing Quarterly 앱의 온라인 콘텐츠를 매월 정기 결제하고 있으며 보통 매월 1일에 1.25파운드가 청구된다고 가정해 보겠습니다. 3월에 그녀는 앱 게시자에 관한 온라인 설문조사에 참여했습니다. 이에 대한 리워드로 게시자는 5월 15일(기존에 예정된 결제일인 4월 1일로부터 6주 후)까지 다음 결제를 연기함으로써 6주간 무료로 콘텐츠를 제공합니다. 4월 또는 5월 초 요금이 청구되지 않지만 다르시는 여전히 콘텐츠에 액세스할 수 있습니다. 5월 15일에는 월 정기 결제 비용으로 정상 요금인 1.25파운드가 청구됩니다. 그녀의 다음 갱신일은 이제 6월 15일입니다.

결제 연기 시 이메일을 통해 또는 앱 내에서 사용자에게 알림을 보내 결제일이 변경되었음을 알릴 수 있습니다.

정기 결제 가격 변경

경고: Google을 통한 구독의 정기 결제 가격을 변경하면 안 됩니다.

Google Play를 사용하면 통화 및 가격을 고려하여 다양한 언어의 많은 사용자에게 전 세계 디지털 제품을 판매할 수 있습니다. 때로 지역 관련 비용이나 통화 변동으로 인해 정기 결제 가격을 변경해야 한다고 결정할 수 있습니다. 기존 가격으로 기존 정기 결제 사용자를 유지하려는 경우 업데이트된 가격으로 새 SKU를 생성하여 신규 정기 결제 사용자에게 제공할 수 있습니다.

사용자가 정기 결제에 가입했을 때 제공한 가격으로 정기 결제 사용자를 계속 지원할 수 없으며 새 가격을 수락하지 않기로 한 사용자의 정기 결제를 모두 취소하려는 경우 필수 가격 변경을 적용할 수 있습니다. 사용자가 새 가격에 동의하지 않으면 정기 결제가 취소됩니다. 동의율을 극대화하고 사용자가 조치를 취하도록 유도하기 위해 앱은 향후 가격 변경에 관한 메시지를 사용자에게 표시해야 합니다. 가격 변경 메시지에 관한 자세한 내용은 가격 변경 알림을 참조하세요.

정기 결제 가격을 변경하려면 다음 단계를 따르세요.

  1. Google Play Console에 로그인합니다.
  2. 가격을 변경하려는 정기 결제가 포함된 앱을 찾습니다.
  3. 앱 정보 > 인앱 상품을 선택한 후 정기 결제 탭을 엽니다.
  4. 그림 10과 같이 변경하려는 가격 옆에 있는 수정 링크를 선택합니다.

    정기 결제 가격 필드 수정
    그림 10. 정기 결제 가격 필드 수정
  5. 새 정기 결제 가격을 입력합니다.

  6. 가격을 변경하면 그림 11과 같이 확인 대화상자가 표시됩니다.

    정기 결제 가격을 수정하면 경고가 표시됩니다.
    그림 11. 정기 결제 가격을 수정하면 경고가 표시됩니다.

    이 대화상자에서는 가격 변경이 신규 정기 결제 사용자 및 기존 정기 결제 사용자에게 영향을 주는 방식을 설명합니다. 다음 내용을 참고하세요.

    • 확인한 후에는 가격 변경을 되돌릴 수 없습니다.
    • Google Play는 확인 후 7일부터 가격 변경을 사용자에게 알리기 시작합니다.
    • 정기 결제 가격을 인상할 때 사용자는 30일 이내에 가격 변경을 승인해야 합니다. 그러지 않으면 정기 결제가 자동으로 취소됩니다.
    • 정기 결제 가격 인하는 다음 갱신일에 기존 정기 결제 사용자에게 자동으로 적용됩니다. 가격 인하 이후 정기 결제하는 사용자는 자동으로 인하된 가격을 적용받습니다.

    계속하려면 적용을 클릭합니다.

  7. 새 정기 결제 가격이 적용되는 시점을 다시 설명하는 확인 대화상자가 나타납니다.

    정기 결제 가격 변경이 적용되는 시점을 보여주는 확인 대화상자
    그림 12. 정기 결제 가격 변경이 적용되는 시점을 보여주는 확인 대화상자입니다.

사용자에게 가격 변경 알리기

가격을 변경할 때마다, 특히 가격을 인상하는 경우 기존 정기 결제 사용자에게 알려야 합니다.

정기 결제 가격 인상 시 Google Play에서 알림을 시작하기 전에 개발자는 7일 이상 기존 정기 결제 사용자에게 가격 변경에 관해 알릴 수 있습니다. Google Play에서 사용자에게 알림을 보낼 때 그림 13과 비슷한 대화상자가 표시됩니다. 이 대화상자에는 이전 가격, 새 가격, 새 가격이 적용되는 날짜가 표시됩니다.

사용자에게 정기 결제 가격 변경을 알리는 일반 대화상자
그림 13. 사용자에게 정기 결제 가격 변경을 알리는 일반 대화상자입니다.

앱에서 다음과 같은 방법으로 이 대화상자를 표시할 수 있습니다.

앱은 정기 결제 리소스priceChange 필드를 확인하여 사용자에게 보류 중인 가격 변경이 있는지 확인할 수 있습니다. 필드가 있으면 이 필드는 정기 결제에 가격 변경이 있음을 나타내고 priceChange.state 필드는 가격 변경이 수락되었는지 또는 아직 미결 상태인지를 나타냅니다.

가격 변경 확인 흐름 시작

앱이 실행될 때 Google Play 가격 변경 대화상자를 표시하려면 BillingClient.launchPriceChangeConfirmationFlow()를 사용합니다.

가격 변경 대화상자를 표시하기 전에 가격 변경의 이유를 설명하는 자체 메시지 또는 대화상자를 제공할 수도 있습니다. 이 유형의 맞춤 메시지를 만들어 표시하면 사용자가 새로운 가격으로 정기 결제를 갱신할 가능성이 더 커집니다.

다음은 가격 변경 확인 흐름을 시작하는 예입니다.

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                if (responseCode == BillingResponseCode.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponseCode.USER_CANCELED) {
                    // User hasn't confirmed the price change and should retain
                    // access until the end of the current billing cycle.
                }
            }
        })

자바

PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                if (responseCode == BillingResponseCode.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponseCode.USER_CANCELED) {
                    // User hasn't confirmed the price change and should retain
                    // access until the end of the current billing cycle.
                }
            }
        });

가격 변경에 관한 사용자 확인 처리

사용자가 정기 결제의 새 가격을 수락하면 정기 결제가 갱신되며 다른 갱신과 마찬가지로 처리될 수 있습니다. 또한 SUBSCRIPTION_PRICE_CHANGE_CONFIRMED 실시간 개발자 알림을 받습니다.

가격 변경 거부 시 처리

이전 정기 결제가 만료될 때까지 사용자가 가격 변경을 수락하지 않으면 사용자의 정기 결제가 취소됩니다. 그리고 SUBSCRIPTION_CANCELED 알림을 받습니다. 이 이벤트는 취소에 설명된 대로 처리할 수 있습니다.

실수로 인한 가격 변경

실수로 정기 결제 가격을 변경했다면 즉시 변경을 취소하세요. 7일 이내에 가격을 되돌리는 한, 실수로 인한 가격 변경 관련 알림이 기존 정기 결제 사용자에게 표시되지 않습니다. 신규 정기 결제 사용자에게는 첫 번째 가격 변경과 복귀 사이의 시간 동안 실수로 인한 변경 가격이 표시될 수 있습니다.

연이은 두 번의 가격 변경

한 번에 하나의 가격 변경만 실행해야 합니다. 테스트 목적의 가격 변경은 권장되지 않습니다.

7일 이내에 정기 결제 가격을 두 번 변경하면 사용자는 최신 가격 변경에만 동의하면 됩니다.

두 가격 변경 간 시차가 7일을 넘으면 가격 변경이 서로 상쇄하지 않습니다. 대신 사용자는 첫 번째 가격 변경에 동의해야 하며 첫 번째 가격으로 한 번의 갱신 주기를 거쳐야 합니다. 갱신 주기가 끝나면 두 번째 가격으로 청구를 시작할 수 있습니다. 그러면 갱신 시 매월 두 번째 가격이 청구됩니다.