連載
» 2011年05月13日 00時00分 公開

Androidアプリにアプリ内課金を実装してみようAndroid Marketアプリ内課金サービス徹底解説(2)(4/4 ページ)

[緒方聡,株式会社イーフロー]
前のページへ 1|2|3|4       

Androidアプリ内課金の実装に役立つリファレンス

 以下はアプリ内課金を実装するうえで必要な定数定義や値の意味のリファレンスです。

Android Marketサーバレスポンスコード

 以下のリストは、アプリに送られるAndroid Marketからのサーバレスポンスコードの一覧です。Android Marketはcom.android.vending.billing.RESPONSE_CODEブロードキャストインテントのresponse_codeエクストラで非同期にレスポンスコードを送信します。アプリは、これらのレスポンスコードをハンドリングしなければいけません。

  • RESULT_OK
    リクエストがサーバに送信成功したことを示す
    CHECK_BILLING_SUPPORTEDリクエストに対するレスポンスでこのコードは返され、課金はサポートされていることを示す
  • RESULT_USER_CANCELED
    ユーザーが商品を購入せずに、「戻る」ボタンを押したことを示す
  • RESULT_SERVICE_UNAVAILABLE
    ネットワーク接続がダウンしていることを示す
  • RESULT_BILLING_UNAVAILABLE
    アプリ内課金はAPI_VERSIONの指定がAndroid Marketアプリの要求を満たしていないか、アプリにアプリ内課金を使用する資格がない(例えばユーザーがアプリ内購入を許可していない国に居住しているなど)ため、アプリ内課金が使用できないことを示す
  • RESULT_ITEM_UNAVAILABLE
    Android Marketはアプリの商品リストを見つけられなかったことを示す。これは、もしREQUEST_PURCHASEリクエストで商品IDの“つづり”を間違えている場合や商品がアプリの商品リストに登録されていない場合に引き起こされる
  • RESULT_ERROR
    想定しないサーバエラーを示す
  • RESULT_DEVELOPER_ERROR
    アプリがアプリ内課金リクエストを作成することを試み、しかしアプリのマニフェストにcom.android.vending.BILLINGパーミッションが定義されていないことを示す。「アプリが署名されていない」「リクエストにバンドルキーが存在しない」「リクエストに許可されていないリクエストタイプを使用した」など、誤ったリクエストを送信した場合にも起こる

アプリ内課金サービスのインターフェイス

 以下に、Android Marketアプリ内課金サービスのインターフェイスについて述べます。インターフェイスはアプリ内課金サンプルアプリに含まれるIMarketBillingService.aidlファイルで定義されます。

 インターフェイスは1つの引数を取るsendBillingRequest()メソッドで構成されます。このメソッドはBundleを引数に取ります。Bundleに示されるいくつかの主要なキーと値のペアを含みます。

表2 主要なキーと値
キー タイプ 取り得る値 必須かどうか 詳細
BILLING_REQUEST String CHECK_BILLING_SUPPORTED
REQUEST_PURCHASE
GET_PURCHASE_INFORMATION
CONFIRM_NOTIFICATIONS
RESTORE_TRANSACTIONS
必須 sendBillingRequest()で送信する課金リクエストのタイプ。取り得る値は、前回の「アプリ内課金リクエスト」を参照
API_VERSION int 1 必須 使用しているAndroid Marketアプリ内課金サービスのバージョン。現在のバージョンは、1
PACKAGE_NAME String 正しいパッケージ名 必須 アプリのパッケージ名
ITEM_ID String 正しい商品ID REQUEST_PURCHASEで必須 購入対象商品の商品ID
NONCE long long値 GET_PURCHASE_INFORMATION
RESTORE_TRANSACTIONS
で必須
Android Marketからのレスポンスの完全性を検証するためのナンス
NOTIFY_IDS long[] long値の配列 GET_PURCHASE_INFORMATION
CONFIRM_NOTIFICATIONS
で必須
購入状態変更の詳細を受け取るための通知IDの配列
DEVELOPER_PAYLOAD String 256文字未満 必須ではない 開発者固有文字列。この文字列の目的に関しては、この表の下で説明

 開発者固有文字列は、REQUEST_PURCHASEリクエストを作成する際に指定できます。このフィールドは注文のためのトランザクション情報に含まれるJSON文字列で返されます。開発者は、このキーを使用して注文のための補助情報を送信できます。

 例えば、このキーを注文のインデックスとして使用した場合、購入情報をデータベースに格納する際に便利です。このキーを使用してデータやコンテンツを送信しないことを推奨します。

 表3はそれぞれのリクエストタイプのために戻されるキーを示しています。

表3 アプリ内課金リクエストタイプで戻されるバンドルキーの詳細
リクエストタイプ 戻されるキー レスポンスコードの取り得る値
CHECK_BILLING_SUPPORTED RESPONSE_CODE RESULT_OK
RESULT_BILLING_UNAVAILABLE
RESULT_ERROR
RESULT_DEVELOPER_ERROR
REQUEST_PURCHASE RESPONSE_CODE
PURCHASE_INTENT
REQUEST_ID
RESULT_OK
RESULT_ERROR
RESULT_DEVELOPER_ERROR
GET_PURCHASE_INFORMATION RESPONSE_CODE
REQUEST_ID
RESULT_OK
RESULT_ERROR
RESULT_DEVELOPER_ERROR
CONFIRM_NOTIFICATIONS RESPONSE_CODE
REQUEST_ID
RESULT_OK
RESULT_ERROR
RESULT_DEVELOPER_ERROR
RESTORE_TRANSACTIONS RESPONSE_CODE
REQUEST_ID
RESULT_OK
RESULT_ERROR
RESULT_DEVELOPER_ERROR

アプリ内課金ブロードキャストインテント

 Android Marketアプリが送信するアプリ内課金ブロードキャストインテントについて説明します。これらのブロードキャストインテントはアプリ内課金で発生したイベントをアプリに通知します。アプリはアプリ内課金のサンプルアプリに含まれるBillingReceiverのようなBroadcastReceiverを実装しなければいけません。

  com.android.vending.billing.RESPONSE_CODE

 このブロードキャストインテントはAndroid Marketレスポンスコードを含み、アプリ内課金リクエストを作成した後に送信されます。サーバレスポンスコードは課金リクエストがAndroid Marketに送信成功したことを、または課金リクエスト中にいくつかのエラーが発生したことを示します。

 このインテントは購入状態変更(払い戻しや購入情報など)を報告するために使用されません。このレスポンスで送信されたレスポンスコードの詳細な情報については、「アプリ内課金のためのAndroid Marketレスポンスコード」を参照してください。サンプルアプリはACTION_RESPONSE_CODEと命名された定数に、このブロードキャストインテントが割り当てられています。

 エクストラは、以下です。

  • request_id
    longで表されるリクエストIDです。リクエストされるとき、リクエストIDはその課金リクエストを特定し、Android Marketによって戻される
  • response_code
    intで表されるAndroid Marketサーバレスポンスコード

  com.android.vending.billing.IN_APP_NOTIFY

 このレスポンスは購入状態が変更されたことを示します。つまり、購入成功、キャンセル、払い戻しを意味します。このレスポンスは1つ以上の通知IDを含みます。それぞれの通知IDはサーバサイドメッセージと一致し、それぞれのメッセージは1つ以上のトランザクション情報を含みます。

 アプリがIN_APP_NOTIFYブロードキャストインテントを受信した後、GET_PURCHASE_INFORMATIONリクエストを通知IDと一緒にメッセージの詳細を受信するために送ります。サンプルアプリでは、ACTION_NOTIFYと命名された定数が、このブロードキャストインテントに割り当てられています。

 エクストラは、以下です。

  • notification_id
    Stringで表される購入状態変更のための通知ID。Android Marketは購入状態が変更されたときにアプリに通知し、通知はユニークな通知IDを含む。購入状態変更の詳細を取得するために、アプリはGET_PURCHASE_INFORMATIONリクエストと一緒に通知IDを送信する

  com.android.vending.billing.PURCHASE_STATE_CHANGED

 このブロードキャストインテントは1つ以上のトランザクション情報の詳細を含みます。トランザクション情報はJSON文字列を含みます。JSON文字列は署名されていて、シグネチャは(暗号化されていない)JSON文字列と一緒にアプリに送信されます。

 アプリ内課金メッセージの安全性を確立する補助として、アプリはJSON文字列のシグネチャを検証できます。サンプルアプリではこのブロードキャストインテントはACTION_PURCHASE_STATE_CHANGEDと命名された定数に割り当てられています。

 エクストラは、以下です。

  • inapp_signed_data
    Stringで表される署名されたJSON文字列
  • inapp_signature
    Stringで表されるシグネチャ

 アプリはブロードキャストインテントとエクストラをアプリ内でユニークな定数にマッピングするべきです。サンプルアプリのConsts.javaを参照すれば、その方法が分かります。

 JSON文字列のフィールドは以下のようになっています。

  • nonce
    ナンス。アプリはナンスを生成し、GET_PURCHASE_INFORMATIONリクエストで送信。Android MarketはJSON文字列の一部としてナンスを返し、アプリは返されたナンスを使用してメッセージの完全性を検証できる
  • notificationId
    IN_APP_NOTIFYブロードキャストインテントで送信されるユニークなID。それぞれのnotificationIdはAndroid Marketサーバ上の受領待ちメッセージと一致。アプリはGET_PURCHASE_INFORMATIONメッセージと一緒にnotificationIdを返信し、Android Marketはどのメッセージをアプリが受信したかを知ることができる
  • orderId
    トランザクションのためのユニークな注文ID。これはGoogleチェックアウトの注文IDと一致
  • packageName
    アプリのパッケージ名
  • productId
    商品ID。すべてのアイテムはAndroid Market開発者サイトのアプリ商品リストで指定された商品IDを持つ
  • purchaseTime
    商品が購入された時間で、エポックタイム(1970年1月1日)からの経過ミリ秒
  • purchaseState
    注文の状態。0が購入済み、1がキャンセル、2が払い戻し
  • developerPayload
    注文のための補助情報を含む開発者固有文字列。アプリは、このフィールドに特定の値を持たせ、REQUEST_PURCHASEリクエストを作成

アプリ内課金はマッシュアップによる開発だ

 サンプルを通じてアプリ内課金の実装方法と、開発者自身のアプリへのアプリ内課金を実装する方法を見てきました。もし、マッシュアップによるアプリ開発を経験したことがあるなら、「アプリ内課金はマッシュアップによる開発だ」ということを理解していただけたのではないかと思います。

 また、開発に必要なリファレンスもまとめたので、実際に開発を行う際に参照してください。

 次回は、アプリ内課金の管理、テスト方法、セキュリティと設計に関して説明します。


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。