*

【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
	接続完了したら実行待ちリクエストを実行

アプリのアップロード(非公開)

アイテムの登録

課金テスト

アプリの公開

関連記事

no image

[android] モンキーテスト(Monkey Test)を実行する

最近テストの効率化に目覚めました。 モンキーテストは猿にアプリを渡してみてめちゃくちゃな操作をさせ

記事を読む

no image

【android】ネットワークの接続状況を確認する

コードから接続状況を確認。 ConnectivityManager co

記事を読む

no image

【android】 年月だけのDatePicker

final DatePicker datePicker = new DatePicker(sel

記事を読む

no image

【android】処理時間を計測する

パフォーマンスのリファクタリングを行うには処理時間の計測がかかせません。 SDK標準のクラスを使っ

記事を読む

no image

【android】 APIバージョンによる動作の違い

「最近使用したアプリケーション」からの起動 2.x系 -> onNewIntentが呼ばれる 4

記事を読む

no image

【andoid】ViewPagerを使う

1. layout.xmlにViewPagerを配置  2. PagerAdapter.jav

記事を読む

no image

インテント

基本 //任意のアクティビティの起動 Intent intent = new

記事を読む

no image

【android】リソースからいろいろ取得する

リソースで定義したいろいろをコード内で呼び出す方法です。 レイアウト //リソースからレ

記事を読む

no image

【android】IMEの表示/非表示

//IMEを閉じる InputMethodManager inputMethodManager

記事を読む

no image

【android】stringsリソースにパラメータを埋め込む

●strings.xml %n$x n : 引数に渡す際の順番。n番目の引数。 x

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

no image
知らないと損をする6つのライセンスまとめ

オープンソースやフリーウェア、フリー素材などが巷に溢れ、それらを利用す

no image
ガリレオ:ニュースブラウザをリリースしました。

概要 ガリレオはニュースを読んだり、検索する機能に特化したブラウザア

no image
【android】Activityとプロセスのライフサイクル

またもやライフサイクル周りでハマったのですが、Androidのライフサ

→もっと見る

PAGE TOP ↑