IAPのベストプラクティス:ユーザーの購入傾向の追跡
ユーザーの購入傾向を追跡するための戦略として、アプリでのレシートのキャンセル率をモニタリングできます。
AmazonアプリストアユーザーIDの使用
ユーザーIDは、IAPを使用するユーザーごとに一意の識別子です。ユーザーIDを取得するには、PurchasingService.getUserData()
メソッドを使用します。詳細については、ユーザー情報の取得を参照してください。
Unityでアプリを実装した場合は、IAmazonExtensions
を実装してユーザーIDを取得します。詳細については、UnityマニュアルでAmazonアプリストアとAmazon Undergroundストア:拡張機能を参照してください。または、Amazon IAPプラグインのgetUserData()
メソッドを使用する方法もあります。詳細については、GetUserDataを参照してください。
ユーザーの購入履歴および傾向を追跡するには、ユーザーのAmazonアプリストアユーザーIDを開発者側のID管理システムに紐付けます。Login with AmazonやA3L AuthenticationなどのIDプラットフォームを統合することで、アプリにIDシステムを導入してください。ほかのサービス(Facebookのログインサービスなど)を使用したり、独自のシステムを作成したりする方法もあります。
IAPのレシート検証
ユーザーが購入を完了した後、onResume()
呼び出しでレシートを処理します(その際、ユーザー側の操作は不要です)。詳細については、getPurchaseUpdatesメソッドの実装を参照してください。
レシートを検証するには、Appstore SDK IAP用レシート検証サービスを統合します。RVSの呼び出しには以下のパラメーターが必要です。
-
レシートID。購入ごとに一意の識別子です。次の例に示すように、
onPurchaseResponse()
コールバックからReceiptId
オブジェクトを取得します。@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 ; } }
-
アプリユーザーID。ユーザーごとに一意の識別子です。次の例に示すように、
onUserDataResponse()
コールバックからユーザーID文字列を取得します。@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-server}/version/{operation-version-number}/verifyReceiptId/developer/{shared-secret}/user/{user-id}/receiptId/{receipt-id}
リクエストとレスポンスの例
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の詳細については、Appstore SDK IAP用レシート検証サービスを参照してください。
その他の推奨事項
- アクティブなレシートごとに72時間以内にRVSを呼び出すプロセスを作成して、キャンセルされたレシートの傾向をモニタリングします。
- リクエストのスロットリングを回避するために、ポーリングの頻度を10トランザクション毎秒(TPS)未満に保ちます。
- キャンセルされたレシートは元に戻すことができないため、キャンセルされたレシートに対してRVSのポーリングを継続することは推奨されません。
receiptId
のリクエストがスロットリングされた場合は、しばらく待ってから同じreceiptId
のリクエストを再試行してください。また、呼び出しの頻度も減らしてください。
次のステップ
上記の戦略を実行すると、ユーザーの購入傾向を追跡する信頼性の高いプロセスを作成でき、重要な収益源の確保に役立てることができます。IAPおよびその実装方法について詳しくは、アプリ内課金(IAP)についてを参照してください。
Last updated: 2024年3月15日