2013年5月31日金曜日

Amazon In-App Purchasing API (アプリ内課金) テスト方法

Amazon Distribution Portalの公式マニュアル(英語)は下記URL先です。
(https://developer.amazon.com/sdk/in-app-purchasing/documentation/testing-iap.html)
開発環境と動かしたいアプリが揃ったら、次は動かす環境の整備です。

Amazon SDK APIのテストについて

 Amazon In-App Purchasing API には、検証環境というものが存在しません。しかも、Amazon SDK APIを通じてAmazon Client経由で通信を行う為には、Distribution Portalを通じて公開されているアプリでなければなりません。

SDK Tester

 それじゃ公開するまでテストもできないの?そんな訳ありません。Amazonはテストの為のAmazon Clientの動きをエミュレートするアプリを用意しています。

"SDK Tester" は、Amazon SDK の開発者がアプリ公開前に本番環境を想定してテストすることができる開発ツールです。これにより開発者は、Amazon SDK APIによって生成される全てのレスポンスをカバーするテストをアプリ公開前に実行できます。Amazonは、このSDK Testerでテストして動作したコードは本番でも同じく動作することを保証しています。

 SDK Testerでは、テストユーザーの購入情報(レシート)を消したり、キャンセル処理を行うことができます。また、ユーザーを変更したり、IAP-APIのレスポンスステータスを任意に変更することができます。

SDK Tester の仕組み

 IAP-APIは、動作しているアプリがDistribution Portalで公開されているアプリかどうかを判別し、公開されていない(開発中の)アプリである場合、SDKTesterアプリへ接続します。(もちろんSDK Testerをインストールしていないとだめですが。。。)

 公開後は勝手にIAP-APIがAmazonClient側へ接続しに行ってくれるので、テスト時と本番時に設定を変えるとかの差異がなく非常に便利です。

SDK Tester のインストール

 Amazon Distribution Portal (https://developer.amazon.com/sdk.html) からダウンロードできる、Amazon SDK (Apps-SDK.zip)に含まれています。

格納されている場所は、
"<Apps-SDK.zipを解凍したディレクトリ>/Apps-SDK/InAppPurchasing/tools/AmazonSDKTester.apk"です。

この AmazonSDKTester.apk を デバイスにインストールします。
※インストールには、Android 2.3.3 (Android API Level 10) 以上の端末が必要です。
 Kindleなら第1世代からインストールできます。

Windowsならコマンドプロンプトから以下のコマンドでインストールできます。
※<Android SDKのインストールされているディレクトリ>\sdk\platform-toolsへパスを通しておいてください。

C:\>adb install -s <デバイスID> <App-SDK.zipを解凍したディレクトリ>\Apps-SDK\InAppPurchasing\tools\AmazonSDKTester.apk
デバイスIDの調べ方は、"adb devices" コマンドで接続されているデバイス、エミュレータのデバイスIDを確認することができます。

アイテムデータ定義ファイルの準備

 Distribution Portalでも課金アイテムは定義しなければなりませんが、同じくSDK Testerにも課金アイテムの定義が必要です。
SDK Testerでは、JSONファイルで課金アイテムの定義を行います。

 SDK Testerは、デバイスの "/mmt/sdcard/amazon.sdktester.json"ファイルを読み込み、その情報をもとにIAP-APIへレスポンスしてくれます。 このときJSONファイルに定義する課金アイテムの情報へ本番と同じデータを入力できるのがいいところです。

  • 定義構造

     amazon.sdktester.json の定義はJSON形式に従い、以下のような構造で行います。この時、SKUの順序は関係ありません。
    {
        SKU_1:{IAP_Item_1_Description},
        SKU_2:{IAP_Item_2_Description},
        .
        .
        .
        SKU_n:{IAP_Item_n_Description
    }
            
    上記のとおり、複数のSKUを並べて定義できます。この時、SKU定義間の "," に注意してください。尚、コンテンツタイプによって項目の定義内容は異なります。

  • 定義要素:Consumable / Entitled

     Consumable Content(消費型コンテンツ)と Entitled Content(買いきり型コンテンツ)の課金アイテム定義項目は以下のとおりです。
    {
      ...
      ”(SKU文字列)” : 
      {
        "itemType": "ENTITLED" または "CONSUMABLE", 
        "price": (金額の数字),
        "title": "(商品名称)"
        "description": "(商品説明文)",
        "smallIconUrl": "(商品画像アイコン(サムネイル)URL)"
      }
      ...
    }
            

  • 定義要素:Subscription

     期間購入(Subscription)型コンテンツのアイテム定義項目は以下のとおりです。
    {
      ...
      ”com.amazon.buttonclicker.subscription.1mo (SKU文字列)” : 
      {
        "itemType": "SUBSCRIPTION",
        "price": (金額の数字),
        "title": "(商品名称)",
        "description": "(商品説明文)",
        "smallIconUrl": "(商品画像アイコン(サムネイル)URL)",
        "subscriptionParent": "com.amazon.buttonclicker.subscription"
      }
       ...
    }
            
     定義自体はほとんど変わりません。しかし、他と大きく違うのが "subscriptionParent"(親SKU)を指定している点です。 サブスクリプションの親SKUは、サブスクリプションが何のためにあるのかを表します。そしてその親SKUに紐づく子SKUは、価格や期間を表す条件のSKUとなります。
     この紐付けを行うことで、例えば「○○新聞の定期購読」の「1か月間のサブスクリプション」を購入したのに、 「1週間のサブスクリプション」を重複して買うことを防ぐことができます。

SDK Testerの使い方

 SDKテスターのスタート画面です。真ん中の3つのボタンをタップすると、それぞれの機能の画面を表示します。


  • Active Transactions

     有効な取引情報を表示します。また、テストの為にその取引をキャンセル(返品)すること取引情報をクリアすることができます。

  • Change Logged in User

     現在ログイン中のユーザー名を表示します。またログイン中のユーザー名を変更することができます。

  • Interactive Mode Preferences

     IAP-APIからのレスポンスを任意に設定できます。



    1. Purchase API

      PurchasingManager.initiatePurchaseRequest() -> ObserverのonPurchaseResponse()へのレスポンスの設定。
      • Default:正常
      • Already Entitled:既に購入済み
      • Invalid Sku:SKUが不正
      • Failed:リクエスト失敗
    2. Purchase Updates API

      PurchasingManager.initiatePurchaseUpdatesRequest() -> ObserverのPurchaseUpdatesResponse()へのレスポンスの設定。
      • Default:正常
      • Failed:リクエスト失敗
    3. Item Data API

      PurchasingManager.initiateItemDataRequest() -> ObserverのonItemDataResponse()へのレスポンスの設定。
      • Default:正常
      • Failed:リクエスト失敗


 これでアプリ内課金処理周りのテストケース前パターンをサクサクこなすことができます。

0 件のコメント:

コメントを投稿