【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で書いておけば…)

 

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

関連記事

プログラミング

SharePoint REST APIを使用してリストの情報を取得し、headerにナビを作る

SharePointで作成したリストの情報をREST APIを使用して取得してみましょう。 今回は、APIで取得した情報を、headerにリンクとして差し込んでみます。サイト全体共通のナビでも、リストを使用すると、一か所で管理できるので便利です。 目次1 前提条件2 1.REST APIで情報を取得2.1 REST APIのURL2.2 データを取得する処理3 2.取得した情報をheaderに表示 前提条件 SharePoint Online モダンUI カスタムJSが使用で […]

WordPress

WordPressで権限やユーザーごとに管理画面のサイドメニュー表示を切り分ける

デフォルトだといろいろな項目が表示されているWordPressの管理画面のサイドメニュー。 慣れていない人にはわかりづらいですよね。 また、権限によってデフォルトで非表示にしてくれたりもしますが、この部分は見せたくないな…ということも多いと思います。 今回はWordPressで権限やユーザーごとにサイドメニューの表示を変更する方法をご紹介します。 目次1 権限の種類について2 function.phpに記述する2.1 サイドメニューの非表示用のコード2.2 権限ごとに振り分け […]

プログラミング

jQuery+PHPで大容量ファイルを分割アップロードするお話

ファイルのアップロードを行う際に注意しないといけないのが「アップロード容量」と「タイムアウト」です。 どちらもサーバーの設定に関わるところでレンタルサーバーでは対処しきれないところもあり、大容量にするとそれだけアップロードに時間がかかりタイムアウトが発生しやすくなります。 そこでフロント側で分割してファイルをアップし、バックエンド側で受け取った後に結合するようにするとよいでしょう 注意すべき点として通常のPOSTでの送信ではないため、あらかじめそこら辺を考慮した処理が必要とな […]

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

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

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

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