【Kotlin】Google Play Billing Library 6 でアプリ内課金を実装し直したお話

  • このエントリーをはてなブックマークに追加

毎年恒例のアップデート

Androidアプリでアプリ内課金をするにはGoogle Play Billing Libraryを使う必要があるのですが、これは毎年メジャーアップデートされており、現在はバージョン6まで出ています。

これだけであれば別にいいのですが、過去のバージョンを使っているとアプリのアップデートができないという決まりが…

具体的には

注: 2023 年 8 月 2 日以降、すべての新規アプリでは Billing Library バージョン 5 以降を使用する必要があります。また既存のアプリのアップデートについては、2023 年 11 月 1 日より Billing Library バージョン 5 以降の使用が必須となります

というように、一つ前のバージョンまでは許容されますが、2つ前、つまりバージョン4を使っているアプリはアップデートできなくなります。

事実上2年しか持たないライブラリとなるわけで、毎年対応する必要がある感じですね。
と言うわけで今回はバージョン5からバージョン6への対応をまとめたいと思います。

詳しくは下記のURLから確認していただくのが手っ取り早いかつ確実です。

(外部サイト)Google Play Billing Library 4 または 5 からバージョン 6 に移行する
https://developer.android.com/google/play/billing/migrate-gpblv6?hl=ja

ということで、ここでは実際にこんなケースの場合にどう対応したかまとめたいと思います。

ちなみに以下のような設定というか環境になってます

  • 言語はKotlinで記述
  • 定期購入(いわゆるサブスク)かつ2種類の購入アイテムがあり、購入済みアイテムを切り替えるとただちにアップグレードまたはダウングレードされる
まぁよくある形ですね。
これが消費型アイテムだったりするとまた変わるのかもしれませんが、今回は割愛します。

実際にバージョンアップしてみた

Android Studioでライブラリのアップデートをしてみると案の定エラーがありました。
ただバージョン4→5よりかははるかに少ないです。(SKUが非推奨になったりしていたので)
今回はそこを取り上げてきます。

Purchase.PurchaseState.PENDINGの時のOrderIdがnull

真っ先にエラーが出たのはこの部分です。実はPENDINGの時も処理を入れていたのですが、おそらくバージョン6から

The order ID will be null if the purchase is in the Purchase.PurchaseState.PENDING state and populated if the purchase has transitioned to the Purchase.PurchaseState.PURCHASED state.
(購入が Purchase.PurchaseState.PENDING 状態にある場合、注文 ID は null になり、購入が Purchase.PurchaseState.PURCHASED 状態に移行した場合に設定されます。)

となり、PENDINGにOrderIdは取れなくなりました。
なので、PENDING時はOrderIdを使った処理を書かないようにしましょう。(普通はしないか…)

実はエラーはこれだけで、実はこの状態でも動くのですが、非推奨の指摘が1カ所あったので潰したいと思います。

setReplaceProrationMode とかは非推奨

「これを使え」と言われてすぐに非推奨になる微妙な感じがありますが、非推奨と言われたら直すしかない

これは「定期購入中に違うプランを申し込んだときにどうするか(この場合は直ちにアップグレードまたはダウングレードする)」という処理ですが、今回のバージョンでは2カ所の非推奨ポイントがあります。

簡単に言うと

  • setReplaceProrationMode(Int) は使わないでね
  • BillingFlowParams.ProrationModeも使わないでね
といった感じです。

ドキュメントにもそれぞれ

This method is deprecated.
Use setSubscriptionReplacementMode(int) instead.

https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode

This @interface is deprecated.
use BillingFlowParams.SubscriptionUpdateParams.ReplacementMode instead.

https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setReplaceProrationMode(int)

と書かれていました。

って事で推奨される記述の変更します。

これでバージョン6に対応するようになりました。やったね!

ちなみに…

今回は影響はなかったですが、実は「BillingClient.BillingResponseCode.SERVICE_TIMEOUT」も非推奨になりました。

This constant is deprecated. See SERVICE_UNAVAILABLE which will be used instead of this code.

[BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE]を代わりに使ってくれと言うことですので、もし使っている方がいたらここも注意しましょう。

最後に

基本的に今はKotlinで記述しており、Javaで書くことは昔のアプリをアップデートする場合以外はほぼ無くなりましたが、ライブラリのアップデートなどを行う事を考えると、JavaのままでいいのかKotlinで書き直した方がいいのか迷ったりします。

まぁ2年の猶予があるので未来の自分に任せる方法もアリですが、他のライブラリの件などもあったりするので、随時修正した方が負担も少ないかなと思ったりします。

(最初からKotlinで書いておけば…)

 

執筆者:松本[ エンジニア ]

関連記事

プログラミング

【PHP8】関数を作るときにしっかりと型宣言をするお話

目次1 天国でもあり地獄のようなPHPの変数事情2 関数も型宣言する時代 天国でもあり地獄のようなPHPの変数事情 PHPは昔から良くも悪くも変数の型に対して寛容でした。 いきなり型宣言をせずに使えますし、なんなら $hoge .= “宣言しなくても追加”; ですら怒られないくらいでした。 ただ、PHP5あたりからうっすらとまずいよねってことになり、PHP5系では非推奨、PHP8以降になると、warningとしてしっかりとアラートが出るようになりました […]

プログラミング

【PHP】古いWordPressで絵文字を使えるようにするお話

WordPressはLAMP環境で動くCMSとして昔から有名ですが、昔から使われているサイトの場合、絵文字が使えないことがあります。 今回はそういう場合の絵文字を使えるようにしてみましょう 目次1 MySQLのバージョンを調べる2 テーブルの照合順序を変更する3 最近の事情 MySQLのバージョンを調べる 使えるようにしましょうといいつつ、実は大前提があります。 それはMySQLのバージョンが5.5以降であることです。 それ未満のバージョンは「utf8mb4」にできないため、 […]

Webサイト制作

【さくらのレンタルサーバー】環境ごとにPHPのバージョンを変更するお話

最近何かとAI関係で話題の「さくらインターネット」ですが、レンタルサーバーはコスパもよく、かなり使いやすいサービスだと思います。 特にWordPressなどのLAMP環境に最適化された環境であり、PHPもいろいろなバージョンを選ぶことができます。 変更方法も簡単でコンパネからボタン一つでできるので楽ちんですね。 ただ当然なのですがマルチドメインで運用している場合もすべての環境にPHPのバージョンが一斉に反映されてしまいます。 それはそれで便利なのですが、例えばこの環境のみバー […]

株式会社8bit (エイトビット)

東京都目黒区でWebサイト制作、Webシステム開発などを行っております。
コーポレートサイトやWebサービスの企画・提案を得意としており、自社での経験を元にアイデアをカタチにするお手伝いをさせていただいております。

Web制作に関するご相談はお気軽にどうぞ

弊社に制作をご依頼いただく際の費用感をご確認いただける、
見積りシミュレーションをご用意いたしました。