Android課金について

# はじめに
こちらの記事では、実装方法には触れていません。
詳細や正確な情報は、末尾の参考URLなどを御覧ください。

# まとめ
いきなりまとめです。

- 課金アイテムには「Managed Product（管理商品）」、「Subscribe（定期購入）」の2種類がある。
- 課金アイテムは「所有している」、「所有していない」の2つの状態がある。
- ざっくり課金フローは「1. 課金アイテムの購入」、「2. データの反映」、「3. 課金アイテムの消費」（3. は複数回購入できる課金アイテムの場合のみ。）
- 課金の実装方法は「In-app Billing API」、「Google Play Billing Library」があり、基本的には「Google Play Billing Library」で問題なさそう。

# 課金アイテムの種類
Google Playでの課金アイテムには2つのタイプがあります。

1. Managed Product（管理商品）
2. Subscription（定期購入）

`Managed Product（管理商品）`は、ダイヤの購入や広告削除など複数回購入できる課金アイテムや一度だけ購入できる課金アイテムなどに利用します。

`Subscription（定期購入）`は、プレミアム会員など自動継続の定期購入できる課金アイテムなどに利用します。

# ざっくり課金フロー
課金アイテムの購入フローはざっくりと以下になります。
[In-app Billing API  |  Android Developers](https://developer.android.com/google/play/billing/api?hl=ja) に記載されているものをざっくりと纏めたものです。

1. 課金アイテムを購入する。
2. （課金アイテムを消費する。）
3. アプリ内でデータを反映する。

課金アイテムには、2つの状態があります。

1. 所有している。
2. 所有していない。

既に所有している課金アイテムは、購入することはできません。
複数回購入できる課金アイテムの場合は、購入したあとに消費を行うことで課金アイテムの状態を所有していない状態にします。
一度だけ購入できる課金アイテムや定期購入の課金アイテムの場合は、課金アイテムを消費するという工程は行いません。

課金アイテムの購入や消費の処理は、Google PlayのIn-app Billing APIが行ってくれるため、基本的な実装はAPIの呼び出しのみになります。
アプリ内でデータを反映する処理は、アプリごとに実装を行う必要があります。
定期購読の購読を更新する処理は、Google Playが行ってくれるため、アプリ内で購読状態を確認しデータを反映する処理を実装する必要があります。

# 購入フローの復帰について
課金フローの最中に問題が発生したり、タスクキルを行うなどをすると正常に課金フローが終了しない場合があります。
その場合は、課金フローを再開するなどをし、正常に課金フローを終わらせる必要があります。

※ 主に複数回購入できる課金アイテムの場合になります。

## 課金アイテムを購入中に問題が発生した場合
課金フロー1の課金アイテムを購入中に問題が発生した場合は、まだ購入処理が終わっていないため、課金アイテムを購入する前の状態になります。
そのため、特別に購入フローを復帰させる必要はありません。

## 課金アイテムを消費中に問題が発生した場合
課金フロー2の課金アイテムを消費中に問題が発生した場合は、まだ消費処理が終わっていないため、課金アイテムを所有している状態になります。
所有しているアイテムから消費するアイテムを選び、課金フロー2から復帰して処理を行います。

## アプリ内でデータを反映中に問題が発生した場合
課金フロー3のアプリ内でデータを反映中に問題が発生した場合は、まだ消費処理が終わっているため、課金アイテムを購入する前の状態になっています。
実装側で対策をしていない場合は、課金情報がGoogle Play側やアプリ内から無くなっているため、ユーザーからお問い合わせが来るなどの状況になってしまいます。

課金アイテムを消費する前にデータの反映をしておいた方が安全だと思います。
下記のようなフローにすると、データ反映中に問題が発生しても課金アイテムの状態を確認して、課金フローに復帰することができます。

1. 課金アイテムを購入する。
2. アプリ内でデータを反映する。
3. （課金アイテムを消費する。）

iOSのアプリ内課金のガイドでも購入処理を終了する前にデータを反映するように記載されています。
[Delivering Products](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW10)

※ 複数回データ反映を行おうとする可能性があるため、それを防ぐための実装が必要になります。

# ２種類の実装方法
現在は`In-app Billing API`を利用する方法と`Google Play Billing Library`を利用する方法の２種類の実装方法があるようです。
それぞれの特徴を見ていきたいと思います。

## In-app Billing APIの特徴
In-app Billing APIを直接利用する方法です。

1. 細かい手順が必要
課金処理が完了するまでにいくつかの手順が必要となっています。

2. 細かいデータが見れる
細かい手順が必要なため、その合間の状態やデータを見ることができます。

3. Javaでしか実装できない
Androidの開発では、Kotlinへのサポートが進んでいますが、In-app Billing APIを直接利用できないようでした。
少なくとも簡単に利用できる状態ではありませんでした。

## Google Play Billing Libraryの特徴
In-app Billing APIを使いやすい単位で纏めたライブラリです。

1. 簡単に扱える
In-app Billing APIをより扱いやすく纏めた処理となっています。

2. 細かいデータが見れない
扱いやすく纏めているため、In-app Billing APIよりも内部情報に触れる機会が少なくなっています。

3. JavaでもKotlinでも実装できる
JavaでもKotlinでも利用できるようでした。
AndroidStudioで補間ができていました。

# 参考URL
[In-app Billing API  |  Android Developers](https://developer.android.com/google/play/billing/api?hl=ja)
[Use the Google Play Billing Library  |  Android Developers](https://developer.android.com/google/play/billing/billing_library_overview?hl=ja)
[Delivering Products](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW10)