開発者コンソール

IAPのベストプラクティス:ユーザーの購入傾向の追跡

IAPのベストプラクティス:ユーザーの購入傾向の追跡

このガイドでは、アプリを最大限に活用するための戦略として、レシートのキャンセル率をモニタリングすることでユーザーの購入傾向を追跡する方法について概説します。

AmazonアプリストアUserIdの使用

UserIdは、IAPを使用するユーザーごとに一意の識別子です。UserIdを取得するには、PurchasingService.getUserData()メソッドを呼び出します。詳細については、ユーザー情報の取得を参照してください。

Unityでアプリを実装した場合は、IAmazonExtensionsを実装してUserIdを取得します。詳細については、UnityマニュアルでAmazonアプリストアとAmazon Undergroundストア:拡張機能を参照してください。または、Amazon IAPプラグインのgetUserDataメソッドを使用する方法もあります。その場合の詳細については、GetUserDataを参照してください。

ユーザーの購入履歴および傾向を追跡するには、ユーザーのAmazonアプリストアUserIdを開発者側のID管理システムに紐付けます。Login with AmazonなどのIDプラットフォームを統合することで、アプリにIDシステムを導入してください。ほかのサービス(Facebookのログインサービスなど)を使用したり、独自のシステムを作成したりする方法もあります。

IAPのレシート検証

ユーザーが購入を完了したら、onResume()呼び出しでレシートを処理します(その際、ユーザー側の操作は不要です)。詳細については、getPurchaseUpdatesメソッドの実装を参照してください。 

レシート検証サービス(RVS)を統合してレシートを検証します。RVSは、以下を指定して呼び出します。 

  • receiptId: 購入ごとに一意の識別子です。receiptIdは、onPurchaseResponseコールバックで以下のように取得します。

       @Override
       public void onPurchaseResponse(PurchaseResponse purchaseResponse) {
          switch (purchaseResponse.getRequestStatus()) {
              case SUCCESSFUL:
                  receiptId = purchaseResponse.getReceipt().getReceiptId();
                  PurchasingService.notifyFulfillment(purchaseResponse.getReceipt().getReceiptId(),
                  FulfillmentResult.FULFILLED);
                  break ;
              case FAILED:
                  break ;
          }
       }
    
  • userId: ユーザーごとに一意の識別子です。userIdは、onUserDataResponse()コールバックで以下のように取得します。

      @Override
      public void onUserDataResponse(UserDataResponse response) {
          final UserDataResponse.RequestStatus status = response.getRequestStatus();
          switch (status) {
              case SUCCESSFUL:
                  currentUserId = response.getUserData().getUserId();
                  currentMarketplace = response.getUserData().getMarketplace();
                  break;
              case FAILED:
              case NOT_SUPPORTED:
                  // 失敗時の処理を適切に行います。
                  break;
          }
      }
    

RVSリクエストの構文は次のとおりです。

https://<RVSサーバーのURL>/version/<オペレーションのバージョン番号>/verifyReceiptId/developer/<共有シークレット>/<UserId>/receiptId/<ReceiptId>

リクエストとレスポンスの例

RVS本番サーバーでレシートを検証するリクエストの例を以下に示します。 

https://appstore-sdk.amazon.com/version/1.0/verifyReceiptId/developer/2:smXBjZkWCxDMSBvQ8HBGsUS1PK3jvVc8tuTjLNfPHfYAga6WaDzXJPoWpfemXaHg:iEzHzPjJ-XwRdZ4b4e7Hxw==/user/LRyD0FfW_3zeOlfJyxpVll-Z1rKn6dSf9xD3mUMSFg0=/receiptId/wE1EG1gsEZI9q9UnI5YoZ2OxeoVKPdR5bvPMqyKQq5Y=:1:11

リクエストが成功すると、RVS APIからレスポンスコード(HTTP 200)が返されます。リクエストが成功した場合のレスポンスの例を以下に示します。

{
    "betaProduct": false,
    "cancelDate": null,
    "parentProductId": null,
    "productId": "com.amazon.iapsamplev2.gold_medal",
    "productType": "CONSUMABLE",
    "purchaseDate": 1399070221749,
    "quantity": 1,
    "receiptId": "wE1EG1gsEZI9q9UnI5YoZ2OxeoVKPdR5bvPMqyKQq5Y=:1:11",
    "renewalDate": null,
    "term": null,
    "termSku": null,
    "testTransaction": true
}

レシート検証

サーバー側のレシート検証が適切に実装されていない場合、アプリが不正返金に対して脆弱になる可能性があります。キャンセル日を確認しないと、ユーザーが購入をキャンセルした後も、サービスが引き続き利用される恐れがあります。

レシート検証サービス(RVS)では、cancelDateフィールドを確認することで、レシートを検証できます。すべてのアプリ内課金アイテム(消費型アイテム、非消費型アイテム、定期購入型アイテム)において、cancelDateフィールドがnullであれば、レシートは有効となります。

キャンセルされたレシートの例を以下に示します。

{
    "betaProduct": false,
    "cancelDate": 1583136000000,
    "parentProductId": null,
    "productId": "com.amazon.iapsamplev2.gold_medal",
    "productType": "CONSUMABLE",
    "purchaseDate": 1583049600000,
    "quantity": 1,
    "receiptId": "wE1EG1gsEZI9q9UnI5YoZ2OxeoVKPdR5bvPMqyKQq5Y=:1:11",
    "renewalDate": null,
    "term": null,
    "termSku": null,
    "testTransaction": true
}

RVSの詳細については、アプリ内課金(IAP)アプリのレシート検証を参照してください。

その他の推奨事項

  1. アクティブなレシートごとに72時間以内にRVSを呼び出すプロセスを作成して、キャンセルされたレシートの傾向をモニタリングします。
  2. リクエストのスロットリングを回避するために、ポーリングの頻度を10トランザクション毎秒(TPS)未満に保ちます。
  3. キャンセルされたレシートは元に戻すことができないため、キャンセルされたレシートに対してRVSのポーリングを継続することは推奨されません。
  4. receiptIdのリクエストがスロットリングされた場合は、しばらく待ってから同じreceiptIdのリクエストを再試行してください。また、呼び出しの頻度も減らしてください。

次のステップ

上記の戦略を実行すると、ユーザーの購入傾向を追跡する信頼性の高いプロセスを作成でき、重要な収益源の確保に役立てることができます。IAPおよびその実装方法について詳しくは、アプリ内課金(IAP)についてを参照してください。