開発者コンソール

Androidアプリに価格帯別の定期購入を統合する方法

Androidアプリに価格帯別の定期購入を統合する方法

価格帯別の定期購入型アイテムをアプリに実装するには、IAPアイテムにそれぞれのSKUを割り当てた後、Modify Subscription APIを使用します。Modify Subscription APIは、Amazon Appstore SDKのカスタムバージョンの一部です。

Modify Subscription API

実装プロセスは、Purchase APIを使用する場合と似ています。

purchase()メソッドを呼び出すと、Appstore SDKによってonPurchaseResponse()コールバックが呼び出されます。同様に、modifySubscription()メソッドを呼び出すと、Appstore SDKによってonModifySubscriptionResponse()コールバックが呼び出されます。

Purchase APIとModify Subscription APIの主な違いは次のとおりです。

  • modifySubscription()メソッドは、ProrationModeパラメータ(プラン変更の時間を指定する値)とリクエストのSKUパラメータを受け取ります。一方、purchase()メソッドはSKUのみを受け取ります。
  • ModifySubscriptionResponseオブジェクトでは複数のレシートが使用されるのに対し、PurchaseResponseオブジェクトで使用されるレシートは1つだけです。

ModifySubscriptionRequestでは、ユーザーの切り替え先となる期間のSKUが使用されます。さらにProrationModeも使用されます。これは、IMMEDIATEまたはDEFERREDの値を取る列挙型です。modifySubscription()メソッドは、該当するユーザーの定期購入型アイテムを特定し、新しい期間SKUで更新します。ProrationMode値は、この変更が有効になるタイミングを指定します。ModifySubscriptionResponseオブジェクトは、プランの変更に関連付けられている一連のレシートを提供します。

定期購入型アイテムの比例配分モードの変更

定期購入型アイテムの比例配分モードはProrationMode列挙型で設定されます。このセクションでは、ProrationModeに指定できる2つの値、IMMEDIATEDEFERREDについて詳しく説明します。

比例配分の即時(Immediate)モード

ProrationModeIMMEDIATEに設定すると、ユーザーの現在の定期購入プランが終了し、新しいプランが即座に有効となります。終了した定期購入プランの残りの期間分は返金となり、ユーザーは新しい定期購入プランで課金されます。また、ユーザーには、以前のプランの返金額と新しいプランの詳細を明記したEメールが送信されます。

現行のプランは返金額が日割り計算されて終了し、新しいプランが別の注文で開始されるので、このAPIには次の2つのレシートが含まれます。

  • 対象となる定期購入の最後の有効なレシート(以前の定期購入プランの終了を確認したキャンセル日が記載されています)
  • 変更後のプランの新しいレシート

ユーザーが支払いを済ませたアイテムを即座に提供するには、両方のレシートを処理する必要があります。

即時(Immediate)のサンプルレスポンス

この例では、期間SkuXから期間SkuYへの切り替えが即時に実施されます。購入日は1月16日です。元のSkuXは1月2日に購入されています。このシナリオでは、以下の内容のメッセージがAmazonから返されます。

receipts: [{
       "receiptId": "oeUY1ip2mJWgLoOuGtAxndQS1LDJRGvmKLr6kq4u9G8=:3:11",
       "sku": "baseSku",
       "itemType": "SUBSCRIPTION",
       "purchaseDate": "Thu Jan 16 09:25:25 GMT+05:30 2020",
       "termSku": "SkuY"
   }, {
       "receiptId": "1bxFJrJVLPr8qpub8SijMWdAqXqWWGNUYPDpynoSusE=:3:11",
       "sku": "baseSku",
       "itemType": "SUBSCRIPTION",
       "purchaseDate": "Thu Jan 02 12:41:44 GMT+05:30 2020",
       "endDate": "Thu Jan 16 09:25:26 GMT+05:30 2020",
       "termSku": "SkuX"
   }]

比例配分の繰延(Deferred)モード

ProrationModeDEFERREDに設定すると、予定された更新日時に定期購入プランが切り替わります。更新までは、ユーザーは現行のプランを引き続き利用できます。新しいプランの料金は、更新時に請求されます。また、ユーザーには、繰延(Deferred)定期購入の詳細と変更予定日を記したEメールが送信されます。

以前の定期購入プランは終了せず効力が持続するため、Modify Subscriptionのレスポンスには有効なレシートのみが含まれます。このレシートには、繰延期間のSKUと繰延日が記載されます。指定された日付に、このレシートのデータを使用して検証を行い、新しいプランへのアクセスを提供する必要があります。レシートIDは更新後も同じく有効ですが、最新の定期購入情報で更新されます。

繰延(Deferred)のサンプルレスポンス

この例では、SkuAからSkuBへの期間変更が、deferredDateで指定された更新日時に実施されます。

receipts: [{
       "receiptId": "oeUY1ip2mJWgLoOuGtAxndQS1LDJRGvmKLr6kq4u9G9=:3:11",
       "sku": "baseSku",
       "itemType": "SUBSCRIPTION",
       "purchaseDate": "Thu Jan 16 10:25:25 GMT+05:30 2020",
       "deferredDate": "Thu Jan 23 10:25:26 GMT+05:30 2020",
       "deferredSku": "SkuA",
       "termSku": "SkuB"
   }]


Modify Subscription APIの実装

以下のコード例は、Modify Subscription APIのリクエストとレスポンスをアプリ内で適切に処理する方法を示しています。

サンプルリクエスト

RequestId requestId = PurchasingService.modifySubscription("SKU", ProrationMode);

レスポンスの例

onModifySubscriptionResponse()メソッドは、Modify Subscription APIからのレスポンスを処理します。このメソッドは、getRequestStatus()を使用してModifySubscriptionResponse.RequestStatus変数にステータスを格納します。そのステータスに応じて、getReceipts()でレシートを出力するか、エラーを処理します。

@Override
public void onModifySubscriptionResponse(ModifySubscriptionResponse response) {
    final String requestId = response.getRequestId().toString();
    final String userId = response.getUserData().getUserId();

    final ModifySubscriptionResponse.RequestStatus status = response.getRequestStatus();
    Log.d(TAG, "onModifySubscriptionResponse: requestId (" + requestId
            + ") userId ("
            + userId
            + ") modifySubscriptionRequestStatus ("
            + status
            + ")");
    Log.d(TAG, "ModifySubscriptionResponse " + response.toString());

    switch (status) {
        case SUCCESSFUL:
            for(Receipt receipt : response.getReceipts()) {
                Log.d(TAG, "onModifySubscriptionResponse: JSON形式のレシート:" + receipt.toJSON());
                iapManager.handleReceipt(response.getRequestId().toString(), receipt, response.getUserData());
            }
            break;
        case INVALID_SKU:
            Log.d(TAG,
                    "onModifySubscriptionResponse: SKUが無効です。購入ボタンは、onProductDataResponseによって既に無効にされています。");
            break;
        case FAILED:
        case NOT_SUPPORTED:
            Log.d(TAG, "onModifySubscriptionResponse: 失敗しました。ローカルストレージから購入リクエストを削除してください。");
            iapManager.purchaseFailed(response.getRequestId().toString());
            break;
    }
}


Last updated: 2024年12月3日