인앱 구독

구독을 통해 자동으로 되풀이되는 결제를 이용해 앱에서 다양한 콘텐츠, 서비스 또는 기능을 판매할 수 있습니다. 기존의 인앱 결제 구현을 손쉽게 조정하여 구독 서비스를 판매할 수 있습니다.

이 문서에서는 구독과 관련된 구현 세부정보와 함께, 관련 결제 및 비즈니스 모델의 몇 가지 전략에 초점을 맞춰 설명합니다.

  • 구독을 통해 다양한 주기로 자동으로 되풀이되는 결제를 이용해 상품을 판매할 수 있습니다.
  • 월간 구독과 연간 구독을 위해 구성 가능한 체험 기간을 제시할 수 있습니다.
  • 구독 관리는 Developer Console을 통해 수행하거나 Google Play Developer API를 사용하여 수행할 수 있습니다.
  • 사용자는 Google Play에서 직접 구독을 구매하지 않고 앱 내에서 구매합니다.
  • 사용자는 현재 구독이 활성 상태인 동안 구독을 갱신할 수 있습니다.
  • 사용자는 구독 기간 중에 구독을 업그레이드하거나 다운그레이드할 수 있습니다. 기존 구독에 지불한 가격은 비례 계산되어 차감되고 미사용 금액은 새롭게 대체되는 구독에 적용됩니다.
  • 계정 관리나 보상 제공을 위해 특정 사용자의 구독에 대한 결제를 미룰 수 있습니다.

개요

구독은 개발자가 지정하는 간격으로 자동 반복되는 결제로 앱 내에서 사용자들에게 콘텐츠, 서비스 또는 기능을 판매할 수 있도록 인앱 결제에서 제공되는 상품 유형입니다. 모든 유형의 앱이나 게임에서 거의 모든 유형의 디지털 콘텐츠에 대한 구독 서비스를 판매할 수 있습니다.

다른 인앱 상품과 마찬가지로, Developer Console을 사용하여 구독을 구성하고 게시한 다음, Android 기기에 설치된 앱 내부에서 판매합니다. Developer Console에서 구독 상품을 만들어 상품 목록에 추가한 다음, 각 상품의 가격과 선택적 체험 기간을 설정하고 결제 주기를 선택한 후 게시합니다. Developer Console 사용에 대한 자세한 내용은 구독 아이템 구성을 참조하세요.

사용자가 앱에서 구독을 구매하면 Google Play가 모든 결제 세부정보를 처리하므로 앱에서 금융 거래를 직접 처리할 필요가 없습니다. Google Play는 표준 인앱 상품과 앱 구매 시와 똑같은 방식으로 Google Payments를 통해 구독을 위한 모든 결제를 처리합니다. 따라서 사용자 입장에서는 일관되고 친숙한 구매 흐름에 따라 쉽게 구매할 수 있습니다.

사용자가 구독을 구매한 후 Play 스토어 앱의 My Apps 화면이나 앱의 상품 세부정보 페이지에서 구독을 확인하고 취소할 수 있습니다. 사용자 취소 처리에 대한 자세한 내용은 구독 취소를 참조하세요.

클라이언트측 API 호출 외에, 인앱 결제용 서버측 API를 사용하여 구독 구매자에게 콘텐츠에 대한 확장된 액세스 권한을 제공할 수 있습니다(예: 웹 사이트나 다른 서비스에서 액세스). 서버측 API를 사용해 사용자가 개발자의 다른 서비스에 로그인할 때 구독 상태의 유효성을 검사할 수 있습니다. API에 대한 자세한 내용은 Google Play Developer API를 참조하세요.

Android 앱 내부에서 기존의 외부 구독자 기반을 바탕으로 할 수도 있습니다.

  • 예를 들어, 웹 사이트에서 구독을 판매하는 경우 사용자가 다른 곳에서 구독을 이미 구매했는지 확인하는 자체 비즈니스 로직을 Android 앱에 추가한 다음, 이미 구매했다면 개발자 콘텐츠에 대한 액세스를 허용하고 구매하지 않았다면 Google Play에서 구독을 구매하도록 제안할 수 있습니다.
  • 원하는 만큼 많은 다양한 앱이나 상품에서 구독을 공유하기 위한 자체적인 솔루션을 구현할 수 있습니다. 예를 들어, 월간 또는 연간 요금을 결제한 구독자에게 앱, 게임 또는 기타 콘텐츠로 구성된 전체 컬렉션에 대한 액세스 권한을 제공하는 구독 서비스를 판매할 수 있습니다. 이 솔루션을 구현하려면 사용자가 특정 구독을 이미 구매했는지 확인하고, 구매했다면 개발자의 콘텐츠에 대한 액세스를 허용하는 자체 비즈니스 로직을 앱에 추가할 수 있습니다.

일반적으로 표준 인앱 상품에 적용되는 것과 동일한 기본 정책과 약관이 구독에도 적용되지만, 몇 가지 차이점이 있습니다. 현재 정책과 약관에 대한 자세한 내용은 정책 문서를 읽어보세요.

구독을 위한 최소 시스템 요구사항에 대해서는 버전 노트를 참조하세요.

구독 아이템 구성

구독을 만들고 관리하기 위해, Developer Console을 사용하여 앱에 대한 상품 목록을 설정한 후 각 구독 상품에 대해 다음과 같은 특성을 구성할 수 있습니다.

  • 구매 유형: 항상 Subscription으로 설정
  • 구독 ID: 구독 식별자
  • 게시 상태: 게시 안 됨/게시됨
  • 언어: 구독을 표시하기 위한 기본 언어
  • 제목: 구독 상품의 제목
  • 설명: 사용자에게 구독에 대해 설명하는 세부정보
  • 가격: 반복 구매 시마다 적용되는 기본 구독 가격
  • 반복 구매: 반복 구매 결제 주기
  • 추가적인 통화 가격(자동 채우기 가능)

Developer Console에서 상품을 추가하고 구성하는 자세한 방법은 인앱 결제 관리를 참조하세요.

Google Play Developer API를 사용하여 구독을 만들고 관리할 수도 있습니다.

구독 가격

Developer Console에서 구독을 만들면 사용 가능한 통화로 구독의 가격을 설정할 수 있습니다. 각 구독의 가격은 0이 아니어야 합니다. 동일한 콘텐츠에 대해 여러 구독의 가격을 다르게 설정할 수 있습니다. 예를 들어, 월간 요금이 비해 연간 구독 요금에 대해 할인 혜택을 제공할 수 있습니다.

중요: 구독의 가격을 변경하려면 새 구독 상품 ID를 새 가격으로 게시한 다음 원래 상품 대신 앱에서 제공할 수 있습니다. 이미 구매한 사용자에게는 계속 원래 가격으로 청구되지만, 신규 사용자에게는 새로운 가격으로 청구됩니다.

사용자 결제

Developer Console에서 선택한 주기로 자동 반복 결제되도록 구독 상품을 구성할 수 있습니다.

  • 주간 — Google Play에서 구매 시점과 최초 구매일 후로 매주 고객의 Google Payments 계정을 통해 결제합니다.
  • 월간 — Google Play에서 구매 시점과 최초 구매일 후로 매달 고객의 Google Payments 계정을 통해 결제합니다(정확한 결제 주기는 시간이 흐르면서 약간씩 바뀔 수 있음).
  • 3개월 — Google Play에서 구매 시점과 그 후로 3개월마다 고객의 Google Payments 계정을 통해 결제합니다(정확한 결제 주기는 시간이 흐르면서 약간씩 바뀔 수 있음).
  • 6개월 — Google Play에서 구매 시점과 그 후로 6개월마다 고객의 Google Payments 계정을 통해 결제합니다(정확한 결제 주기는 시간이 흐르면서 약간씩 바뀔 수 있음).
  • 연간 — Google Play에서 구매 시점과 그 후로 매년 같은 날짜에 고객의 Google Payments 계정을 통해 결제합니다.
  • 시즌 — Google Play에서 각 "시즌"이 시작될 때 고객의 Google Payments 계정을 통해 결제합니다(시즌 시작 날짜와 종료 날짜를 지정함). 이는 시즌별 콘텐츠(예: 스포츠 관련 콘텐츠)를 연간 구독하기 위한 옵션입니다. 구독은 시즌이 끝날 때까지 실행되고, 다음 해에 해당 시즌이 시작될 때 다시 시작됩니다.

구독에 대해 지정된 주기와 가격으로 무기한 계속 결제됩니다. 구독이 갱신될 때마다, Google Play에서는 사용자 계정에 자동으로 청구한 후 이메일로 사용자에게 청구 내역을 알려줍니다. 월간 및 연간 구독의 경우 구매일을 기준으로 결제 주기가 항상 구독 주기와 일치합니다. (시즌 구독에 대해서는 매년 시즌 첫날에 청구됩니다.)

구독 결제 승인 시, Google Play는 In-app Billing API를 통해 구매 앱에 다시 구매 토큰을 제공합니다. 앱은 토큰을 로컬 위치에 저장하거나 백엔드 서버로 전달할 수 있고, 그러면 Google Play Developer API를 사용해 토큰으로 구독을 원격으로 유효성 검사하거나 취소할 수 있습니다.

(예를 들어, 고객의 신용카드 유효 기간이 지나) 반복 결제에 실패하는 경우 구독이 갱신되지 않습니다. getPurchases() 메서드는 실패했거나 만료된 구독을 반환하지 않습니다.

권장 사항: 백엔드 서버에 구독 구매, 토큰, 그리고 발생할 수 있는 모든 결제 관련 오류를 알려주는 비즈니스 로직을 앱에 포함시키세요. 백엔드 서버는 서버측 API를 사용하여 기록을 쿼리 및 업데이트하고 필요한 경우 고객과 직접 통신하며 후속 조치를 취할 수 있습니다.

수동 갱신

In-app Billing API Version 3를 사용할 경우, 구독이 자동으로 갱신되도록 설정되어 있지 않더라도 구독이 활성 상태인 동안에는 사용자가 구독을 갱신할 수 있습니다. 구독이 활성 상태인 동안 사용자가 구독을 구매하면 구독이 현재 요율로 적정 기간만큼 연장됩니다.

예를 들어, Achilles는 Modern Hoplite 앱에서 구독 서비스를 이용하고 있습니다. 이 구독은 현재 8월 1일에 만료될 예정입니다. 7월 10일, Achilles가 현재 요율로 1개월 구독 서비스를 구매합니다. 기존 구독 기간에 이번에 구매한 1개월이 추가되므로, 이제 구독 만료일은 9월 1일이 됩니다.

적당한 UI로 이를 전달하는 것은 앱에 따라 다릅니다. 예를 들어, 활성 상태의 구독이 없는 사용자인 경우 앱에 buy 버튼이 표시될 수 있지만, 활성 상태의 구독이 있는 사용자에게는 renew 버튼이 표시될 수 있습니다.

구독 업그레이드/다운그레이드

In-app Billing API Version 3를 사용할 경우, 사용자가 구독 활성 기간 중에 구독을 업그레이드하거나 다운그레이드할 수 있습니다. 사용자가 활성 상태의 구독을 사용 중일 때 이 구독이 취소되고 새 구독이 생성됩니다. 기존 구독에서 사용되지 않은 잔액은 비례 계산되어 새 구독에 적용됩니다. 새 구독의 첫 결제 주기는 잔액 소진 후에 시작됩니다. (새 구독의 기간이 기존 구독과 같을 필요는 없습니다.)

예를 들어, Samwise는 Country Gardener 앱에서 온라인 콘텐츠를 구독합니다. 현재 콘텐츠의 Tier 1 버전의 콘텐츠(텍스트만으로 구성된 콘텐츠)를 월간 단위로 구독하고 있습니다. 이 구독을 이용하는 요금은 매달 2파운드이며, 매달 첫 날에 갱신됩니다. 4월 15일, Samwise는 월 요금이 3파운드인 Tier 2 구독(동영상 업데이트 포함)으로 업그레이드하기로 했습니다. 그러면 Samwise의 Tier 1 구독이 즉시 종료됩니다. 한 달 전체(4월 1일~4월 30일) 요금을 이미 지불했지만 절반만 사용했으므로, 한 달 구독 요금의 절반(1파운드)은 새 구독에 적용됩니다. 하지만 새 구독의 요금은 한 달에 3파운드이므로, 1파운드의 잔액으로는 10일분만 지불할 수 있습니다. 따라서 Samwise의 잔액으로는 4월 15~25일의 구독 요금이 지불됩니다. 4월 26일, Samwise에게 새 구독 요금으로 3파운드가 청구되고 이후로는 매달 26일마다 3파운드씩 청구됩니다.

참고: 새 구독의 결제일은 비례 계산된 구독자의 잔액이 소진되는 시점에 따라 달라지므로, 구독자는 시작 날짜와 종료 날짜가 미리 고정적으로 정해져 있는 시즌 구독으로 업그레이드하거나 다운그레이드할 수 없습니다.

사용자가 구독을 업그레이드하거나 다운그레이드하면 앱이 getBuyIntentToReplaceSkus()를 호출합니다. 이 메서드에 사용자가 구매하려는 새 SKU와 새 SKU로 대체되는 기존 SKU가 전달됩니다. 기존 SKU의 남은 부분은 새 구독에 대한 결제에 사용되고, 이 잔액이 소진되면 새 구독에 대해 정해진 결제가 시작됩니다.

결제 유예

Google Play Developer API를 사용하여 구독자의 다음 결제일을 유예할 수 있습니다. 사용자는 콘텐츠를 계속 구독하고 콘텐츠에 대한 모든 권한을 가지지만, 유예 기간 동안에는 요금이 청구되지 않습니다. 이를 통해 다음과 같은 일을 할 수 있습니다.

  • 사용자에게 번들의 일부나 특별 이벤트에 대한 무료 액세스 권한 부여(예: 인쇄본 잡지를 구독하는 사용자에게 웹 콘텐츠에 대한 무료 액세스 권한 부여)
  • 서비스 차원에서 고객에게 무료 액세스 권한 부여

결제를 유예할 수 있는 최장 기간은 해당 API 호출당 1년간입니다. 물론, 그 1년이 지나기 전에 API를 다시 호출하여 결제 유예 기간을 더 늘려줄 수 있습니다.

예를 들어, Darcy는 Fishing Gentleman 앱을 위한 온라인 콘텐츠를 월간 구독하고 있습니다. 보통은 매월 1일에 1.25파운드의 요금이 결제됩니다. 그러던 중, 3월 10일에 Darcy는 이 앱의 게시자가 실시하는 온라인 설문 조사에 참가했습니다. 그 보상으로 앱 게시자는 Darcy에게 다음 번 결제를 6월 1일까지 유예해주었습니다. 이 경우 4월 1일이나 5월 1일에 Darcy에게 요금이 청구되지 않지만, 평소대로 콘텐츠에 계속 액세스할 수 있습니다. 6월 1일이 되면 정상적으로 1.25파운드의 구독 요금이 청구됩니다.

참고: 이 API는 항상 정수의 일수만큼 결제일을 유예합니다. 분수의 일수를 포함하는 유예 기간을 요청하면, API가 바로 다음날 하루 전체로 유예 기간을 반올림합니다. 예를 들어, 사용자의 구독이 2015년 6월 15일 14:00:00 UTC에 갱신되도록 설정되어 있고 이 API를 사용하여 2015년 8월 15일 02:00:00 UTC까지 갱신일을 유예할 경우, API는 바로 다음날 하루 전체로 반올림하여 갱신일을 2015년 8월 15일 14:00:00 UTC로 설정합니다.

무료 평가판의 설명처럼, 새 구독자에게 무료 평가판을 제공할 수도 있습니다.

무료 평가판

Developer Console에서 사용자가 개발자의 구독 콘텐츠를 체험해본 후 구매할 수 있도록 해주는 무료 평가판 체험 기간을 설정할 수 있습니다. 체험 기간은 개발자가 설정한 기간 동안 운영되고, 그 기간이 지나면 구독자의 결제 주기와 가격에 따라 관리되는 전체 구독으로 자동으로 전환됩니다. Google Play는 시즌 구독을 포함한 모든 구독 유형에 대해 무료 평가판을 지원합니다.

무료 평가판을 이용하려는 사용자는 일반적인 구매 트랜잭션의 요금을 결제하고 트랜잭션을 완료하기 위해 사용하는 유효한 결제 양식을 제공하는 표준 인앱 결제 흐름을 통해 전체 구독을 "구매"해야 합니다. 하지만 초기의 일정 기간은 무료 체험 기간에 해당하므로 사용자에게 실제로 요금이 청구되지는 않습니다. 그 대신, Google Play는 0.00달러의 트랜잭션이 이루어진 것으로 기록하고 구독을 취소할 때까지는 무료 체험 기간 동안 구독을 구매한 것으로 표시합니다. 트랜잭션이 완료되면 Google Play에서 사용자가 무료 체험 기간을 포함하는 구독을 구매했고 최초 요금은 0.00달러라는 사실을 이메일을 통해 사용자에게 알려줍니다.

무료 체험 기간이 끝나면 Google Play는 사용자가 최초 구매 시 입력한 신용카드 정보를 바탕으로 전체 구매에 대해 설정된 금액으로 결제를 자동으로 시작하고 구독 주기에 따라 계속 결제합니다. 필요한 경우, 사용자는 무료 체험 기간 중에 구독을 취소할 수 있습니다. 이 경우 구독은 무료 체험 기간이 끝날 때까지 활성 상태로 남지만, Google Play는 구독이 자동으로 갱신되지 않도록 설정합니다. 따라서 무료 체험 기간 종료 시 구독이 만료되고 사용자에게 요금이 청구되지 않습니다.

APK를 수정하거나 업데이트할 필요 없이 Developer Console에서 구독의 무료 체험 기간을 설정할 수 있습니다. 상품 목록에서 구독을 찾아서 편집하고, 평가판 유효 일수를 설정하고 (7일 이상이어야 함), 게시하면 됩니다. Google Play는 구독의 무료 체험 기간을 이미 "구매한" 사용자에게는 변경 사항을 적용하지 않겠지만, 개발자는 언제든 이 기간을 변경할 수 있습니다. 업데이트된 무료 체험 기간은 신규 구독 구매에만 적용됩니다. 구독 상품당 하나의 무료 체험 기간을 생성할 수 있습니다.

구독 게시

Developer Console에서나 API를 통해 구독 상품 세부정보 구성을 마친 경우에는 앱 상품 목록에 구독을 게시할 수 있습니다.

상품 목록에 구독, 인앱 상품 또는 둘 모두를 추가할 수 있습니다. 다른 콘텐츠나 서비스에 대한 액세스 권한을 제공하는 여러 개의 구독을 추가하거나, 콘텐츠는 동일하지만 프로모션 등의 목적으로 기간이나 가격을 달리하여 액세스 권한을 제공하는 여러 개의 구독을 추가할 수 있습니다. 예를 들어, 어떤 뉴스 공급자가 동일한 콘텐츠에 대해 월간 구독과 연간 구독을 모두 제공하되, 연간 구독 시 할인 혜택을 제공하기로 결정할 수 있을 것입니다. 또한, 구독 서비스를 지원하지 않는 구형 기기 사용자도 콘텐츠를 이용할 수 있도록 하기 위해 구독 상품과 동등한 인앱 구매 조건을 제시할 수 있습니다.

상품 목록에 구독이나 인앱 상품을 추가한 후, 해당 상품을 게시해야 Google Play가 상품 구매가 가능하도록 할 수 있습니다. 또한, 앱 자체를 게시해야 Google Play가 앱 내에서 구매 가능하도록 할 수 있습니다.

중요: 앱 내에서 제공되는 상품 목록에서 구독 상품을 제거하여 사용자가 이런 상품을 보거나 구매하지 못하게 할 수 있습니다.

비례 계산 방식의 시즌 구독 가격

시즌 시작 날짜 이후에 시즌 구독을 구매하는 사용자를 위해 비례 계산 방식으로 가격을 설정할 수 있습니다. 할인 가격이 적용되는 기준 날짜를 지정합니다. 할인 가격은 지정된 날짜의 0:00 UTC부터 적용됩니다. 비례 계산 가격을 여러 개 설정하여 시즌이 진행됨에 따라 구독 가격을 점점 더 낮출 수 있습니다. 사용자가 비례 계산 방식의 시즌 구독을 구매하고 다음 시즌이 시작될 때까지 구독 상태를 유지할 경우, Google Play는 다음 시즌이 시작될 때 전체 구독 가격을 청구합니다.

예를 들어, 프로 체커 시즌은 3월 1일부터 8월 31일까지 운영됩니다. Checkers Dilettante 앱은 10유로에 시즌 구독 서비스를 제공합니다. 또한, 이 앱에서는 비례 계산 방식으로 두 가지 가격을 제공합니다. 즉, 6월 1일 이후에 가입하는 사용자에게는 7.50유로, 8월 15일 이후로 가입하는 사용자에게는 5유로를 적용합니다. 사용자의 가입 시점과는 상관없이, 시즌 구독은 8월 31일에 종료됩니다.

구독 취소

사용자는 Play 스토어 앱의 My Apps 화면에서 자신의 모든 구독에 대한 상태를 확인하고 필요하면 취소할 수 있습니다. 현재, In-app Billing API는 구매하는 앱 내부에서 프로그래밍 방식으로 구독을 취소하는 기능을 지원하지 않습니다.

사용자가 구독을 취소하는 경우 Google Play는 현재 결제 주기에 대해서는 환불하지 않습니다. 그 대신, 구독을 종료하는 시점을 기준으로 현재 결제 주기 종료 시까지는 사용자가 취소한 구독에 액세스할 수 있도록 허용합니다. 예를 들어, 사용자가 월간 구독을 구매했다가 해당 주기의 15일째 되는 날에 구독을 취소하는 경우 Google Play는 30일째 되는 날(또는 해당 월에 따라 다른 날일 수도 있음)이 끝날 때까지 구독이 유효하다고 간주합니다.

사용자가 구독 취소를 요청하기 위해 개발자에게 직접 연락할 수도 있을 것입니다. 이런 경우나 유사한 경우에 서버측 API를 사용해 개발자 자신의 서버에서 사용자 구독을 쿼리하고 직접 취소할 수 있습니다.

중요: 어떤 경우든 단 한 명의 사용자라도 콘텐츠에 액세스할 수 있는 한, 구독자가 구독 서비스를 통해 구매한 콘텐츠를 계속 제공해야 합니다. 즉, 해당 구독이 현재 결제 주기가 끝날 때 종료될지라도, 콘텐츠에 대한 구독이 아직 활성 상태인 사용자가 한 명이라도 있으면 어떤 콘텐츠도 제거하면 안 됩니다. 또는 환불 및 취소 API를 사용하여 각 구독자의 구독을 (하나씩) 취소하고 구독 결제 대금을 환불해 줄 수 있습니다. 어떤 구독자라도 액세스 권한이 있는 콘텐츠를 제거하면 페널티를 받게 됩니다. 자세한 내용은 정책 문서를 참조하세요.

앱 제거

사용자가 구매한 구독을 포함한 앱을 제거하면 Play 스토어 앱이 사용자에게 제거하려는 앱에 활성 상태의 구독이 포함되어 있다는 사실을 알려줍니다. 그래도 사용자가 그대로 제거하기로 선택하면 해당 앱이 제거되고 구독은 활성 상태로 유지되면서 계속 반복 결제가 이루어집니다. 사용자는 언제든 Play 스토어 앱의 My Apps 화면으로 돌아가 연관된 구독을 취소할 수 있습니다. 사용자가 제거를 취소하기로 선택하면 앱과 구독은 그대로 남습니다.

구독 환불 및 취소

구독 서비스를 이용해도 Google Play에서 따로 환불 창구를 제공하지는 않으므로, 사용자가 환불을 요청해야 합니다. Play 스토어의 My Orders 페이지에서 환불을 요청하거나 개발자에게 직접 연락하여 환불을 요청할 수 있습니다.

환불 요청을 받을 경우, Google Play Developer API나 Merchant Center를 사용하여 구독을 취소하거나, 구독이 이미 취소된 상태임을 확인하거나, 취소하지 않고 사용자가 결제한 대금을 환불할 수 있습니다. Google Play Developer API를 사용하여 사용자의 구독을 환불하고 취소할 수도 있습니다. 구독을 환불하고 취소하면 사용자의 구독이 즉시 취소되고, 사용자의 가장 최근 구독 결제 대금이 환불됩니다. (가장 최근 결제 대금보다 많은 금액을 환불하려는 경우에는 Merchant Center를 통해 추가 환불을 처리할 수 있습니다.)

중요: 현재, 부분 환불 기능은 지원되지 않습니다.

결제 처리 및 정책

일반적으로, Google Play의 약관에 따르면 기본 결제 처리자인 Google Payments를 통해서만 인앱 구독을 판매할 수 있습니다. 구독 상품을 구매할 경우, 트랜잭션 요금은 애플리케이션 구매를 위한 트랜잭션 요금(30%)과 동일합니다.

Google Play에 게시되어 구독 상품을 판매 중인 앱은 인앱 결제를 사용하여 트랜잭션을 처리해야 하고, 앱과 Google Play 외부의 구매 흐름에 대한 링크(예컨대, 웹 사이트로의 링크)를 제공할 수는 없습니다.

약관과 정책에 대한 자세한 내용은 정책 문서를 참조하세요.

구독 주문 번호

특정 구독과 관련된 트랜잭션을 용이하게 추적할 수 있도록, Google Payments는 구독의 모든 반복 구매에 대한 기본 판매자 주문 번호(Merchant Order Number)를 제공하고 다음과 같은 정수를 추가하여 각각의 반복 트랜잭션을 나타냅니다.

GPA.1234-5678-9012-34567 (기본 주문 번호)
GPA.1234-5678-9012-34567..0(첫 번째 반복 구매 orderID)
GPA.1234-5678-9012-34567..1(두 번째 반복 구매 orderID)
GPA.1234-5678-9012-34567..2(세 번째 반복 구매 orderID)
...

Google Play는 주문 번호를 INAPP_PURCHASE_DATA JSON 필드의 orderId 필드 값(V3에서) 또는 PURCHASE_STATE_CHANGED 인텐트의 값(V2에서)으로 제공합니다.

거부된 결제에 대한 유예 기간

Developer Console을 사용하여 구독 유예 기간을 설정할 수 있으므로, 반복 구매 결제가 거절되는 경우 구독자에게 결제 방법을 업데이트할 기회를 줄 수 있습니다. 구독자의 신용카드 유효기간이 만료되었거나, 구독자가 선불카드를 사용해 구독했거나, 결제 정보를 업데이트하지 않고 카드를 취소한 경우에 이 설정이 유용합니다. 구독에 대한 유예 기간 설정에 관한 자세한 내용은 Developer Console 도움말 항목 구매 및 반복 구매 청구 추가를 참조하세요.

유예 기간 설정이 getBuyIntent() 메서드에서 반환되는 데이터에 어떤 영향을 미치는지 알아보려면 INAPP_PURCHASE_DATA 필드 테이블을 참조하세요.

구매 확인 전략

일반적인 상황에서는 앱이 신규 구매에 대한 주문 상태를 검증하여 구매한 콘텐츠에 대한 액세스 권한을 부여하기 전에 유효한 구매인지 확인합니다.

구매의 유효성을 확인하기 위해, 앱은 백엔드 서버로 구매 토큰과 기타 세부정보를 전달하고, 백엔드 서버는 Google Play Developer API를 사용하여 Google Play와 통신해 직접 확인합니다. 백엔드 서버가 구매가 유효한 것으로 확인할 경우 앱에 알려주고 해당 콘텐츠에 대한 액세스 권한을 부여합니다.

사용자는 네트워크에 연결할 수 없을 때를 포함하여, 언제든 앱을 사용할 수 있기를 바란다는 점을 유념하세요. 따라서 구매 확인에 대한 접근 방식에서 오프라인 사용 사례를 고려해야 합니다.

Google Play Developer API

Google Play는 다음과 같은 작업을 수행할 수 있게 해주는 HTTP 기반 API를 제공합니다.

  • 언제든지 특정 구독의 유효성을 원격으로 쿼리
  • 구독 취소
  • 구독의 다음 결제일 유예
  • 구독을 취소하지 않고 구독 결제 대금 환불
  • 구독 환불 및 취소

이 API는 백엔드 서버에서 구독을 안전하게 관리할 뿐 아니라, 구독을 연장하고 다른 서비스와 통합하는 수단으로 사용하도록 디자인되었습니다.

자세한 내용은 Google Play Developer API를 참조하세요.