인앱구매 (in-apppurchase), 특히구독 (subscription)은앱 (app)에서수익을 내는 가장 인기 있는 방법입니다.개발자는구독을 통해 콘텐츠 및 제품 개발에 투자할 수 있고,다른한편으로는 사용자가 일반적으로 더 높은 품질의 앱을얻는 데 도움이 됩니다.인앱구매에는 30%수수료가부과되지만,사용자가1년이상 구독한 경우 또는 앱이 연간$1M미만의수익을 올리는 경우,수수료는15%입니다.
이글을 작성하는 시점에서 최신 버전은 4.0.0입니다.언제든지다른 버전으로 교체할 수 있습니다.
GooglePlay와의상호 작용 논리를 다루는 래퍼 클래스를 만들고 그안의 결제 라이브러리에서 BillingClient를초기화해 봅시다.이클래스를 BillingClientWrapper라고부르겠습니다.
이클래스는 PurchasesUpdatedListener인터페이스를구현할 것입니다.이제메소드를 재정의할 것입니다.onPurchasesUpdated(billingResult:BillingResult, purchaseList: MutableList<Purchase>?)– 구매가이루어진 직후에 필요하지만,구현과정은 다음 기사에서 설명하겠습니다.
import android.content.Contextnimport com.android.billingclient.api.*nnclass BillingClientWrapper(context: Context) : PurchasesUpdatedListener {nn private val billingClient = BillingClientn .newBuilder(context)n .enablePendingPurchases()n .setListener(this)n .build()nn override fun onPurchasesUpdated(billingResult: BillingResult, purchaseList: MutableListu0026lt;Purchaseu003e?) {n // here come callbacks about new purchasesn }n}
Kotlin
Google은 구매에 대한 콜백의 다중 실행을 방지하기 위하여,BillingClient와GooglePlay 간에둘 이상의 활성 연결을 갖는 것을 피하기를 추천합니다.따라서싱글톤 클래스에 하나의 고유한 BillingClient만있어야 합니다.예제의클래스는 싱글톤이 아니지만,의존성주입(예를들어,Dagger또는Koin의도움으로)을이러한 방식으로 사용하여,한시점에 하나의 인스턴스만 존재하도록 허용합니다.
결제라이브러리를 통한 요청을 하려면,BillingClient는요청이 이루어지는 순간에 GooglePlay와활성 연결이 되어 있어야 하지만,연결이어느 순간 끊어질 수 있습니다.편의를위해 연결이 활성화된 경우에만 요청을 수행할 수 있는래퍼를 작성해 봅시다.
제품을얻으려면 마켓에 설정한 ID가필요합니다.그러나이것만으로는 요청에 충분하지 않고,제품유형 (구독또는 일회성 구매)도필요하기때문에,두요청의 결과를 "결합"하여일반 제품 목록을 얻을 수 있습니다.
제품요청은 비동기식이므로,제품목록을 제공하거나 오류 모델을 반환하는 콜백이필요합니다.오류가발생하면 결제 라이브러리는BillingResponseCodes중하나뿐 아니라 debugMessage도반환합니다.콜백인터페이스와 오류 모델을 만들어 보겠습니다.
interface OnQueryProductsListener {n fun onSuccess(products: List u0026lt; SkuDetails u003e )n fun onFailure(error: Error)n}nnclass Error(val responseCode: Int, val debugMessage: String)
Kotlin
다음은특정 유형의 제품에 대한 데이터를 가져오는 비공개메소드와 두 요청의 결과를 "결합"하고사용자에게 최종 제품 목록을 제공하거나 오류 메시지를표시하는 공개 메소드에 대한 코드입니다.