【android】アプリ内課金を実装する
公開日:
:
android
アプリ内課金のサンプルコードを解析します。
参考URL
公式API
Androidでアプリ内課金を始めるための基礎知識
Androidアプリにアプリ内課金を実装してみよう
Androidアプリ内課金の管理・テスト・セキュリティの8つのポイント
概要
アプリ内課金の主な処理は、課金リクエストを行うサービス、サーバーにリクエストを行うマーケットアプリのサービス、結果や状態の変化を受信するレシーバーによって行われます。
その他の必要なコードとしてコールバックしてUIを更新、購入情報の保存、セキュリティ処理などがあります。
また、購入するアイテムの種類は、「管理されるアイテム」、「管理されないアイテム」の2つです。
前者はプレミアムライセンスの購入など1度購入したら永続的に効果を発揮する場合に使用します。
後者はコンプガチャのチケットなど何度も購入するアイテムに使用します。
リリースまでの全体の流れとしては、課金処理の実装、アプリのアップロード(非公開)、アイテムの登録、課金テスト、アプリの公開となります。
実装のポイント
サンプルではアプリ内課金のコアとなる処理は実装済みです。部分的にカスタマイズして自分のアプリに適用していきます。ただし、リバースエンジニアリングされにくくするために、コードを改変することが推奨されています。
●各アプリ特有の処理のカスタマイズ
・購入アイテムのCRUD処理(アイテム購入/消費/リストア時)
・処理結果に対するUIの更新 → クラス:DungeonsPurchaseObserver
・セキュリティのための処理 → クラス:Security
●アプリが課金系処理を開始するメソッドを実行
・購入済みアイテムのリストア
mBillingService.restoreTransactions();
・アイテムの購入
mBillingService.requestPurchase(mSku, mPayloadContents)
●パラメータの変更
・秘密鍵の値 → クラス:Security
・アイテムのIDと名称 → クラス:Dungeons、string.xml
課金処理の実装
主な登場人物
●アクティビティ
Dungeons メインアクティビティ
●課金処理
BillingService 課金リクエストを行う。非同期で行うためサービスとして実装される。
BillingReceiver マーケットアプリからの通知を受取る。
IMarketBillingService マーケットアプリの課金受け口となるサービス。
●ユーザーへの通知(UIの更新)
ResponseHandler 同期・非同期レスポンスを受け取り、必要に応じてPurchaseObserverを呼び出す。
PurchaseObserver 課金処理に関する状態の変化や処理結果をコールバックしてUIに反映する
●購入情報の保存
PurchaseDatabase
●セキュリティ
Security 署名の検証やなりすまし防止のための処理を行う。
アプリ内課金のメッセージ要素
● a. 5つのリクエスト
a-1.CHECK_BILLING_SUPPORTED
端末がアプリ内課金に対応しているか検証
a-2.REQUEST_PURCHASE
アプリ内アイテムの購入リクエストを送信
a-3.GET_PURCHASE_INFORMATION
購入または払い戻しのトランザクション情報を受信
a-4.CONFIRM_NOTIFICATIONS
購入または払い戻しのトランザクション情報を受信したことを通知
a-5.RESTORE_TRANSACTIONS
管理された購入のユーザートランザクション履歴を受信
● b. 3つの同期レスポンス
b-1.RESPONSE_CODE
リクエストに対するステータス情報とエラー情報
b-2.PURCHASE_INTENT
PendingIntentを提供する
b-3.REQUEST_ID
非同期レスポンスを特定可能にする
● c. 3つの非同期レスポンス(ブロードキャストインテント)
c-1.com.android.vending.billing.RESPONSE_CODE
課金リクエストが成功したかエラーになったか
c-2.com.android.vending.billing.IN_APP_NOTIFY
購入成功、キャンセル、払い戻し
c-3.com.android.vending.billing.PURCHASE_STATE_CHANGED
トランザクション情報の詳細
アプリ内課金の3つのシナリオ
1.アプリ内課金に対応しているか確認
「アプリ内課金に対応していない場合は、予めアプリ内課金に関するUIを無効にしたい」といった場合に実行します。
購入リクエストのエラーコードでも対応の可否は確認可能。
2.管理された購入の履歴を受信
「過去に購入したライセンスを再度有効にしたい」といった場合に実行します。
プレミアムライセンスの購入後に機種変して再インストールした場合などで必要となります。
インストール直後などのポイントのみで実行されます。
3.購入リクエスト
アイテム購入時に実行されます。
リクエストフロー
リクエストはBillingRequestを継承したクラスで表され、「5つのリクエスト」で表記した5つある。
IMarketBillingServiceへの接続を確認してからリクエストをrun()で実行する。
未接続 → 実行待ちリクエストに追加
接続済み → 実行して送信済みリクエストに追加
送信済みリクエストはc-1を受信したのちに消化される。
BillingRequestをインスタンス化 → mRequest mRequest.runRequest() runIfConnected() IMarketBillingServiceに接続済みなら実行( run() ) 接続してなかったら次(bindToMarketBillingService())へ。 送信済みリクエストにthisを追加 bindToMarketBillingService() IMarketBillingServiceに接続する。 接続できなかったらエラー。 接続できたら実行待ちリクエストにthisを追加 //IMarketBillingServiceの接続イベント onServiceConnected 接続完了したら実行待ちリクエストを実行
アプリのアップロード(非公開)
アイテムの登録
課金テスト
アプリの公開
関連記事
-
-
【android】スリープモードに入らせない
Androidでは一定時間、操作をしないとスリープモードに入って待機状態になってしまいますが、動
-
-
【android】言語・地域設定の取得
androidでは利用する言語と国名がjava.util.Localeのオブジェクトとして設定されて
-
-
【android】リソースからいろいろ取得する
リソースで定義したいろいろをコード内で呼び出す方法です。 レイアウト //リソースからレ
-
-
【android】アプリのバージョン情報を取得する
int versionCode = -1; String versionName = &quo
-
-
【android】 adbコマンド集
●adbサービス起動 adb start-server ●adbサービス終了 adb
-
-
【andoid】ViewPagerを使う
1. layout.xmlにViewPagerを配置 2. PagerAdapter.jav
-
-
【android】任意のスレッドで処理を行う
非UIスレッドでUIを操作したい場合に、任意の処理をUIスレッド上で実行する。 目次
-
-
[android] JSONのパースにかかる時間
リストデータなんかを保存したいというのはよくある要件だと思います。 DBは面倒だしカラム毎に集計す
-
-
【android】ネットワークの接続状況を確認する
コードから接続状況を確認。 ConnectivityManager co
-
-
【android】サービスの実装
ダウンロードなどActivityに依存したくない大きなバックグラウンド処理や常駐プロセスを作りたい場
- PREV
- クラウドサービス・webツールまとめ
- NEXT
- 【iphone】エントリポイント