More Related Content
Similar to Androidのアプリ内課金 (20)
Androidのアプリ内課金
- 1. Developers
Summit
Androidのアプリ内課金
In-app Billing of Android
15-C-1 瀬戸 健二
パナソニックAVCマルチメディアソフ
ト(株)
Developers Summit 2013 Action !
- 3. Developers
Summit
自己紹介
• 瀬戸 健二(28)
– パナソニックAVCマルチメディアソフト(株)
– 航空機エンターテイメントシステム開発、
モバイルアプリ開発
– Android、Linux、マイコンなどが得意
– 元TechBoosterメンバー
– Twitter
• @rongon_xp
Developers Summit 2013 Action !
- 5. Developers
Summit
本日のテーマ
• アプリ内課金プログラミング完全ガイド
では
In-app Billing(IAB) v2について解説
• 発売直後にIABv3が発表・・・。
• 今日はIABv3について
お話させて頂きます
Developers Summit 2013 Action !
- 6. Developers
Summit
IABv3特徴
• 実装がとても簡単に。
– v2では100行以上、v3では50行程度に。
• 非同期処理の排除とローカルキャッシン
グ
– 高速なAPI実行が可能に。
– セキュリティ向上
• 購入情報の管理
• アイテム情報の参照
Developers Summit 2013 Action !
- 7. Developers
Summit
Androidアプリ内課金 - 概要
• Playストアサーバ上に存在する購入情報を更新す
る
• アプリからはPlayストアアプリを介してPlayスト
アサーバにアクセスする
購入情報
Developers Summit 2013 Action !
- 9. Developers
Summit
IABv2のアプリ構成
• 課金リクエストを送信するためのサービス
• 非同期メッセージを受け取るためのブロードキャストレ
シーバ
• アプリケーションに通知するためのレスポンスハンドラ
と
オブザーバ
Developers Summit 2013 Action !
- 10. Developers
Summit
IABv3の購入シーケンス
getBuyIntent()
Bundle
(RESPONSE_CODE, BUY_INTENT)
Play
Your
Store
App startIntentSenderForResult() App
IAB API
Bundle
(RESPONSE_CODE, INAPP_PURCHASE_DATA, 同期レスポンス
INAPP_SIGNATURE)
Developers Summit 2013 Action !
- 11. Developers
Summit
IABv3のアプリ構成
• 同期処理になったため、アプリ構成がシ
ンプルになった
Playストアアプリ
アプリ本体
InAppBilling
bind Service
セキュリ
ティ
Developers Summit 2013 Action !
- 13. Developers
Summit
アイテムの購入(1)
• IInAppBillingService.getBuyIntent()で購入画面を起
動
// 購入画面を起動するためのインテントを取得
Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(),
sku, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
PendingIntent pendingIntent =
buyIntentBundle.getParcelable("BUY_INTENT");
// インテントを使って購入画面を起動する
startIntentSenderForResult(pendingIntent.getIntentSender(),
1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
Integer.valueOf(0));
Developers Summit 2013 Action !
- 14. Developers
Summit
アイテムの購入(2)
• 購入結果はonActivityResult()に返される
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == mRequestCode) {
int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
if (resultCode == RESULT_OK) {
// 購入処理
}
}
}
Developers Summit 2013 Action !
- 16. Developers
Summit
アイテムの消費(1)
• IABv3ではすべての購入情報がPlayストア
サーバで管理
• 消費しないと再購入できない
– 消費型 : 購入が完了したら消費処理を実施
– 非消費型 : 購入が完了しても消費処理をしな
い
Developers Summit 2013 Action !
- 17. Developers
Summit
アイテムの消費(2)
• 消費型アイテムの場合はconsumePurchaseを実行
することで再購入できるようにする
• INAPP_PURCHASE_DATAに含まれている
purchaseTokenを指定する
int response =
mService.consumePurchase(3, getPackageName(),
purchaseToken);
Developers Summit 2013 Action !
- 19. Developers
Summit
うまく動かないとき(1)
• テストアカウントを設定していない
– Androidデバイスのプライマリアカウントに設
定
• 公開鍵をアプリに設定していない
– Developer Consoleで取得可能
• Playストアにアプリ/課金アイテムを登録
した直後
– 反映されるのに数時間〜数日かかることがあ
る
Developers Summit 2013 Action !
- 20. Developers
Summit
うまく動かないとき(2)
• アプリの署名が不正
– Playストアに登録している署名と一致してい
る必要がある
• アプリの公開設定
– 公開設定にすると動作する場合も・・・。
Developers Summit 2013 Action !
- 21. Developers
Summit
どちらを使えばいいのか?
• v3は定期購読未サポート
– アプリ内課金アイテムのみであればv3でok
• 簡単に実装したいのであればv3
Developers Summit 2013 Action !
- 24. Developers
Summit
アイテムの販売形式
• 消耗型
– ゲーム上のお金、ポーションなど使用すると消耗してしまうも
の
• 非消耗型
– アプリ上の機能制限のアンロックなど、購入することで永続的
に効果が持続されるもの
• 購読型
– 定期的な課金によって効果が持続されるもの
Developers Summit 2013 Action !
- 26. Developers
Summit
IABv3 Sample App
• サンプルアプリケーションをダウンロード
– Extras -> Google Play Billing Library
• Eclipseにインポート
• サンプルアプリを修正
– パッケージ名を変更
– 公開鍵を設定
• アプリをPlayストアにアップロード
• アップロードしたapkをadb install
Developers Summit 2013 Action !
- 27. Developers
Summit
INAPP_PURCHASE_DATA
• Playストアより得られる購入情報
02-11 10:27:39.908: D/IabHelper(7688): Extras:Bundle[{INAPP_PURCHASE_DATA={
"orderId":"12999763169054705758.1368594429841055",
"packageName":"org.dyndns.ideon.trivialdrivesample",
"productId":"gas",
"purchaseTime":1360578449000,"purchaseState":0,
"purchaseToken":"w…,
RESPONSE_CODE=0}]
Developers Summit 2013 Action !
- 29. Developers
Summit
購入シーケンス(IABv3)
購入情報
購入情報
IABv3では不要
Developers Summit 2013 Action !
- 30. Developers
Summit
アイテム情報の参照(1)
• 購入可能なアイテム情報を取得可能
– セール価格など簡単に実現
getSkuDetails()
Bundle Play
Your
(RESPONSE_CODE, DETAILS_LIST) Store
App
App
Developers Summit 2013 Action !
- 31. Developers
Summit
アイテム情報の参照(2)
• getSkuDetails()でアイテム情報を参照
// サービスIDのリストを作成
ArrayList skuList = new ArrayList();
skuList.add("premiumUpgrade");
skuList.add("gas");
Bundle querySkus = new Bundle();
querySkus.putStringArrayList(“ITEM_ID_LIST”, skuList);
// アイテム情報を取得
Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), “inapp”,
querySkus);
Developers Summit 2013 Action !
- 32. Developers
Summit
アイテム情報の参照(3)
• アイテムの価格を取得する
int response = skuDetails.getInt("RESPONSE_CODE");
if (response == 0) {
ArrayList responseList
= skuDetails.getStringArrayList("DETAILS_LIST");
for (String thisResponse : responseList) {
JSONObject object = new JSONObject(thisResponse);
String sku = object.getString("productId");
String price = object.getString("price");
if (sku.equals(“premiumUpgrade”)) mPremiumUpgradePrice = price;
else if (sku.equals(“gas”)) mGasPrice = price;
}
}
Developers Summit 2013 Action !
- 33. Developers
Summit
アイテムの消費(1)
• 消費しないと再購入できない
– 消費型 : 購入が完了したら消費処理を実施
– 非消費型 : 購入が完了しても消費処理をしな
い getPurchase()
Bundle
(INAPP_PURCHASE_ITEM_LIST, etc)
Play
Your
consumePurchase() Store
App
App
SUCCESS/FAILURE
Developers Summit 2013 Action !
- 34. Developers
Summit
Playストアからの非同期レスポンス(IABv2)
• com.android.vending.billing.RESPONSE_CODE
– レスポンス
• com.android.vending.billing.IN_APP_NOTIFY
– Playストアサーバ上にある購入情報が更新されたことを示す
• com.android.vending.billing.PURCHASE_STATE_CHANGED
– 1つ以上のトランザクション情報
Developers Summit 2013 Action !