Android Billing Library v3に対応した話

こんにちは。

今回は『ポケコロ』で2021年に行った、Android Billing Library v3対応の時にあったいくつかの対応について話したいと思います。

初めに

アプリ開発をしている方なら一回はいただいたことがあると思います。「いつまでに○○を必ずしてね。そうじゃないとアプリのアップデートできなくなるよ」と書いてあるGoogleもしくはAppleからのメールのことです。今回対象になったのはタイトルの通り課金に関するアップデートについてでした。

<2021/08/16 Googleからもらったメールの内容>

 

『ポケコロ』は2013にAIDLを投入してサービスを開始しました。その後、何回かのAIDLのアップデートはありましたが、今回メールをきっかけにBIlling Libraryへの乗り換えを行うことになりました。

<Billing Library Version Support>

対応①:Karaganda API

karaganda APIはgoogleがPlay Billing Library 2.0以上から提供している不正行為防止 APIのことです。不正ユーザーがアプリ内で複数のアカウントを作成し、不正なトラフィックが発生したらGoogleがそれを検知、不正の取引の完了の前にブロックする機能です。実装方法は簡単です。

 

BillingFlowParams.Builder builder = BillingFlowParams.newBuilder().setSkuDetails(skuDetails);
builder.setObfuscatedAccountId(ハッシュ化または暗号化されたユーザーID);
BillingFlowParams purchaseParams = builder.build();

 

ココネで一番早く実装できたアプリでは「不正行為が最大 30% 減少し、チャージバックによる損失も 40〜50% 減」の結果報告を受けました。

対応②:Developer payload

『ポケコロ』ではデベロッパーペイロードに課金に必要な全てのデータを渡して活用していました。ただ、Google Billing Library 2.2以降のバージョンではデベロッパーペイロードのサポートが終了しました。代わりにsetObfuscatedProfileIdを活用しました。Karagandaと同様BillingFlowParamのビルダーを通して渡します。

 

BillingFlowParams.Builder builder = BillingFlowParams.newBuilder().setSkuDetails(skuDetails);
builder.setObfuscatedProfileId(難読化されたプロフィールID);
BillingFlowParams purchaseParams = builder.build();

 

profileIdは購入完了時のPurchaseオブジェクトに含まれていて、getAccountIdentifiers()で送った値が再び取得できます(accountIdも同様)。『ポケコロ』では購入開始前に必要なデータをローカルに保存、保存したデータを探せるキーをprofileIdとして渡しています。購入完了後に取得したprofileIdをベースとして課金前に保存したデータから必要なデータを探し、アイテム配布に必要な処理を行います。

対応③ : コンビニ決済

今回の改修で一番時間かかったのが、コンビニ決済でした。コンビニ決済をサポートするためにはアプリでGoogle Billing Libraryの初期化の時にenablePendingPurchases()を呼び出す必要があります。決済のプロセスは既存のプロセスと大きく変わりはありません。ただ、一点だけ注意点があります。Googleの処理が完了したらonPurchasesUpdatedがコールバックされます。その時に、購入に成功しても、コンビニ決済により保留中になってもBillingResultのBillingResponseCodeはOKになります。なので、BillingResponseCodeとPurchase.PurchaseState(Purchased、Canceled、Pending)両方をみて判断することが必要です。

 

テストケース BillingResponseCode Purchase.PurchaseState アイテム配布
テストカード

常に承認

OK PURCHASED OK
テストカード

常に不承認

ERROR NG
スローテストカード

常に承認

OK 初回:PENDING 初回:NG
支払い完了後:PURCHASED 支払い完了後:OK
スローテストカード

常に不承認

OK PENDING NG

対応④ : サブスク

消費性アイテムはAIDLと同様にBilling Library v3でも購入後の承認の処理が必要でした。AIDLでは①を投げて②をもらわなくても、①を受け取った時点でサービス開始になる仕組みでした。

ただ、Billing Library v3からはサブスクもBillingClient.acknowledgePurchase()を使い購入を承認する必要があります。購入後の3日以内に購入の承認が行われない場合、購入がキャンセルになります。『ポケコロ』では期間中コンテンツを提供する形ではなく、定期購入が更新されるタイミングでアイテムを配信する形なのです。なので、購入承認が正しく行われない場合、無料でアイテムを配ることになります。Billing Library v3のリリース当時は④まで完了したらクライアント側で購入承認を行いました。しかし、通信不要などユーザー環境により④を受け取れないケースも発生する可能性がありました。対策として、サーバーの力を借り③のリクエストの時にサーバーからgoogleに購入承認を行うようにしました。

 

<サーバーで使ったサブスクの購入承認のAPI>

https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscriptions/acknowledge

終わりに

すでにリリースされて10年を迎えたサービスの課金周りを元から作り直すのはなかなかできない経験だと思います。『ポケコロ』としてはBilling Library v3対応がちょっと遅れた感もあります。これからはお客様に良い体験を提供するためにもGoogleさんがおすすめしている年1回のアップデートに取り組む必要があると思います。

 


 

ココネでは一緒に働く仲間を募集中です。

ご興味のある方は、ぜひこちらの採用特設サイトをご覧ください。

https://www.cocone.co.jp/recruit/contents/

Category

Tag

%d人のブロガーが「いいね」をつけました。