連載
» 2011年06月17日 00時00分 公開

Androidアプリ内課金の管理・テスト・セキュリティの8つのポイントAndroid Marketアプリ内課金サービス徹底解説(3)(2/3 ページ)

[緒方聡,株式会社イーフロー]

アプリの商品リストの作成手順

 アプリの商品リストは以下の手順で作成します。

  1. 開発者アカウントにログイン
  2. 「All Android Market listings」パネルのアプリ名の下の「In-app Products」をクリック
  3. アプリ内商品ページで「Add in-app product」をクリック
  4. 「Create New I-app Product」ページ(図4)で提供される、販売する商品の詳細情報を入力して保存
図4 「Create New In-app Products」ページでアプリの商品リストにアイテムを追加 図4 「Create New In-app Products」ページでアプリの商品リストにアイテムを追加

 商品リストには、以下の情報を入力する必要があります。

In-app Product ID

 商品IDはアプリでユニークでなければいけません。商品IDは小文字(a〜z)または数字(0〜9)で始まる必要があり、小文字(a〜z)、数字(0〜9)、アンダースコア(_)、ピリオド(.)が続きます。商品ID「android.test」「android.test.」で始まるIDは予約されているので使えません。

 商品IDは、作成後は変更できず、以前に削除された商品が使用していた商品IDも再利用できません。

 商品IDと商品リストに関する詳細な情報は、「アプリ内課金商品ID作成」を参照してください。

Purchase type

 「アカウント単位で管理」「管理なし」のいずれかの購入タイプです。購入タイプは、開発者サイトでのみ指定可能で、指定した後は変更できません。

  「アカウント単位で管理」タイプ

 「アカウント単位で管理」タイプはアカウントにつき一度だけ購入できます。商品が「アカウント単位で管理」であるとき、Android Marketはトランザクション情報を商品ごとにユーザー単位で永続的に保存します。これは、アプリが「RESTORE_TRANSACTIONS」リクエストでAndroid Marketに問い合わせ、そして特定のユーザーが購入した商品の状態を元どおりにすることを可能にします。

 ユーザーが購入済み商品の購入を試みた場合、Android Marketは「すでに購入されたアイテムです」というエラーを表示します。これは、チェックアウト中に起こりますが、そのときAndroid Marketはチェックアウトページに価格と詳細情報を表示します。ユーザーがエラーメッセージを閉じるときに、チェックアウトページも閉じられ、アプリの画面に戻ります。

 ユーザーには、このエラーを見せないようにした方がいいでしょう。サンプルアプリでは、ユーザーに購入済みの商品を選択させないように制御しています。アプリは項目をグレーアウトするか、表示しないなどの方法で、ユーザーに選択させないようにすることをお勧めします。

 「アカウント単位で管理」タイプはゲーム難易度やアプリの機能などを販売する際に便利です。それらのアイテムは一時的なものではなく、ユーザーがリセットによるアプリの再インストールや、新しいデバイスにアプリをインストールしたときなどに常に必要となるからです。

  「管理なし」タイプ

 「管理なし」タイプでは、Android Market上にトランザクション情報を保存しません。つまり、アプリはAndroid Marketにトランザクション情報の問い合わせができまないので、アプリ側で、「管理なし」タイプ商品のトランザクション情報を管理する必要があります。

 また多くの場合、「管理なし」タイプの商品は複数回購入可能である必要があり、何回購入できるかに関してはアプリによって管理されます。例えば、「管理なし」タイプは、「魔法の触媒」などの消耗品を販売する際に便利です。これらのアイテムはアプリ内の消耗品で、普通は複数回購入可能です。

Publishing State

 「公開」「非公開」を選択します。ユーザーのチェックアウト時に商品が表示されるためには、公開状態が「公開」にセットされる必要があり、またアプリはAndroid Marketで公開されている必要があります。

 なおテストアカウントでは、アプリが公開されていなくても商品が公開されていれば、商品が表示されます。詳細は「アプリ内課金の実装をテストするには」を参照してください。

Language

 商品リストの言語はアプリから継承されます。

Title

 タイトルはアイテムの短い詳細です。例えば、「スリープポーション」などです。すべてのアイテムにはタイトルが必要で、アプリ内でユニークでなければいけません。ユーザーがチェックアウトする際に表示されます。55文字まで付けられますが、見た目上、25文字以内に収めるべきです。

Description

 アイテムについての、詳細な情報です。例えば、「モンスターを即座に眠らせます。怒っている妖精には効果がありません。」などです。すべてのアイテムには詳細情報が必要です。詳細情報はユーザーがチェックアウトする際に表示されます。詳細情報は80文字まで入力できます。

Price

 すべてのアイテムの価格は、0より上の数値でなければいけません。価格には、0をセットできません。

 価格についての詳細な情報は、「アプリ内課金の価格設定」を参照してください。

アプリ内課金の実装をテストするには

 開発者サイトでは、アプリの公開前にアプリ内課金実装をテストするためのツールを提供しています。テストアカウントの作成と、特別に予約されたアイテムを購入することで、アプリに課金レスポンスを静的に送信するために、これらのツールを使用できます。

 アプリでアプリ内課金をテストするためには、エミュレータは使えません。Androidがサポートされたデバイスにアプリをインストールする必要があります。デバイスはAndroid 1.6以上(APIレベル4以上)で、最新のAndroid Marketアプリがインストールされている必要があります。最新版でないと、アプリは課金リクエストをAndroid Marketに送信できません。

静的レスポンスによるアプリ内購入テスト

 最初に、アプリ内課金実装のテストとして、静的レスポンスをAndroid Marketから送信することをお勧めします。これによって、「アプリが主要なAndroid Marketのレスポンスを正確に処理するか」「アプリが正確にシグネチャを検証できるか」を確認できます。

 静的レスポンスで実装をテストするには、予約された商品IDを持つ特別なアイテムを使用して、課金リクエストを作成します。それぞれの予約された商品IDは、Android Marketから静的レスポンスとして戻されます。予約されたIDで課金リクエストを作成しても費用は掛かりません。

 また、予約された商品IDで課金リクエストを作成したときは支払いフォームを指定できません。図5は、予約された「android.test.purchased」を持つ商品IDのチェックアウト処理です。

図5 特別に予約されたID「android.test.purchased」のチェックアウト処理 図5 特別に予約されたID「android.test.purchased」のチェックアウト処理(クリック拡大)

 アプリの商品リストに予約された商品は、追加の必要はありません。Android Marketは、すでに予約された商品IDを持っています。また、静的レスポンスのテストを実施するのに、開発者サイトにアプリケーションをアップロードする必要もありません。開発者はデバイスにアプリをインストールし、デバイスにログインして予約された商品IDで課金リクエストを作成します。

4つの予約された商品ID4

 静的テストのためのアプリ内課金レスポンスは以下の4つの予約された商品IDがあります。

  【1】android.test.purchased

 この商品IDでアプリ内課金のリクエストを作成したとき、Android Marketは商品購入成功のレスポンスを送信します。レスポンスは偽の購入情報(例えば、偽の注文ID)のJSON文字列を含みます。詳細は後述しますが、署名されたレスポンスはシグネチャを含むこともあるので、開発者はこれらのレスポンスをシグネチャ検証実装のテストに使用できます。

  【2】android.test.canceled

 この商品IDを使用して課金リクエスト作成したとき、Android Marketは購入キャンセルのレスポンスを送信します。不正なクレジットカードが使用された場合や、開発者が課金前に注文をキャンセルするなど、実際の注文処理で起こりうるエラーです。

  【3】android.test.refunded

 この商品IDを使用して課金リクエストを作成したとき、Android Marketは払い戻しのレスポンスを送信します。

 前述のように、払い戻しは、Android Marketアプリ内課金サービスでは行わないので、開発者が、払い戻しリクエスト処理の後で、開発者自身のGoogleチェックアウトアカウントを通して、払い戻しリクエストをAndroid Market経由でアプリに送信する必要があります。これは、Android MarketがGoogleチェックアウトから払い戻しが行われたという通知を受けたときにのみ発生します。

 払い戻しに関する詳細な情報については、「IN_APP_NOTIFYメッセージのハンドリング」「アプリ内課金の価格設定」を参照してください。

  【4】android.test.item_unavailable

 この商品IDを使用して課金リクエストを作成したとき、Android Marketはアプリの商品リストに存在しない商品購入のレスポンスを送信します。

 次ページでは、アプリのシグネチャ検証テスト、予約された商品IDで課金リクエストを作成する手順、実際の商品IDを使用したアプリ内購入のテスト、設計・実装における8つのセキュリティ対策ポイントについて説明します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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