일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- mysql
- Android
- Koin
- google play
- rx
- RxKotlin
- Animation
- junit
- Observable
- 인앱결제
- SwiftUI Tutorial
- Kotlin
- GCP
- SWIFTUI
- Reactive
- 테스트 자동화
- MotionLayout
- list
- databinding
- node.js
- MediaSession
- Android 13
- MediaPlayer
- node
- paging
- android13
- mvvm
- PagingLib
- 동영상
- liveData
- Today
- Total
봄날은 갔다. 이제 그 정신으로 공부하자
Google Play 결제 시스템 - 정기 결제 판매 본문
이 글에서는 갱신 및 만료와 같은 정기 결제 수명 주기 이벤트를 처리하는 방법을 설명합니다. 또한 프로모션을 제공하고 사용자가 자신의 정기 결제를 관리하도록 허용하는 등의 추가 정기 결제 기능에 대해서도 설명합니다.
앱의 정기 결제 제품을 구성하지 않았다면 "002 Google Play 결제 시스템 - 준비하기" 문서의 "제품 생성 및 구성" 항목을 참고하세요.
참고 사이트: https://developer.android.com/google/play/billing/subs?hl=ko
정기 결제 수명 주기 처리
정기 결제는 전체 수명 주기 동안 다양한 상태 변경을 거칠 수 있으며 앱은 각 변경에 응답해야 합니다. 정기 결제 사용자의 상태를 확인하기 위해 앱은 Google Play 결제 라이브러리의 BillingClient.queryPurchases() 또는 Google Play Developer API의 Purchases.subscriptions:get을 사용하여 상태를 확인할 수 있습니다.
앱이 보안 백엔드 서버에 정기 결제 상태를 저장하면 앱은 "실시간 개발자 알림"을 사용하여 상태가 동기화된 상태로 유지되도록 상태 변경을 수신 대기해야 합니다.
갱신 및 취소와 같이 정기 결제 상태에 영향을 주는 이벤트에 대해 SubcriptionNotification이 전송됩니다. 전체 상태를 파악하고 자체 백엔드 상태를 업데이트하려면 실시간 개발자 알림을 받은 후 개발자 API를 호출해야 합니다.
이러한 알림은 정기 결제 상태가 변경되었음을 알려줄 뿐입니다. 전반적인 정기 결제 상태에 관한 완전한 정보를 제공하지는 않습니다.
* 참고: API 호출 제한으로 인해, 실시간 개발자 알림을 활용하는 대시 일정한 간격으로 Google Play Developer 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()에서 반환됩니다. 정기 결제가 취소되면 SUBCRIPTION_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 필드를 보고 사용자가 정기 결제를 취소한 이유를 확인할 수 있습니다.
앱은 사용자에게 정기 결제가 취소되었음을 알리는 메시지(예: "2020-10-13, 11:02에 정기 결제가 만료됩니다.")를 앱에 표시하려고 할 수 있습니다. 또한 앱은 Google Play 스토어로 딥 링크를 설정하여 사용자가 정기 결제를 복원하도록 할 수도 있습니다.
이 메시지를 표시한다면 메시지를 영구적으로 닫을 수 있는 기능도 사용자에게 제공해야 합니다.
특히 수동으로 정기 결제를 취소한 사용자라면 결제가 오래되어 정기 결제가 취소된 경우와 달리 취소 메시지가 달갑지 않을 수 있습니다. 따라서 정기 결제를 수동으로 취소한 사용자에게는 메시지를 알리지 않도록 선택할 수도 있습니다.
* 경고: 사용자가 콘텐츠 액세스 자격을 보유하고 있는 동안에는 Google Play에서 정기 결제를 삭제해서는 안됩니다.
사용자에게 액세스 자격이 있는 콘ㅌ네츠를 삭제하면 불이익을 받게 됩니다.
해지
앱에서 Purchases.subcriptions:revoke를 사용하여 정기 결제를 해지하거나 구매 지불을 거절하는 등 다양한 이유로 사용자가 정기 결제를 해지할 수 있습니다. 이 상황에서 앱은 즉시 사용자의 액세스 자격을 철회해야 합니다. 해지된 정기 결제는 BillingClient.queryPurchases()에서 더 이상 반환되지 않습니다. 또한 이 상황이 발생하면 SUBCRIPTION_REVOKED 알림이 전송됩니다. 이 알림을 받으면 Google Play Developer API에서 반환된 정기 결제 리소스에 autoRenewing = false가 포함되며 expiryTimeMillis에는 사용자가 정기 결제에 액세스할 수 없게 되는 날짜가 포함됩니다. 정기 결제 리소스는 아래와 유사합니다.
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": expiry_time_in_past,
"autoRenewing": false,
...
"paymentState": 1 # Payment received
}
계정 보류
* 참고: 2020-11-01일 이후 모든 개발자는 계정 보류를 지원해야 합니다.
계정 보류는 사용자의 결제 방법이 실패하고 관련된 유예 기간이 결제 문제 없이 종료될 때 시작되는 정기 결제 상태 입니다.
정기 결제가 계정 보류 상태로 전환되면 콘텐츠 또는 서비스에 대한 액세스를 차단해야 합니다. 계정 보류 기간은 최대 30일 동안 지속됩니다. 계정 보류를 사용 설정하려면 아래 단계에 따라 수행하면 됩니다.
- Google Play Console에 로그인합니다.
- 앱을 선택합니다.
- 왼쪽 메뉴에서 "앱정보 > 인앱 상품"을 선택 합니다.
- "정기 결제" 탭을 선택한 후 "정기 결제 설정" 항목을 확장합니다.
- "계정 보류 활성화" 확인란을 선택합니다.
계정 보류 중에는 정기 결제가 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." |
실시간 개발자 알림 사용 시 정기 결제가 계정 보류 상태가 되면 SUBCRIPTION_ON_HOLD 알림을 받습니다.
보안 백엔드 서버에서 Google Play Developer API를 호출하여 새 정기 결제 정보를 검색할 수 있습니다.
계정 보류 중에는 정기 결제 리소스의 expiryTimeMillis가 기한이 지난 과거 타임스탬프로 설정되고 paymentState가 0으로 설정됩니다.
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": timestamp_in_past,
"autoRenewing": true,
...
"paymentState": 0 # Payment pending
}
사용자가 결제 수단을 수정하면 정기 결제가 활성 상태로 돌아갑니다. 그러면 결제한 콘텐츠에 대한 액세스 권한을 복원해야 합니다.
앱이 queryPurchases()만 사용하여 사용자에게 정기 결제 자격이 있는지 확인한다면 앱은 계정 보류에서 복구되는 정기 결제를 자동으로 처리해야 합니다. 앱이 정기 결제 상태를 백엔드와 동기화하면 앱은 정기 결제가 복구될 때 알림을 받을 수 있도록 SUBSCRIPTION_RECOVERED 알림을 수신 대기해야 하며 사용자는 액세스 권한을 다시 얻어야 합니다.
이 알림을 받은 후 정기 결제를 쿼리하면 expiryTimeMillis가 미래의 타임스탬프로 설정되고 paymentState는 1이 됩니다.
{
"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 Console에서 SKU의 유예기간을 사용 중지할 수 있습니다.
유예 기간이 사용 설정된 경우 결제 주기가 끝날 때 결제 문제가 있다면 정기 결제는 유예 기간으로 전환됩니다. 이 기간에 Google Play에서
정기 결제를 갱신하려고 시도하느 동안 사용자는 여전히 정기 결제 콘텐츠에 액세스할 수 있어야 합니다.
Google Play Console의 인앱 상품 설정에서 유예 기간 길이를 지정할 수 있습니다.
앱이 queryPurchases()만 사용하여 사용자에게 정기 결제 자격이 있는지 확인한다면 queryPurchases()가 만료일 전에 취소된 구매를
계속 반환하므로 앱은 유예 기간을 자동으로 처리해야 합니다.
앱이 정기 결제 상태를 백엔드와 동기화하면 앱은 사용자가 유예 기간 상태로 전환될 때 알림을 받을 수 있도록 실시간 개발자 알림으로
SUBSCRIPTION_IN_GRACE_PERIOD를 수신 대기해야 합니다. 사용자가 유예기간 상태에 있는 동안 정기 결제 리소스에는
autoRenewing = true 및 paymentState = 0 (보류 중)이 포합됩니다.
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": timestamp_in_future,
"autoRenewing": true,
...
"paymentState": 0 # Payment pending
}
* 참고: Google Play에서는 유예 기간이 만료될 때까지 expiryTimeMillis 값을 공적으로 연장합니다.
사용자가 유예 기간 상태로 전환될 때 사용자에게 결제 수단을 수정하는 방법을 알리는 메시지를 앱에 표시해야 합니다.
메시지를 표시하지 않으면 유예 기간이 종료되었을 때 사용자가 정기 결제 액세스 권한을 잃게 됩니다. 사용자가 정기 결제를
관리하는데 도움이 되도록 이 메시지를 "Google Play 스토어로 딥 링크 설정"할 수 있습니다.
사용자가 결제 수단을 수정하는 즉시 정기 결제가 갱신되고 갱신에 설명된 대로 앱이 갱신을 처리할 수 있습니다.
사용자가 유예 기간동안에 결제 수단을 수정하지 않으면 정기 결제는 계정 보류 상태가 됩니다. 그러지 않으면 정기 결제가 취소 됩니다.
일시중지된 정기 결제
* 참고: 2020-11-01일 이후에는 기본적으로 모든 정기 결제에서 일시중지가 사용 설정됩니다.
Google Play Console에서 일시중지를 사용할 수 있습니다.
사용자가 정기 결제를 일시중지할 수 있도록 하여 자발적 앱 제거를 방지할 수 있습니다. 일시중지 기능을 사용하도록 설정하면
사용자가 반복 기간에 따라 1주일에서 3개월 사이에 일정 기간 정기 결제를 일시중지하도록 선택할 수 있습니다.
일시 중지 옵션을 사용 설정하면 일시중지 옵션이 정기 결제 센터와 취소 흐름 모두에 표시됩니다. 연간 정기 결제는 일시중지할 수
없으며, 1주일 미 3개월의 일시중지 한도는 언제든지 변경될 수 있습니다.
* 중요: 일시중지를 사용 설정하려면 먼저, "계정 보류를 사용 설정"해야 합니다.
사용자가 정기 결제를 일시중지할 수 있게 하려면 다음 단계를 수행해야 합니다.
- Google Play Console에 로그인 합니다.
- 앱을 선택한 후 "앱 정보 > 인앱 상품 > 정기 결제"로 이동합니다.
- "정기 결제 설정" 섹션을 펼칩니다.
- "일시중지 허용"을 선택합니다.
정기 결제 일시중지는 현재 결제 기간이 종료된 이후에만 적용됩니다. 정기 결제가 일시중지된 동안에는 사용자가 정기 결제에 액세스할 수 없습니다. 일시중지 기간이 끝나면 정기 결제가 재개되고 Google에서 정기 결제 갱신을 시도합니다. 재개가 완료되면 정기 결제가 다시 활성화됩니다. 결제 문제로 인해 정기 결제가 재개되지 않으면 아래 그림과 같이 사용자가 계정 보류 상태로 전환됩니다.
사용자는 아래 그림에서와 같이 일시중지 기간에 언제든지 정기 결제를 수동으로 재개하도록 선택할 수 있습니다.
사용자가 정기 결제를 수동으로 재개하면 결제일이 수도 재개 날짜로 변경됩니다.
사용자의 정기 결제가 일시중지되면 그 정기 결제는 queryPurchases()에 의해 반환되지 않습니다.
정기 결제가 재개되면 그 정기 결제는 queryPurchases()에 의해 반환됩니다.
앱이 정기 결제 상태를 보안 백엔드 서버와 동기화하면 앱은 실시간 개발자 알림을 수신 대기하여 상태를 유지해야 합니다.
이러한 알림을 통해 앱의 사용자에게 정기 결제가 일시중지 되었으며 정기 결제 액세스 권한이 없음을 알릴 수 있습니다.
또한 Google Play로 연결되는 딥 링크를 사용하여 정기 결제를 수동으로 재개하는 방법을 사용자에게 제공해야 합니다.
사용자가 정기 결제 일시중지를 시작하면 실시간 개발자 알림으로 SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED가 전송됩니다.
이 시점에 사용자는 정기 결제에 계속 액세스할 수 있어야 하며 정기 결제 리소스에는 autoRenewing = true, paymentState = 1 (결제 수신)
그리고 expiryTimeMillis 및 autoResumeTimeMillis의 미래 값이 포함됩니다.
일시중지가 적용되면 실시간 개발자 알림으로 SUBSCRITION_PAUSED가 전송됩니다. 이 시점에 사용자는 정기 결제에 계속 액세스할 수 있어야 하며
정기 결제 리소스에는 autoRenewing = true, paymentState = 0 (보류 중), autoRTesumeTimeMillis의 미래 값 및 expiryTimeMillis의
과거 값이 포함됩니다.
일시중지 기간이 끝날 때 정기 결제가 자동으로 재개되거나 사용자가 수동으로 정기 결제를 재개하도록 선택하면 실시간 개발자 알림으로
SUBSCRIPTION_RENEWED가 전송됩니다. 이는 위 "갱신" 항목에서 설명된 대로 처리해야 합니다.
정기 결제 재개를 시도하는 동안 결제 실패가 발생하면 실시간 개발자 알림으로 SUBSCRIPTION_ON_HOLD가 전송됩니다.
이는 "계정 보류" 항목에서 설명된 대로 처리해야 합니다.
복원
* 참고: 2020-11-01일 이후 모드 개발자는 정기 결제 복원을 지원해야 합니다.
취소된 정기 결제는 만료일까지 Play 스토어 앱에 계속 표시됩니다. 사용자는 Google Play 스토어 앱의 정기 결제섹션에서 "복원"을 클릭하여 취소된 정기 결제를 만료되기 전에 복원할 수 있습니다.
앱이 queryPurchases()만 사용하여 사용자에게 정기 결제 자격이 있는지 확인한다면 queryPurchases()가 만료일 전에 취소된
구매를 계속 반환하므로 앱은 복원을 자동으로 처리해야 합니다. 복원된 정기 결제는 취소되지 않았던 것처럼 계속 갱신됩니다.
앱이 정기 결제 상태를 백엔드와 동기화하면 앱은 SUBSCRIPTION_RESTARTED 실시간 개발자 알림을 수신 대기해야 합니다.
알림을 수신하면 앱은 알림에 응답하고, 정기 결제가 이제 갱신되도록 설정되었음을 기록하여, 앱에 복원 메시지 표시를 중지할 수 있습니다.
정기 결제 리소스는 아래와 유사합니다.
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": expiry_time_in_future,
"autoRenewing": true,
...
"paymentState": 1 # Payment received
}
* 참고: 복원된 정기 결제는 정기 결제가 취소되었을 때와 동일한 purchaseToken을 시작합니다. 모든 취소 필드가 리소스에서 삭제됩니다.
업그레이드 & 다운그레이드 & 재가입
사용자가 업그레이드 or 다운그레이드하거나 정기 결제를 다시 신청할 때 이전 정기 결제는 무효화되고 새 정기 결제가 새 구매 토큰과 함께 생성됩니다. 또한 Google Play Developer API에서 반환된 정기 결제 리소스에는 사용자가 업그레이드 or 다운그레이드하거나 정기 결제를 다시 신청한 이전 구매를 나타내는 linkedPurchaseToken이 포함됩니다. linkedPurchaseToken을 사용하면 이전 정기 결제를 조회하고 기존 사용자 계정을 식별하여 새 구매를 동일한 계정과 연결할 수 있습니다. 또한 Google Play Developer API를 사용하여 구매를 확인함으로써 사용자 마찰을 줄이는 것이 좋습니다. 정기 결제 리소스는 아래와 유사합니다.
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": next_renewal_date,
"autoRenewing": true,
"linkedPurchaseToken": old_purchase_token
...
"paymentState": 1 # Payment received
}
딥 링크를 사용하여 사용자가 정기 결제를 관리하도록 허용
개발자는 고객이 정기 결제를 쉽게 관리할 수 있도록 해야합니다. 사용자가 정기 결제를 관리할 수 있는 링크를 앱의 설정 또는 환경 설정에 포함해야 합니다. 아래 그림 "Google Play 정기 결제" 버튼은 "정기 결제 관리" 링크의 예 입니다.
사용자가 앱의 만료되지 않은 정기 결제를 보유하고 있는지 확인하는 로직을 이 링크의 클릭 핸들러에 추가합니다.
여기에서 expiryTimeMillis가 미래 시점이거나 autoRenewing이 true로 설정됩니다.
각 정기 결제의 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을 사용하여 아래 그림 두개와 같이 서로 다른 모든 정기 결제를 표시하는 페이지로 사용자를 안내 합니다.
https://play.google.com/store/account/subscriptions |
Play 스토어 정기 결제화면에는 사용자의 모든 정기 결제가 아래와 같이 표시 됩니다.
추가 세부 정보를 보려면 정기 결제 항목을 클릭합니다.
사용자가 정기 결제를 업그레이드 & 다운그레이드 또는 변경할 수 있도록 허용
기본 등급 및 프리미엄 등급과 같은 다양한 정기 결제 등급을 사용자에게 제공할 수 있습니다.
아래 그림은 두 개의 정기 결제 등급을 제공하는 화면을 보여줍니다.
정기 결제를 업그레이드하거나 다운그레이드하려면 사용자는 위 그림과 유사한 화면에 액세스할 수 있어야 합니다.
정기 결제를 업그레이드하거나 다운그레이드할 때 비례 배분 모드를 설정하거나 변경사항이 정기 결제 사용자에게 영향을 주는 방식을
설정할 수 있습니다. 아래 표는 사용 가능한 비례 배분 모드에 대해 설명합니다.
비례 배분 예
각 비례 배분 모드의 작동 방식을 이해하려면 다음 시나리오를 참고하면 됩니다.
샘와이즈는 Country Gardener 앱에서 온라인 콘텐츠를 정기적으로 결제하고 있습니다. 그리고 현재 텍스트 전용 콘텐츠의 "Tier 1" 버전을 매월 정기 결제하고 있습니다.
이 정기 결제는 "월 2달러"의 요금이 청구되며 매월 1일에 갱신됩니다.
4월 15일에 샘와이즈는 동영상 업데이트가 포함된 요금이 "연 36달러"인 연간 버전의 "Tier 2" 정기 결제로 업그레이드하기로 했습니다.
정기 결제를 업그레이드 할 때 개발자는 비례 배분 모드를 선택합니다. 아래 목록에서는 각 비례 배분 모드가 샘와이즈의 정기 결제에 영향을 주는 방식을 설명합니다.
IMMEDIATE_WITH_TIME_PRORATION
샘와이즈의 "Tier 1" 정기 결제가 즉시 종료됩니다. 그는 한 달(4/1 ~ 4/30) 요금을 결제했는데 정기 결제 기간 중간에 업그레이드했으므로 월간 정기 결제 요금의 절반 (1달러)은 새 정기 결제에 적용됩니다. 그러나 새 정기 결제 요금은 연간 36달러이므로 1달러의 잔액은 10일(4/16 ~ 4/25)에 대해서만 결제됩니다. 따라서 4월 26일에 새 정기 결제의 요금이 36달러가 청구되며, 다음 해부터 매년 4월 26 일에 36 달러가 청구됩니다.
IMMEDIATE_AND_CHAGRE_PRORATED_PRICE
시간 단위당 "Tier 2" 정기 결제 가격($36/년 = $3/월)이 시간 단위당 "Tier 1" 정기 결제 가격($2/월)보다 크므로 이 모드를 사용할 수 있습니다. 샘와이즈의 "Tier 1" 정기 결제는 즉시 종료됩니다. 그는 한달 전체 요금을 결제했는데 기간의 절반만 사용했으므로 월간 정기 결제 요금의 절반(1달러)은 새 정기 결제에 적용됩니다. 그러나 새 정기 결제 요금은 1년에 36달러이므로 나머지 15일의 요금은 1.5달러입니다. 따라서 새 정기 결제 요금으로 0.5달러의 차액이 청구되면 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달러가 청구됩니다.
비례 배분 모드 선택 시 아래 "비례 배분 권장사항" 항목을 검토하세요.
앱은 구매 흐름 시작과 동일한 단계를 사용하여 사용자에게 업그레이드 or 다운그레이드를 제공할 수 있습니다. 그러나 업그레이드 or 다운그레이드할 대 다음 예와 같이 현재 정기 결제, 향후(업그레이드 or 다운그레이드된) 정기 결제 및 사용할 비례 배분 모드에 관한 세부정보를 제공해야 합니다.
// 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)
즉시 대체 비례 배분 모드의 경우 앱은 PurchasesUpdatedListener에서 새 구매를 수신합니다. 또한 구매 BillingClient.queryPruchases()에서도 사용할 수 있습니다. 구매 토큰을 수신할 때는 새 구매 토큰 인증 시와 동일한 인증 프로세스를 따릅니다.
Google Play 결제 라이브러리의 BillingClient.acknowledgePurchase() 또는 Google Play Developer API의 Purchases.subscriptions:acknowledge를 사용하여 이러한 구매를 확인해야 합니다.
Google Play Developer API는 정기 결제 시소스에서 linkedPurchaseToken을 반환합니다. linkedPurchaseToken에서 제공된 토큰을 무효화하며, 서비스 액세스 권한을 얻는데 이전 토큰이 사용되지 않도록 해야 합니다. 지연된 대체 모드의 경우 앱은 빈 구매 목록 및 업그레이드 또는 다운그레이드 성공 여부 상태와 함께 PurchasesUpdatedListener 호출을 수신합니다.
대체가 적용될 때까지 BillingClient.queryPurchases()는 원래 정기 결제 요금제의 구매를 계속 반환합니다. 새 요금제가 적용되면
queryPurchases()는 새로운 정기 결제의 구매 데이터를 반환하고 SUBSCRIPTION_RENEWED 알림이 보안 백엔드 서버로 전송됩니다.
지연된 대체의 경우 이 알림을 수신 대기하고 Purchases.subscriptions:acknowledge를 사용하여 구매를 확인하는 것이 좋습니다.
정기 결제 리소스의 linkedPurchaseToken을 사용하면 정기 결제 백엔드에서(해당하는 경우) 새 자격으로 업데이트해야 할 사용자를 결정할 수 있습니다. 사용자가 요금제 변경이 적용된 후 3일 이내에 앱을 열지 않을 수 있으므로 앱은 사용자가 앱을 열고 BillingClient.acknowledgePurchase()를 통해 확인하는 것에 의존해서는 안됩니다.
무료 체험판 또는 신규 할인 가격 혜택으로 업그레이드
무료 체험판 자격 요건 설정은 사용자가 업그레이드 또는 다운그레이드할 때 적용됩니다. Google Play Console에서 무료 체험판 가격 요건 설정을 조정할 수 있습니다.
아래를 내용을 참고하세요.
- 사용자가 앱에서 사용 가능한 모든 정기 결제와 관련하여 하나의 무료 체험판만 받을 수 있다면 사용자가 변경하려는 요금제에는 무료 체험판 또는 신규 할인 가격 혜택이 적용될 수 없습니다.
- 정기 결제 제품당 하나의 무료 체험판을 제공한다면 사용자가 변경하려는 요금제에는 무료 체험판 또는 신규 할인 가격 혜택이 적용될 수 있습니다.
아래 표에서는 새 요금제와 이전 요금제에 모두 무료 체험판 혜택이 있으며 사용자가 무료 체험판 기간에 업그레이드할 때 각 비례 배분 모드의 동작을 설명합니다.
기본적으로 앱당 하나의 무료 체험판이 적용되는 경우 무료 체험판 전환이 작동하는 방식은 다음 시나리오와 같습니다.
마리아는 Country Gardener 앱에서 온란인 콘텐츠를 정기적으로 결제하고 있습니다. 그리고 현재 텍스트 전용 콘텐츠의 "Tier 1" 버전을 매월 정기 결제하고 있습니다. 이 정기 결제 요금은 월 10달러이며 그녀는 4월 1일 정기 결제를 시작했습니다. 그녀는 정기 결제를 처음 시작한 사용자로 30일 무료 체험판 혜택을 누리고 있으며 이는 첫 번째 결제가 5월 1일로 에정되어 있음을 의미합니다.
4월 15일에 마리아는 동영상 업데이트가 포함되며 요금이 월 20달러인 "Tier 2" 정기 결제로 업그레이드 하기로 했습니다. 이 두번째 정기 결제에도 30일 무료 체험판 혜택이 있습니다.
아래 목록은 각 비례 배분 모드의 무료 체험판 전환 방식을 설명합니다.
IMMEDIATE_WITH_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_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일까지 무료 체험판 혜택을 유지하며 이제 "Tier 2" 콘텐츠에 액세스 할 수 있습니다. 5월 1일부터 매월 20달러가 청구됩니다.
DEFERRED
마리아의 "Tier 1" 정기 결제는 다음 결제일인 5월 1일이 될 때까지 계속됩니다. 5월 1일에 "Tier 2" 정기 결제가 적용되며, 매월 1일에 마리아에게 20달러가 청구 됩니다.
비례 배분 권장사항
아래 표는 다양한 비례 배분 시나리오와 함께 각 시나리오에 권장되는 사항을 보여줍니다.
정기 결제 재신청
사용자는 다음과 같은 여러 다양한 시나리오에서 정기 결제를 재신청할 수 있습니다.
- 정기 결제가 만료되기 전에 사용자는 앱에서 동일한 정기 결제를 다시 구매할 수 있습니다. 새 정기 결제 및 구매 토큰이 생성됩니다.
- 정기 결제가 만료되기 전에 사용자는 Google Play 정기 결제 센터에서 정기 결제를 복원할 수 있습니다. 동일한 정기 결제 및 구매 토큰이 유지됩니다.
- 정기 결제가 만료된 이후에는 사용자가 Google Play 정기 결제 센터를 통해 만료 후 1년까지 동일한 SKU를 다시 구매할 수 있습니다. 새 정기 결제 및 구매 토큰이 생성됩니다.
정기 결제가 만료되기 전
정기 결제가 아직 만료되지 않은 경우에도 사용자는 취소된 정기 결제를 다시 결제할 수 있습니다. 동일한 인앱 상품 구매 흐름을 동일한 제품 ID를 사용하는 취소된 정기 결제에 적용하여 사용자가 앱 내에서 정기 결제를 재신청하도록 할 수 있습니다.
새 정기 결제는 이전 정기 결제를 대체하고 동일한 만료일에 갱신됩니다. 예를 들어 아킬레스가 Exampl;e Music App을 정기 결제하고 있으며, 이 정기 결제는 8월 1일에 만료될 예정이라고 가정해보겠습니다.
7월 10일에 아킬레스는 1개월 정기 결제를 동일한 월별 가격으로 다시 결제합니다. 새 정기 결제는 나머지 잔액으로 비례 배분되고, 즉시 활성화되며, 여전히 8월 1일에 갱신됩니다.
다음과 같이 다시 정기 결제할 수 있도록 적절한 UI를 표시해야 합니다.
- 사용자에게 활성 정기 결제가 없다면 앱에 새 정기 결제를 구매할 수 있는 버튼이 있어야 합니다. 버튼 텍스트는 "구입' 또는 "구매"로 표시되어야 합니다.
- 사용자에게 취소된 정기 결제가 있다면 앱에 "다시 정기 결제" 버튼을 표시해야 합니다.
구매 토큰을 받으면 새 정기 결제에서와 마찬가지로 구매를 처리합니다. 또한 Google Play Developer API는 정기 결제 리소스에서 linkedPurchaseToken을 반환합니다.
linkedPurchaseToken에서 제공된 토큰을 무효화하여, 서비스 액세스 권한을 얻는데 이전 토큰이 사용되지 않도록 해야 합니다.
정기 결제가 만료된 이후
결제 라이브러리 버전 2.0 이상을 사용하고 있다면 사용자가 Google Play 정기 결제 센터를 통해 만료 후 최대 1년동안 만료된 정기 결제를 다시 구매할 수 있습니다. 이러한 구매는 앱 외부에서 이루어지므로 앱이 이러한 구매를 정상적으로 처리할 수 있도록 해야 합니다.
이 시나리오에서 사용자는 정기 결제 제품당 또는 앱에서 사용 가능한 모든 정기 결제와 관련하여 하나의 무료 체험판을 받을 수 있으므로 사용자가 정기 결제 센터에서 정기 결제를 다시 신청할 때 무료 체험판 또는 신규 할인 가격 혜택을 적용받을 수 없습니다.
linkedPurchaseToken을 사용하여 정기 결제 업그레이드 다운그레이드 및 재가입 처리에 설명된 정기 결제 재신청 처리에 관한 권장 사항을 따라야 합니다.
* 참고: 2020-11-01일 이후에는 기본적으로 결제 라이브러리 2.0 이상을 사용하는 모든 정기 결제에서 정기 결제 재신청이 사용 설정됩니다. Google Play Console에서 개별 SKU의 정기 결제 재신천을 사용 중지할 수 있습니다.
카탈로그의 각 SKU에 대해 이기능을 사용 설정해야 합니다.
이 기능을 사용 설정하는 방법에 관해 알아보려면 Console 고객센터(https://support.google.com/googleplay/android-developer/answer/140504?hl=ko)를 참조하세요.
무료 체험판 및 신규 할인 가격
앱은 무료 체험판 및 신규 할인 가격 혜택을 제공하여 고객이 앱을 사용해 보도록 유도할 수 있습니다.
무료 체험판
사용자가 요금을 결제하기 전에 정기 결제를 사용해 보도록 할 수 있습니다. 무료 체험판은 지정된 기간동안 실행되며 무료 체험판 사용 기간이 종료되면 자동으로 정식 정기 결제로 전환됩니다. 이렇게 전환된 정기 결제는 일반 정기 결제와 동일한 기간 및 가격을 사용합니다. 어떤 유형의 정기 결제든 무료 체험판을 설정할 수 있습니다.
무료 체험판을 시작하려면 사용자는 Google Play에서 정기 결제를 구매하는 표준 프로세스를 완료해야 합니다. 사용자가 무료 체험판을 사용할 자격이 있다면 무료 체험판 기간 동안 요금이 청구되지 않으며, 정기 결제에 무료 체험판 사용 기간이 포함되어 있다는 내용의 이메일 알림을 받습니다. Google Play에는 $0.00 거래로 기록되며, 무료 체험판 기간 동안 또는 취소 시까지 정기 결제를 구매한 것으로 표시됩니다. 무료 체험판을 시작하기 전에 Google Play는 사용자에게 유효한 결제 수단이 있는지 인증합니다. 일부 사용자에게 이 인증은 결제 수단에 대한 보류 또는 청구로 표시될 수 있습니다. 이 보류 또는 청구는 일시적이며 나중에 취소 또는 환불됩니다.
무료 체험판 기간이 종료되면 사용자의 결제 수단으로 정식 정기 결제 금액이 청구됩니다.
사용자가 무료 체험판 기간에 언제등지 정기 결제를 취소하면 정기 결제는 무료 체험판이 끝날 때까지 활성 상태로 유지되며 무료 체험판 사용 기간이 종료되면 요금이 청구되지 않습니다. 기본적으로 사용자는 앱에서 사용 가능한 모든 정기 결제와 관련하여 하나의 무료 체험판만 받을 수 있습니다. 정기 결제 제품당 하나의 무료 체험판을 제공하려면 Google Play Console에서 해당하는 설정을 변경하면 됩니다.
정기 결제에 무료 체험판을 추가하려면 Google Play 고객센터의 무료 체험판 안내(https://support.google.com/googleplay/android-developer/answer/140504?hl=ko) 참고
무료 체험판 혜택이 있는 정기 결제의 정기 결제 수명 주기 이벤트는 무료 체험판 혜택이 없는 정기 결제와 동일한 방식으로 작동합니다. 유일한 차이점은 갱신 기간이 일반 정기 결제 갱신 간격과 다를 수 있다는 점 입니다.
사용자에게 판매 가능한 제품을 표시할 때 SkuDetails.getFreeTrialPeriod() 메서드를 사용하여 제품에 무료 체험판이 제공됨을 표시할 수 있습니다.
* 참고: SkuDetails.getFreeTrialPeriod()는 Google Play Console에서 구성된 무료 체험판 기간을 반환합니다. 사용자가 이미 무료 체험판을 사용했을 수 있습니다. 이 경우 Google Play는 사용자에게 또 다른 무료 체험판을 사용할 수 없음을 알립니다.
무료 체펌판이 있는 정기 결제가 구매되었다면 Google Play Developer API에서 반환된 정기 결제에는 paymentState = 2 (무료 체험판)가 있습니다. 정기 결제가 성공적으로 갱신되면 paymentSteate가 1 (결제 수신)로 전환됩니다.
신규 할인 가격
무료 체험판과 마찬가지로 앱은 사용자에게 앱을 사용해 보도록 유도하는 신규 할인 가격 혜택을 제공할 수 있습니다.
신규 할인 가격 및 사용 설정 방법에 관해 자세히 알아보려면 "정기 결제 만들기"(https://support.google.com/googleplay/android-developer/answer/140504?hl=ko) 참고
신규 할인 가격이 적용되는 정기 결제의 정기 결제 수명 주기 이벤트는 신규 할인 가격이 적용되지 않는 정기 결제와 동일한 방식으로 작동합니다. 유일한 차이점은 갱신 기간이 일반 정기 결제 갱신 간격과 다를 수 있다는 것 입니다.
사용자에게 판매 가능한 제품을 표시할 때 SkuDetails.getIntroductoryPrice() 및 관련 메서드를 사용하여 정기 결제에 신규 할인 가격 혜택이 제공됨을 사용자에게 표시할 수 있습니다.
* 참고: SkuDetails의 신규 할인 가격 책정 메서드는 Google Play Console에서 구성된 가격 책정을 반환합니다. 사용자가 해당 SKU의 신규 할인 가격 혜택을 이미 사용했을 수 있습니다. 이 경우 Google Play는 사용자에게 신규 할인 가격 혜택을 다시 받을 수 없음을 알립니다.
정기 결제 프로모션
프로모션 코드를 만들어 기존 정기 결제 SKU에 대한 연장된 무료 체험판을 선택된 사용자에게 제공할 수 있습니다.
자세한 내용은 "005. 정기 결제 수명 주기 처리 - 프로모션 코드" 문서 참조
고객 관리
취소, 환불 또는 해지
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일 입니다.
결제 연기 시 이메일을 통해 또는 앱 내에서 사용자에게 알림을 보내 결제일이 변경되었음을 알릴 수 있습니다.
고객 다시 확보
실시간 개발자 알림을 사용하면 사용자가 취소하기로 결정한 시점을 실시간으로 감지할 수 있습니다. 사용자가 정기 결제를 취소했지만 정기 결제가 만료되기 전에 사용자에게 푸시 알림 또는 인앱 메시지를 보내 다시 정기 결제하도록 요청할 수 있습니다.
사용자의 정기 결제가 만료되면 사용자에게 정기 결제를 다시 구매하도록 요청해야 합니다. 사용자에게 할인을 제공하기 위해 정기 결제에 특별 가격이 적용된 제품 ID(winback SKU라고도 함.)를 제공할 수 있습니다. 앱에서 쿠폰을 제공하거나 이메일과 같이 앱 외부에서 사용자에게 쿠폰을 알릴 수 있습니다.
정기 결제 다시 확보를 시작하려면 Google Play 결제 라이브러리를 사용하여 Android앱에서 구매 흐름을 시작해야 합니다.
이 Flow는 새 정기 결제와 동일한 프로세스이지만, 사용자에게 제공할 SKU를 결정할 수 있습니다.
wingback SKU에 무료 체험판 또는 신규 할인 가격을 포함하기로 하였다면 Google Play Console에서 사용자가 앱당 하나의 무료 체험판을
받도록 제한하는 옵션인 "앱당 하나의 무료 체험판 허용" 확인란을 선택 해제하여 사용자가 자격 요건을 충족하도록 합니다.
정기 결제 가격 변경
* 경고: Google을 통한 구독의 정기 결제 가격을 변경하면 안됩니다.
Google Play를 사용하면 통화 및 가격을 고려하여 다양한 언어의 많은 사용자에게 전 세계 디지털 제품을 판매할 수 있습니다. 때로 지역 관련 비용이나 통화 변동으로 인해 정기 결제 가격을 변경해야 한다고 결정할 수 있습니다. 기존 가격으로 기존 정기 결제 사용자를 유지하려는 경우 업데이트된 가격으로 새 SKU를 생성하여 신규 정기 결제 사용자에게 제공할 수 있습니다.
사용자가 정기 결제에 가입했을 때 제공한 가격으로 정기 결제를 사용자를 계속 지원할 수 없으며 새 가격을 수락하지 않기로 한 사용자의 정기 결제를 모두 취소하려는 경우 필수 가격 변경을 적용할 수 있습니다. 사용자가 새 가격에 동의하지 않으면 정기 결제가 취소 됩니다. 동의율을 극대화하고 사용자가 조치를 취하도록 유도하기 위해 앱은 향후 가격 변경에 관한 메시지를 사용자에게 표시해야 합니다.
가격 변경 메시지에 관한 자세한 내용은 아래 "사용자에게 가격 변경 알리기" 항목 참조
정기 결제 가격을 변경하려면 다음 단계를 따르세요.
- Google Play Console에 로그인합니다.
- 가격을 변경하려는 정기 결제가 포함된 앱을 찾습니다.
- "앱 정보 > 인앱 상품"을 선택한 후 "정기 결제"태을 엽니다.
- 아래 그림과 같이 변경하려는 가격 옆에 있는 수정 링크를 선택합니다.
5. 새 정기 결제 가격을 입력합니다.
6. 가격을 변경하면 아래 그림과 같이 확인 대화상자가 나타납니다.
이 대화 상자에서는 가격 변경이 신규 정기 결제 사용자 및 기존 정기 결제 사용자에게 영향을 주는 방식을 설명합니다.
아래 내용을 참고하세요.
-
- 확인한 후에는 가격 변경을 되돌릴 수 없습니다.
- Google Play는 확인한 후 7일부터 가격 변경을 사용자에게 알리기 시작합니다.
- 정기 결제 가격을 인상할 대 사용자는 30일 이내에 가격 변경을 승인해야 합니다. 그렇지 않으면 정기 결제가 자동으로 취소됩니다.
- 정기 결제 가격 인하는 다음 갱신일에 기존 정기 결제 사용자에게 자동으로 적용됩니다. 가격 인하 이후 정기 결제하는 사용자는 자동으로 인하된 가격을 적용 받습니다.
계속 하려면 적용을 클립합니다.
7. 새 정기 결제 가격이 적용되는 시점을 다시 설명하는 확인 대화 상자가 나타납니다.
사용자에게 가격 변경 알리기
가격을 변경할 때마다, 특히 가격을 인상하는 경우 기존 정기 결제 사용자에게 알려야 합니다.
정기 결제 가격을 인상할 때는 Google Play에서 알림을 시작하기 전에 7일 이상 기존 정기 결제 사용자에게 가격 변경에 관해 알릴 수 있습니다. Google Play에서 사용자에게 알릴 경우 아래 그림과 비슷한 대화 상자가 표시됩니다. 이 대화상자에는 이전 가격, 새 가격, 새 가격이 적용되는 날짜가 표시됩니다.
* 참고: 정기 결제 가격을 인하할 때는 사용자가 가격 변경에 동의할 필요가 없으며 가격 변경 대화상자가 표시되지 않습니다.
앱에서 아래와 같은 방법으로 이 대화상자를 표시할 수 있습니다.
- 사용자가 앱을 열 때 가격 변경 확인 흐름을 시작합니다.
- 사용자가 가격 변경을 검토할 수 있도록 딥 링크를 사용해 사용자를 정기 결제 센터로 보냅니다.
앱은 정기 결제 리소스의 priceChange 필드를 확인하여 사용자에게 보류 중인 가격 변경이 있는지 확인할 수 있습니다. 필드가 있으면 이 필드는 정기 결제 가격 변경이 있음을 나타내고 priceChange.state 필드는 가격 변경이 수락되었는지 또는 아직 미결 상태인지를 나타냅니다.
가격 변경 확인 흐름 시작
앱이 실행될 때 Google Play 가격 변경 대화상자를 표시하려면 BillingClient.launchPriceConfirmationFlow()를 시용합니다.
가격 변경 대화상자를 표시하기 전에 가격 변경의 이유를 설명하는 자체 메시지 또는 대화상자를 제공할 수도 있습니다.
이 유형의 맞춤 메시지를 만들어 표시하면 사용자가 새로운 가격으로 정기 결제를 갱신할 가능성이 더 커집니다.
아래는 가격 변경 확인 Flow를 시작하는 예시 입니다.
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.
}
}
})
가격 변경에 관한 사용자 확인 처리
사용자가 정기 결제의 새 가격을 수락하면 정기 결제가 갱신되며 다른 갱신과 마찬가지로 처리될 수 있습니다.
또한 실시간 개발자 알림으로 SUBSCRIPTION_PRICE_CHANGE_CONFIRMED를 받습니다.
가격 변경 거부 시 처리
이전 정기 결제가 만료될 때까지 사용자가 가격 변경을 수락하지 않으면 사용자의 정기 결제가 취소됩니다.
그리고 실시간 개발자 알림으로 SUBSCRITION_CANCELED를 받습니다. 이 이벤트는 위 "취소" 항목에 설명된 대로 처리할 수 있습니다.
실수로 인한 가격 변경
실수로 정기 결제 가격을 변경했다면 즉시 변경을 취소해야 합니다.
7일 이내에 가격을 되돌리는 한, 실수로 인한 가격 변경 알림이 기존 정기 결제 사용자에게 표시되지 않습니다.
신규 정기 결제 사용자에게는 첫 번째 가격 변경과 복귀 사이의 시간 동안 실수로 인한 가격 변경사항이 표시될 수 있습니다.
연이은 두 번의 가격 변경
한 번에 하나의 가격 변경만 실행해야 합니다. 테스트 목적의 가격 변경은 권장되지 않습니다.
7일 이내에 정기 결제 가격을 두 번 변경하면 사용자는 최신 가격 변경에만 동의하면 됩니다.
두 가격 변경 간 시차가 7일을 넘으면 가격 변경이 서로 상쇄하지 않습니다. 대신 사용자는 첫 번째 가격 변경에 동의해야 하며 첫 번째 가격으로 한 번의 갱신 주기를 거쳐야 합니다. 갱신 주기가 끝나면 두 번째 가격으로 청구를 시작할 수 있습니다. 그러면 갱신 시 매월 두 번째 가격이 청구됩니다.
'학습' 카테고리의 다른 글
Google Play 결제 시스템 - Google Play 결제 라이브러리 통합 테스트 (0) | 2020.12.18 |
---|---|
Google Play 결제 시스템 - 프로모션 코드 (0) | 2020.12.18 |
Google Play 결제 시스템 - 앱에 Google Play 결제 라이브러리 통합 (0) | 2020.12.15 |
Google Play 결제 시스템 - 준비하기 (0) | 2020.12.14 |
Google Play 결제 시스템 - 개요 (0) | 2020.12.14 |