Android
IAB
GooglePlayBillingLibrary

簡単なGoogle Play Billing Libraryの課金の流れ

概要

課金今まで触れてこなかったので、メモです。

基本的にはBillingClientに対して以下をするだけです。

  • 接続する。
  • 課金アイテムの情報を取得する。
  • アイテムの情報を渡して課金するだけ。

image.png

このコードラボやりました。
https://codelabs.developers.google.com/codelabs/play-billing-codelab/

(この記事のコードミスっててヤバイことになっても保証はできないです)
何かコメントあればください。

接続する

image.png

val billingClient: BillingClient = BillingClient
            .newBuilder(context)
            .setListener(this)
            .build()

    init {
        billingClient.startConnection(object : BillingClientStateListener {
            override fun onBillingSetupFinished(@BillingResponse billingResponse: Int) {
                if (billingResponse == BillingResponse.OK) {
                    Log.i(TAG, "onBillingSetupFinished() response: $billingResponse")
                } else {
                    Log.w(TAG, "onBillingSetupFinished() error code: $billingResponse")
                }
            }

            override fun onBillingServiceDisconnected() {
                Log.w(TAG, "onBillingServiceDisconnected()")
            }
        })
    }

課金アイテム(SKU)の情報を取得する

image.png

SKUの名前はGoogle Play上でつけるっぽい。

        val itemType = SkuType.INAPP
        val skuList = listOf("gas", "premium")
        val skuDetailsParams = SkuDetailsParams.newBuilder()
                .setSkusList(skuList).setType(itemType).build()
        billingClient.querySkuDetailsAsync(skuDetailsParams,
                { responseCode, skuDetailsList: MutableList<SkuDetails> -> 
                    // ここで取得完了。(RecyclerViewとかでSkuDetailsの情報を表示できる) 
                })
SkuDetailsの例
{"productId":"gas","type":"inapp","price":"¥113","price_amount_micros":113088351,"price_currency_code":"JPY","title":"Gas (Play Billing Codelab)","description":"Buy gasoline to ride!"}

課金する

image.png

取得した情報にあるSkuDetailsのインスタンスを渡すだけで課金できる

        val billingFlowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails).build()
        billingClient.launchBillingFlow(activity, billingFlowParams)

接続の時に渡したリスナーで課金が検知できる。

    override fun onPurchasesUpdated(responseCode: Int, purchases: MutableList<Purchase>?) {
        Log.d(TAG, "onPurchasesUpdated() response: $responseCode");
    }

queryPurchases(SkuType.INAPP)などを呼ぶと、今の課金の状態とか取得できるみたい。
https://developer.android.com/google/play/billing/billing_library_overview

接続のリトライのベストプラクティス

ここに載っているので見てみると良さそう
https://codelabs.developers.google.com/codelabs/play-billing-codelab/#7

Next Step

https://developer.android.com/google/play/billing/billing_library_overview
ここに載っていたものそのままですが、Next Stepとして以下が良さそう

アイテム課金などの都度課金
https://developer.android.com/google/play/billing/billing_onetime
月額課金などのサブスクリプション
https://developer.android.com/google/play/billing/billing_subscriptions