RVS本番環境のセットアップ手順


RVS本番環境のセットアップ手順

アプリを公開したら、アプリサーバーをセットアップして、RVS本番サーバーと通信するように設定できます。RVSは共有シークレットをホストしているため、セキュリティで保護されたサーバーから呼び出すことを推奨します。アプリからはRVSサービスを呼び出さないでください。

アプリサーバーが既にRVS Sandboxを使用するようにセットアップされている場合は、ホストを「http://localhost:8080/RVSSandbox」から「https://appstore-sdk.amazon.com」に変更する必要があります。

また、使用している共有シークレットが正しいことをこの時点で確認してください。RVS Sandboxでは共有シークレットは無視されますが、RVS本番サーバーでは、共有シークレットが無効なリクエストは拒否されます。共有シークレットは、下記Amazonアプリストアの開発者アカウントの [共有キー] ページで確認できます。

https://developer.amazon.com/sdk/shared-key.html

アプリサーバーは、開発者が選択した言語とテクノロジーでセットアップできます。サーバーとRVSとの通信は、HTTPSなどのセキュリティで保護されたプロトコルを使用して安全に行う必要があります。サーバーでは、RVSに検証リクエストを送信し、レスポンスを処理します。

JSONレスポンスを解析するために、プロジェクトには、前提条件としてJacksonなどのJSON解析ライブラリを追加する必要があります。

以下で紹介しているのは、汎用Javaサーバー用のサンプルコードです。このコードのverifyReceipt()では、以下が実行されます。

  1. 適切な開発者情報とトランザクション情報を使用してURL文字列を作成します。
  2. Amazon RVSサーバーに接続し、トランザクションURLを渡します。
  3. Amazon RVSサーバーからレスポンスを取得します。
  4. レスポンスをアプリに渡します。
  public static void verifyReceipt(final String developerSecret, final String userId, final String receiptId) {
    System.out.println("レシート検証を開始します");

    String url = "https://appstore-sdk.amazon.com/version/1.0/verifyReceiptId/developer/" + developerSecret + "/user/" + userId + "/receiptId/" + receiptId;

    System.out.println("Amazonレシート検証URL:" + url);

    try {
        System.out.println("Amazon RVSへのHTTP接続を開きます");

        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        int responseCode = con.getResponseCode();

        System.out.println("Amazon RVSレスポンスコード: " + responseCode);

        switch (responseCode)
        {
            case 400:
                System.out.println("Amazon RVSエラー: 無効なreceiptID");
                // レスポンスデータをローカルで処理します
                // アプリに応答します
                break;

            case 496:
                System.out.println("Amazon RVSエラー: 無効なdeveloperSecret");
                // レスポンスデータをローカルで処理します
                // アプリに応答します
                break;

            case 497:
                System.out.println("Amazon RVSエラー: 無効なuserId");
                // レスポンスデータをローカルで処理します
                // アプリに応答します
                break;

            case 500:
                System.out.println("Amazon RVSエラー: 内部サーバーエラー");
                // レスポンスデータをローカルで処理します
                // アプリに応答します
                break;

            case 200:

                //Amazon RVSレスポンスを取得します
                BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream()));

                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                //Amazon RVSレスポンスをログに記録します
                System.out.println("Amazon RVSレスポンス:" + response.toString()());

                //RVSレスポンスのJSONObjectを作成します
                JSONObject responseJson = new JSONObject(response.toString());

                //RVSレスポンスを解析します
                JSONObject responseJson = new JSONObject(response.toString());
                String receiptId = responseJson.getString("receiptId");
                String productType = responseJson.getString("productType");
                String productId = responseJson.getString("productId");
                long purchaseDate = responseJson.optLong("purchaseDate");
                long cancelDate = responseJson.optLong("cancelDate");
                boolean testTransaction = responseJson.optBoolean("testTransaction");

                // レスポンスデータをローカルで処理します
                // アプリに応答します

                break;

            default:
                System.out.println("Amazon RVSエラー: 未定義のAmazon RVSレスポンスコード");
                // レスポンスデータをローカルで処理します
                // アプリに応答します
                break;
        }

    } catch (MalformedURLException e) {

        // ベストプラクティスとして、次のロジックをログ記録のロジックに置き換えることをお勧めします。
        System.out.println("Amazon RVS MalformedURLException");
        e.printStackTrace();
        // レスポンスデータをローカルで処理します
        // アプリに応答します
    } catch (IOException e) {

        // ベストプラクティスとして、次のロジックをログ記録のロジックに置き換えることをお勧めします。
        System.out.println("Amazon RVS IOException");
        e.printStackTrace();
        // レスポンスデータをローカルで処理します
        // アプリに応答します
    }
  }