Androidでのアプリ内課金でハマったポイント・注意するポイント

夏頃に調査と学習のためにAndroidのアプリ内課金を試したので、その際にハマったポイントを書いておきます。
※記載するにあたり一通りドキュメントは見たのですが、もしかしたら細部変わっているところがあるかもしれません

ハマったポイントの前にAndroidのアプリ内課金について少しだけ触れたいと思います。

#課金の種類について

お金のやり取りはGoogleを介して行われます。
種類としては2つあります。

**管理対象のアイテム**
このアイテムの購入情報はGoogleによってGoogleアカウント毎に管理されます。
それぞれのアイテムは1つしか持てないため、一度購入すると2回目の購入はエラーになります。

機種変更や再インストールでもGoogleアカウントに紐付いているので、広告除去、プレミアム会員のような一度だけ買う性質のものはこれだけで実現できます。

現在のversionでは全てのアイテムがGoogleによって管理されることとなったため、いわゆる魔法石や通貨のような消費型のアイテムもこちらに分類されます。
ただ、アイテムは1つしか持てないため、(アプリの仕様上)複数回購入できるアイテムについては、購入後のイベントで消費リクエストを送ることによって、再度購入が可能になると公式ドキュメントに記されています。

具体的には「石50個セット」というアイテムを購入したら、アプリで「石」というアイテムを50個を付与(必要に応じて自前のサーバーに付与処理をリクエスト)し、Googleに「石50個セット」というアイテムは消費したと伝えていると思われます。

Googleは特定のアイテムを買った・消費したというのを管理しており、それを元に付与したアプリ内のお金やアイテム個数を管理しているわけではないため、消費型の場合こちら側で管理が必要です。
消費型アイテムの数や増減はアプリ内部だけで管理することもできますが、再インストール・機種変更の考慮や問い合わせ、ハック対策を考えると、別途自前のサーバーで管理する必要があるのではないかとおもいます。

**定期購入型**
月間や年間の期間等のように一定期間が過ぎたら自動で課金するものです。
週間/月間/年間/季節(開発者が期間を設定)が選べるほか、無料の試用期間を7日以上で設けることができます。

解約にはGoogle Playのアプリのページから行う必要があるのですが、解約の方法をちゃんと告知しないとクレームに繋がりそうです。


なお、アイテムの追加や価格設定はGoogle Play デベロッパーコンソールから行います。
受託案件などで顧客のGoogle Playのコンソールにアクセス権がない場合、このあたりの設定についてはコミュニケーションを取る必要がありそうです。
![kakin1.png](https://qiita-image-store.s3.amazonaws.com/332/38069/6854ef47-fa66-5cc1-f707-df11fe0879f7.png)

##使うAPIについて

In-app Billing APIのVersion3を使います。

* In-app Billing API [https://developer.android.com/intl/ja/google/play/billing/api.html](https://developer.android.com/intl/ja/google/play/billing/api.html)

なお、上記のVersion2は書いてあるとおり2015年1月27日でサポート終了となった模様なので、アプリ内課金ではこのVersion3一択となります。
残念ながらVersion3について解説した書籍はamazonでは見つけることができませんでした。(Version2はあった。)

今回は課金の調査のため、Android SDK Managerのライブラリに付属するサンプルクラスを利用しました。

※Libraryの導入方法はImplementing In-app Billingに書いてあるのですが、Android Studioでの導入方法はちょっとハマったので後で補足します。

また、アイテムIDには以下の様な予約済みアイテムIDが予め設定されており、これらを利用してスタブみたいなテストが出来ます。

* android.test.purchased
* android.test.canceled
* android.test.refunded
* android.test.item_unavailable

利用方法は公式ドキュメントを参照してください。

#アプリ内課金でハマったポイント・注意するポイント

以下は、だいたい予約済みアイテムIDによる課金のテストが終わった後の話です。

##Android StudioでIn-app Billing APIのライブラリ(IInAppBillingService.aidl)を読み込む方法がドキュメントに見当たらない

いきなり、セットアップでつまずくのが、Android StudioでIInAppBillingService.aidlをどう使えばいいのかということです。

サイトの隅にでも書いてあるのかもしれませんが、Eclipseプロジェクトでの導入方法は書いてあるものの、Android Studioについては記載がなく、置き場所も違うようです。

>Copy the IInAppBillingService.aidl file from <sdk>/extras/google/play_billing/ and paste it into the >src/com.android.vending.billing/ folder in your workspace.

とありますが、Android Studioではこの置き場所ではProjectからファイルを見つけることができず、ビルドが通りません。
諸々調べて試した結果、どうやら app/src/main/aidl/com.android.vending.billing/ に設置する必要があるようです。
※aidlは初めて使ったのですが、普段からaidlに慣れている人には常識なのかもしれません。

![project.png](https://qiita-image-store.s3.amazonaws.com/332/38069/b0b3d748-c2ed-2991-d0e8-fba5c7a39413.png)

##課金のテストをするのにGoogle Playのデベロッパーコンソールに登録(25ドル必要)をする必要がある

アイテムIDを指定して購入、このアイテムIDならアイテムを付与して～～という一連の課金をテストで試すにはGoogle Playのデベロッパーコンソールでの開発者登録が必要です。

詳しい登録方法は割愛しますが、Google アカウントに紐付けられたクレジットカードでドル建てで25ドルの決済を行います。

将来プライベートでアプリをリリースすると思って、自前のアカウントに25ドル払いました。
理由は次の項目で後述しますが、このアカウントは普段使いのものではない方が良いと思います。
案件でやるときは少しアカウントの運用を考える必要が出てきます。

##課金のテストをするのにGoogle Playのデベロッパーコンソールにアプリを公開する必要がある

システム上の都合なのかもしれませんが、テストするには一度Google Playにapkを公開(β版で可)する必要があります。
キャプチャもアプリ名も署名も公開に必要な情報はダミーでもよいので、全て揃える必要があります。
一度β版でもいいので公開してしまえば、手元のプログラムに変更を加えても上がっているapkを差し替える必要はないようです。

注意したいのですが、テストするのに公開用と同じパッケージ名で公開するとそのパッケージ名は二度と使えません。
また、β版の公開でもGoogle Playへの反映には2~3時間かかるので気長に待つ必要があります。

##課金をちゃんとテストするためにはリリースビルドで無くてはならない

どうやらテストするにはリリースビルドでないといけないようです。

リースビルドしてたらデバッガーをアタッチできないし色々不便だなっておもっていたんですが、
厳密にはキーストアの問題を見ているようで、デバッグビルドに使われるキーストアを置き換えればリリースビルドではなくとも良いようです。

ただし、GoogleMapsAPIなど利用するfingerprintなどをはキーストアの置き換えで変わってしまうと思うので、注意する必要がありそうです。

以下を参考にしました。

* [[Android] デバッグビルドでもアプリ内課金のテストがしたい](http://cohakim.com/archives/4204)

なお、試していませんが、予約済みアイテムIDでのスタブテストの場合はリリースビルドで無くても良いと思われます。

##課金はデベロッパーコンソールで登録したGoogleアカウントでは行えない

とても面倒くさいことにGoogle Playのデベロッパーコンソールで登録してしまったGoogleアカウントでは課金テストができませんでした。

![kakin2.png](https://qiita-image-store.s3.amazonaws.com/332/38069/2a969114-3634-498a-9ecb-05f6b9f13d2e.png)

要するに自分のアプリには自分自身では課金できないよってことらしいです。
課金にはプライマリアカウント(最初に登録した、設定で一番目に表示されているGoogleアカウント)が使われるようですが、そのアカウントで開発者の登録をしてしまうとちょっと面倒くさいことになります。
課金を行うには違うGoogleアカウントをプライマリアカウントにする必要があります。

課金するアカウントが選べそうな気がするのですが、Androidで普段課金しないので方法がわからず…(※すいません、iPhoneでばっか課金してます)

もし、Android2系などではプライマリアカウントを削除する際には、端末の初期化も求められます。
正確なOSバージョンは覚えていませんが、最近の4系以降のOSではプライマリアカウントは「OSの設定→アカウント」から出荷状態に戻さなくても消すことができます。

##課金するGoogleアカウントを事前にデベロッパーコンソールから設定しておく必要がある

これを忘れて容赦なく課金されました。
知らなくてテスト課金だと思って購入したらしっかりとカードに有料アイテムの代金の請求が行きました :scream: 

デベロッパーコンソールの「設定」→「アカウントの詳細」→「テスト用のアクセス権がある Gmail アカウント」から設定します。

設定がうまく言っていると課金の確認画面で「これはテスト用の注文です。課金は発生しません。」と表示されます。
アイテムの価格は最低価格の99円にしておくほうが無難です。(0円にはできません)
![kakin3.png](https://qiita-image-store.s3.amazonaws.com/332/38069/17676c2b-4637-d059-2993-539bbd847b95.png)

私の場合は、念には念を入れてGgoogle Walletのカード情報を僅かな金額が入ったVプリカにして大事故が起きないようにしました。

##用意しておいたほうが良さそうなもの

* 普段使いではないテスト用のGoogleアカウント
プライマリアカウントの話で触れたように、Google Playのデベロッパーコンソールのアカウントでは課金できないからです。

* プリペイド式のクレジットカード(Vプリカ)もしくはGoogle Playギフトカード
間違って課金テストをし続けた時に無制限に課金されなければいいと思います。他にいい方法が見つからない。

* 公開用とは別のテスト用Google Playのデベロッパーコンソールの契約
公開用のアカウントにテスト用アプリと本番アプリが並んでいるのが個人的には精神衛生上よろしくない。
公開アプリにアクセスできる人と、テスト用アプリにアクセスできる人は別であるべきであるような気がしますが、二重に登録料25ドル払わないとだし、分けるとなにかと面倒そうではあるので、現実的には同じアカウントに落ち着きそう