Androidでアプリ内課金(In-App Billing)をわかりやすく整理する。

アプリを単体で売るよりか,「親アプリ無料」の「子アイテム有料」な大手ゲームプラットフォーム的なのが流行るのか。などと思いながらもまあとりあえず,コピペですぐつくれるようにしておく。

サンプルを動かす

なんでもサンプルから動かしてとりあえずモチベーションを高める。

2.3 アプリ内課金の実装 - ソフトウェア技術ドキュメントを勝手に翻訳 

Implementing In-app Billing | Android Developers 

サンプルリソースを入手

GoogleMarket billing Package というアドオンをいれると,SDKディレクトリ以下にサンプルリソースが展開される。


android-sdk-linux_86/google-market_billing/
├── AndroidManifest.xml
├── README
├── default.properties
├── res
│   ├── drawable-hdpi
│   │   └── icon.png
│   ├── drawable-ldpi
│   │   └── icon.png
│   ├── drawable-mdpi
│   │   └── icon.png
│   ├── layout
│   │   ├── billing_not_supported.xml
│   │   ├── edit_payload.xml
│   │   ├── item_row.xml
│   │   └── main.xml
│   └── values
│   ├── colors.xml
│   └── strings.xml
├── source.properties
└── src
└── com
├── android
│   └── vending
│   └── billing
│   └── IMarketBillingService.aidl
└── example
└── dungeons
├── BillingReceiver.java
├── BillingService.java
├── Consts.java
├── Dungeons.java
├── PurchaseDatabase.java
├── PurchaseObserver.java
├── ResponseHandler.java
├── Security.java
└── util
├── Base64.java
└── Base64DecoderException.java

キーを入手してサンプルコードに貼る

http://market.android.com/publish から プロフィール編集で public key をコピーする。

サンプル手順まとめ

  1. キーを貼りつけてパッケージ名リネームAPKを作成。
  2. マーケットにドラフトでsave。
  3. 子アプリの価格とか名前やIDとか価格をマーケットから登録(サンプルは,sword_001,potion_001)
  4. apkを adb install で実機にインストール
  • アプリの署名キーは,公開用のものを利用して,adb install xxx.apk で実機インストール。

実機に転送(Install)したapkファイルはデベロッパーコンソールにアップしたものと同じ「署名済み」のモノでしょうか?デバッガで転送したapkだとでベコンにアップされているものとでは署名が一致しないためエラーが出ます。開発ガイドにも記載されています。
http://developer.android.com/intl/ja/guide/market/billing/billing_testing.html#billing-testing-real

※署名済みアプリ転送方法
adb install "署名済みアプリ.apk"

In-app Billing試してみた その1 - hyoromoの日記 

Issues - marketbilling - Android Market In-App Billing - Google Project Hosting 

In-app Billingの問題点 - isherの日記 

Y.A.M の 雑記帳: Android In-app Billing Overview 

注意 : サンプルアプリのデバッグログはデフォルトではオフになっています。Consts.java ファイルの DEBUG を true に設定することでオンにできます。

Androidのド肝 » アプリ内課金(in-app billing)が一部端末で動作しない 

In-app Billingでsignatureの検証をサーバサイドで行う - isherの日記 

2.3 アプリ内課金の実装 - ソフトウェア技術ドキュメントを勝手に翻訳 

サンプルは動いた

  1. 表示されるプルダウンで「android.test.purchased」を選択して「Buy」を押す。
  2. 「タイトルの例」という商品の購入確認画面が表示されて,そこでお支払い方法を選択部分をタップ。
  3. 「VISAxxx-FAKE」を選択することができるようになるので選択。
  4. 「同意して購入」ボタンがアクティブ化される。
  5. それを押すことで購入完了な画面へ。
サンプルアプリのような典型的な実装は、以下のコードを書く必要があります。
・ユーザー購入情報を保存するための仕組みの作成
・購入アイテム選択用のUIを作成
サンプル内のDungeons.javaは上記の両方を行っています。

コンテンツ配信サーバ側はどうなるのか

自分で用意するそうなのだが。

In-app Billingのドキュメントを読む(1) - fkm 〜 Super Software Entertainerへの道 〜 

android in-app Billingのサーバ側チェック - 私事ですが…… 

POSTでアプリから投げてサーバで取るか。
利用できるデータはこの辺なのだろう。

  $id = $_POST['id'];
  $signedData = $_POST['signedData'];
  $signature = $_POST['signature'];

まとめると

  • 子アプリの決済関連はマーケットサーバ側にまかせる。
  • 購入してるかどうかはアプリ内に保存しておく。
  • 購入してるかどうか参照しながらその機能を有効にする。
  • または,独自サーバにリクエストしてコンテンツとかダウンロードするならする。

ということとか,まあ当たり前かも。