クイック定期購入のセットアップ
クイック定期購入の概要については、クイック定期購入の概要を参照してください。開始する準備ができたら、Amazonの担当者に連絡して、アカウントでクイック定期購入を有効にするように依頼します。次に、このページの手順に従います。
- 手順1: 開発者コンソールでクイック定期購入を構成する
- 手順2: セキュリティプロファイルを構成する
- 手順3: getPurchaseUpdatesを実装する
- 手順4: RVSと統合する
- 手順5: アイテム付与の結果をAmazonに送信する
- 手順6: RTNと統合する
- 手順7: ワンクリックアカウント情報共有を統合する
- 手順8: LATを使用してクイック定期購入をテストする
- 関連トピック
手順1: 開発者コンソールでクイック定期購入を構成する
ユーザーがアプリ内で購入できる定期購入型アイテムは、クイック定期購入でも購入できる必要があります。また、クイック定期購入で購入できる定期購入型アイテムは、アプリ内でも購入できる必要があります。ただし、アプリ内で購入できる定期購入型アイテムが5つ以上ある場合は除きます。4つの定期購入型アイテムを選択し、クイック定期購入で提供する必要があります。
アプリのクイック定期購入を設定するには、次の手順を実行します。
- 開発者コンソールにログインします。
- アプリ一覧で、クイック定期購入を設定するアプリを探します。
- [アプリ内課金(IAP)アイテム] 列内のリンクをクリックして、[アプリ内課金(IAP)アイテム] 画面を開きます。
- [クイック定期購入を作成] を選択します。
- 次の画像のようなオーバーレイポップアップが表示されます。
[デフォルトの定期購入型アイテムを選択] ドロップダウンに、既存のアプリ内課金(IAP)定期購入型アイテムが表示されます。クイック定期購入を有効にする定期購入型アイテムを選択します。
- [期間を選択] ドロップダウンで、クイック定期購入の期間を選択します。
- クイック定期購入でほかの定期購入型アイテムを提供する場合は、[別のクイック定期購入を追加] を選択します。クイック定期購入は最大4つまで追加できます。
- クイック定期購入の対象デバイスを、チェックボックスをオンにして選択します。
- ライブアプリテスト(LAT)用にのみクイック定期購入を作成するか、LATと公開アプリの両方のためにクイック定期購入を作成するかを選択します。
- LAT用にのみクイック定期購入を作成するには、[テスト用のクイック定期購入を作成] をクリックします。
- LATと公開中のアプリの両方のためにクイック定期購入を作成するには、[テスト・公開用のクイック定期購入を作成] をクリックします。
注: LATを使用してクイック定期購入をテストする方法の詳細については、LATを使用してクイック定期購入をテストするを参照してください。
クイック定期購入の作成後、アイテムを削除または変更する場合は、そのクイック定期購入アイテムの横にある [アクション] をクリックします。
手順2: セキュリティプロファイルを構成する
アプリのセキュリティプロファイルを設定するには、次の手順を実行します。
- 開発者コンソールにログインします。
- アプリ一覧を開き、アプリを選択します。
- [アプリサービス] をクリックし、[セキュリティプロファイル] セクションまでスクロールします。
- [既存のセキュリティプロファイルを選択、または新規作成する] をクリックしてオプションを展開します。
- ドロップダウンを使用して、このアプリにマップするセキュリティプロファイルを選択し、[セキュリティプロファイルを有効化] をクリックします。または、[セキュリティプロファイルを新規作成] をクリックして新しいセキュリティプロファイルを作成することもできます。
手順3: getPurchaseUpdatesを実装する
onResume()
メソッド内でgetPurchaseUpdates()
を呼び出す必要があります。getPurchaseUpdates()
メソッドを使用すると、ユーザーのレシートを取得できます。クイック定期購入は、getPurchaseUpdates()
の情報を使用してユーザーの購入ステータスを検証し、使用権限のあるコンテンツにユーザーがアクセスできるようにします。
getPurchaseUpdates()
は、onResume()
メソッド内で呼び出します。getPurchaseUpdates()
メソッドは、reset
というブール型のパラメーターを1つ受け取ります。reset
をfalse
に設定すると、前回の呼び出し以降に発行された新しいレシートのみが返されます。reset
をtrue
に設定すると、このユーザーのレシートがすべて返されます。
@Override
protected void onResume() {
super.onResume();
//...
PurchasingService.getUserData();
//...
PurchasingService.getPurchaseUpdates(false);
}
getPurchaseUpdates()
メソッドの統合方法の詳細については、IAP APIに関する次のテクニカルドキュメントを参照してください。
- Android - getPurchaseUpdatesメソッドの実装
- ウェブアプリ - getPurchaseUpdates(reset)
実装要件
getPurchaseUpdates()
メソッドを正しく実装するには、以下の要件に従ってください。
- Androidアクティビティの
onResume()
ライフサイクルメソッドで、getPurchaseUpdates()
を呼び出す必要があります。 onResume()
でgetPurchaseUpdates()
を呼び出すときは、常にfalse
フラグを使用して最新のレシートを取得します。true
フラグを使用すると、レシートのすべての履歴が返されるため、レスポンスを処理するためのフィルタリングロジックを追加することが必要になります。- アプリに [購入タイトルを復元] オプションを追加します。ユーザーがこのオプションを選択したら、
getPurchaseUpdates()
をtrue
フラグと共に呼び出します。 getPurchaseUpdates()
を通じて受け取ったレシートは常に保持し、アプリのログインIDにマッピングする必要があります。このマッピングを使用して、ユーザーがアプリを開いたときに定期購入済みのコンテンツのロックを解除します。
手順4: RVSと統合する
レシート検証サービス(RVS)を使用すると、アプリのユーザーが行った購入を検証できます。RVSサーバーにリクエストを送信すると、返されるJSONレスポンスにはpurchaseMetadataMap
フィールドが含まれます。クイック定期購入を使用して購入を開始した場合、次の例のように、purchaseMetadataMap
は{"QuickSubscribe":true}
となります。
{
"autoRenewing": true,
"betaProduct": false,
"binCountryCode": null,
"cancelDate": 1641131573000,
"cancelReason": 2,
"deferredDate": null,
"deferredSku": null,
"freeTrialEndDate": null,
"fulfillmentDate": 1641131345000,
"fulfillmentResult": "FULFILLED",
"gracePeriodEndDate": null,
"parentProductId": null,
"productId": "IntroFreeTrial.sku",
"productType": "SUBSCRIPTION",
"promotions": null,
"purchaseDate": 1641131345000,
"purchaseMetadataMap": {
"QuickSubscribe": "true"
},
"quantity": null,
"receiptId": "k9om1rUS7gZJIg8RMfw7AlbxA3aP56ay-vdgeLU40zw=:3:11",
"renewalDate": null,
"term": "1 Month",
"termSku": null,
"testTransaction": false
}
購入がクイック定期購入を使用して開始されたものでない場合、purchaseMetadataMap
はnullになります。レスポンスオブジェクトの全フィールドについて次の表で説明します。
フィールド | データ型 | 説明 |
---|---|---|
autoRenewing |
ブール型 | ユーザーの定期購入が自動更新されるかどうかを示します。 |
betaProduct |
ブール型 | 購入商品がライブアプリテスト商品かどうかを示します。 |
cancelDate |
長整数 | 購入をキャンセルした日、または定期購入の期限が切れた日。購入がキャンセルされていない場合、このフィールドはnullになります。時間はミリ秒単位です。 |
cancelReason |
整数 | 商品がキャンセルされた理由を示します。有効な値は、null、0、1、2のいずれかです。それぞれの整数はキャンセルの理由を表します。 null - 購入がキャンセルされていない。0 - 現時点ではキャンセル理由が特定されていないため、後で表示される。1 - ユーザーが注文をキャンセルした。2 - 購入がAmazonのシステムによってキャンセルされた(定期購入型アイテム購入時のユーザーの支払いが無効で、その購入が猶予期間内に完了しなかった場合など)。このコードは、Amazonカスタマーサポートがユーザーのリクエストに応じて注文をキャンセルした場合にも返されます。 |
freeTrialEndDate |
長整数 | 定期購入が無料体験期間中であることを示します。定期購入の無料体験期間の終了日をエポック(ミリ秒)単位で提供します。定期購入が無料体験期間中でない場合、このフィールドはnullになります。 |
fulfillmentDate |
長整数 | 定期購入でアイテム付与完了が通知された日付。エポックからのミリ秒数として格納されます。定期購入のアイテム付与が確認されていない場合はnullになります。消費型アイテムと非消費型アイテムでは常にnullです。 |
fulfillmentResult |
文字列 | 定期購入でのアイテム付与のステータス。有効な値は次のとおりです。
|
gracePeriodEndDate |
長整数 | 定期購入が猶予期間中であることを示します。定期購入の猶予期間の終了日をエポック(ミリ秒)単位で提供します。定期購入が猶予期間中でない場合、このフィールドはnullになります。 |
parentProductId |
文字列 | null。将来使用するために予約されています。 |
productId |
文字列 | アプリ内でこのアイテムに対して定義したSKU。 |
productType |
文字列 | 購入された商品のタイプ。有効な商品タイプは、CONSUMABLE (消費型アイテム)、SUBSCRIPTION (定期購入型アイテム)、ENTITLED (非消費型アイテム)です。 |
promotions |
List<Promotion> | 定期購入型アイテムのプロモーション価格またはリテンションオファーの詳細。プロモーションがない場合はnullになります。RVSのプロモーションを参照してください。 |
purchaseDate |
長整数 | 購入日。エポックからのミリ秒数として格納されます。定期購入型アイテムの場合、purchaseDate は最初の購入日を表します。それ以降の更新日を表すものではありません。 |
purchaseMetadataMap |
Map <String, String> | 購入がクイック定期購入を通じて開始された場合、値は{"QuickSubscribe":"true"} になります。それ以外の場合はnullになります。 |
quantity |
整数 | 購入された数量。常にnullまたは1になります。 |
receiptId |
文字列 | 購入のグローバルに一意の識別子。 |
renewalDate |
長整数 | 定期購入型アイテムの更新が必要となる日付。エポックからのミリ秒で計算されます。 |
term |
文字列 | 定期購入型IAPアイテムの有効期間(期間は購入日から始まります)。数字と期間(日、週、月、年)で構成されます(「1週間」、「2か月」など)。 |
termSku |
文字列 | 定期購入期間に対応する一意のSKU。 |
testTransaction |
ブール型 | この購入が、Amazonによる公開・テストプロセスの一部として実行されたものかどうかを示します。 |
RVSの詳細については、 Appstore SDK IAP用レシート検証サービスを参照してください。
手順5: アイテム付与の結果をAmazonに送信する
アイテム付与の結果を送信すると、ユーザーが購入したコンテンツにアクセスできるかどうかをAmazon側で確認できるようになります。必ずアイテム付与の結果をAmazonに送信してください。これには、Appstore SDKに含まれているnotifyFulfillment()
メソッドを使用します。
ユーザーがサインインした後、定期購入型アイテムが付与されたら、ステータスをFULFILLED
としてnotifyFulfillment()
を呼び出します。ユーザーが既に定期購入型アイテムを所有している場合は、ステータスをUNAVAILABLE
としてnotifyFulfillment()
を呼び出して、ユーザーはサインインしているものの購入は適用できないことを通知します。notifyFulfillment()
メソッドの詳細については、Amazonにアイテム付与の結果を送信し、ユーザーにアイテムを付与を参照してください。
既にAcknowledge Receipt APIを統合している場合は、引き続きnotifyFulfillment()
メソッドの代わりに使用できます。アイテム付与の結果をAmazonに通知するには、アプリ内でnotifyFulfillment()
メソッドかAcknowledge Receipt APIのいずれかを使用する必要があります。
実装要件
notifyFulfillment()
メソッドを正しく実装するには、以下の要件に従ってください。
- ユーザーがアプリを開いてコンテンツにアクセスしようとするたびに、
notifyFulfillment()
を呼び出す必要があります。 - 正常にユーザーをレシートにマッピングし、ユーザーの定期購入済みコンテンツのロックを解除した場合は、
FULFILLED
ステータスを指定してnotifyFulfillment()
を呼び出す必要があります。 - ユーザーが既に定期購入型アイテムを所有している場合は、
UNAVAILABLE
ステータスを指定してnotifyFulfillment()
を呼び出す必要があります。 - 問題が発生したために
UNAVAILABLE
を指定してnotifyFulfillment()
を呼び出した場合は、ユーザーとレシートのマッピングに成功し、ユーザーの定期購入済みコンテンツのロックを解除したときに、FULFILLED
ステータスを指定してnotifyFulfillment()
を呼び出す必要があります。
Acknowledge Receipt API
notifyFulfillment()
メソッドを使用してください。Acknowledge Receipt APIを既に統合している場合は、引き続き使用できます。手順6: RTNと統合する
クイック定期購入では、ユーザーはアプリからではなくAmazonを通じてアプリを定期購入します。そのため、ユーザーの購入ステータスに関する情報の一部がアプリに保存されない可能性があります。getPurchaseUpdates()
メソッドは、アプリが開かれている場合にのみデータを送信します。
リアルタイム通知(RTN)は、アプリの外部で発生するトランザクションも含め、すべてのトランザクションの購入情報を提供します。AmazonのRTNサーバーから購入通知を受信したら、Appstore SDK IAP用レシート検証サービス(RVS)を使用してレシートを検証します。
RTNの設定方法の詳細については、リアルタイム通知(RTN)を使用する方法を参照してください。
手順7: ワンクリックアカウント情報共有を統合する
以下のガイドを使用して、アプリにワンクリックアカウント情報共有機能を統合します。
前提条件
- Login with Amazon SDKと統合します。詳細については、Android用のLogin with Amazon SDKをインストールするを参照してください。
- Appstore SDKバージョン3.0.5以降と統合します。詳細については、Appstore SDKの統合を参照してください。
アプリのマニフェストの更新
アプリがワンクリックアカウント情報共有機能をサポートしていることをAmazonアプリストアに示すために、次のコードを使用してアプリのマニフェストを更新します。
<uses-feature android:name="amazon.lwa.quicksignup.supported"/>
getUserDataの変更の実装とLogin with Amazonの統合
ユーザーがAmazonアカウントの詳細情報の共有に同意したかどうかを判断するには、アプリのメインアクティビティのonCreate()
メソッドで、UserDataRequest
オブジェクトのsetFetchLWAConsentStatus()
フラグをtrueに設定してgetUserData()
メソッドを呼び出します。
次の例は、Login with Amazon(LWA)が詳細情報を取得することにユーザーが同意した場合に、UserDataRequest
オブジェクトを作成し、それをgetUserData()
に渡す方法を示しています。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//...
// 登録するPurchasingListenerの参照を渡します。
PurchasingService.registerListener(this.getApplicationContext(), purchasingListener);
// isLoggedIn()内には、ユーザーのログインステータスを特定するロジックを実装します。
if (!isLoggedIn()) {
PurchasingService.getUserData(UserDataRequest.newBuilder().setFetchLWAConsentStatus(true).build());
}
//...
}
ユーザーが同意した場合、UserData
オブジェクトのLWAConsentStatus
のステータスはCONSENTED
になります。ユーザーが同意していない場合、または同意トークンの有効期限が切れている場合、LWAConsentStatus
のステータスはUNAVAILABLE
になります。
次のコードは、UserDataResponse
オブジェクトから受け取った同意データを処理する方法を示しています。
@Override
public void onUserDataResponse( final UserDataResponse response) {
final UserDataResponse.RequestStatus status = response.getRequestStatus();
switch (status) {
case SUCCESSFUL:
if (LWAConsentStatus.CONSENTED.equals(response.getUserData().getLWAConsentStatus())) {
// lwaMagerは後のセクションで実装します。
lwaManager.startAutoLoginWorkflow();
}
break ;
case FAILED:
case NOT_SUPPORTED:
// 失敗時の処理を適切に行います。
break ;
}
}
ユーザーが同意した場合は、LWAのauthorize()
メソッドを呼び出してアクセストークンを取得します。このアクセストークンを使用して、サーバー側でユーザーの詳細情報を取得します。サーバーの設定方法の詳細については、サーバーにユーザー情報を取り込むを参照してください。次に、ユーザー情報を使用してバックエンドシステムにアカウントを作成します。
次のコードは、LWAManager
を使用して、同意したユーザーの自動サインインを有効にする方法を示しています。
//..
private RequestContext requestContext;
private Context context;
//..
LWAManager(RequestContext requestContext, Context context) {
this.requestContext = requestContext;
this.context = context;
requestContext.registerListener(new AuthorizeListener() {
//..
@Override
public void onSuccess(AuthorizeResult authorizeResult) {
signUpAccountWithAccessToken(authorizeResult.getAccessToken());
}
//..
});
}
public void startAutoSignupWorkflow() {
AuthorizationManager.authorize(
new AuthorizeRequest.Builder(requestContext)
.addScopes(ProfileScope.profile(), ProfileScope.postalCode())
.build()
);
}
private void signUpAccountWithAccessToken(final String accessToken) {
// accessTokenをアプリのバックエンドAPIに渡して、アカウント作成用のユーザー情報を取得します。
// バックエンドAPIの実装の詳細については、以下を参照してください。
// https://developer.amazon.com/ja/docs/login-with-amazon/customer-profile-other-platforms-cbl-docs.html#get-customer-information-to-your-server
invokeAppBackendToCreateAccount(accessToken);
}
(任意)ユーザーが同意しない場合は、[Login with Amazon] ボタンのあるサインイン画面を表示します。これにより、ユーザーはキーボードを使用して認証情報を入力するか、[Login with Amazon] ボタンを使用してアプリにサインインできます。
フロー図
次の図は、ワンクリックアカウント情報共有を使用したクイック定期購入のコードフローを示しています。
アカウント設定に関するベストプラクティス
ユーザーのアカウントを設定するときは、以下のベストプラクティスに従ってください。
getUserData()
レスポンスのLWAConsentStatus
の値がCONSENTED
の場合は、次の操作を行います。- Login with Amazonサーバーからユーザー情報を取得します。この情報を使用して、一時パスワードでログインアカウントを作成します。パスワードのリセットや追加情報をユーザーに要求することなく、ユーザーをアプリにサインインさせます。
- 後で、パスワードをリセットするようにEメールでユーザーに通知します。
LWAConsentStatus
がUNAVAILABLE
の場合は、アプリのデフォルトの登録エクスペリエンスをユーザーに表示します。
手順8: LATを使用してクイック定期購入をテストする
ライブアプリテスト(LAT)でクイック定期購入をテストするには、まず、開発者コンソールでクイック定期購入を構成するの手順を使用して、開発者コンソールでLAT用のクイック定期購入を構成します。クイック定期購入は、次の画像に示すように、LAT用にのみ構成することも、公開アプリとLATアプリの両方のために構成することもできます。
LAT用にのみクイック定期購入を構成した場合でも、次の画像に示すように [アクション] > [公開中へ昇格] を選択すると、後から構成を公開中のアプリに昇格できます。
LATアプリ用のクイック定期購入の構成が公開アプリ用と異なる場合は、次の画像に示すように、LATアプリ用のクイック定期購入の詳細に [テスト] というラベルが表示されます。
クイック定期購入フローは、AmazonのECサイトまたはFireデバイスでテストできます。ライブアプリテストを開始するときに、テスターに招待Eメールを送信できます。テスターは、Amazonウェブサイトへのリンクが記載されたEメールを受信します。このサイトには、LATバージョンのアプリが登録されています。
ウェブサイトでのクイック定期購入のテスト
LATの招待Eメールから、対象のマーケットプレイスのAmazonウェブサイトを選択します。アプリの詳細ページで、定期購入オプションを選択します。これは、月額20.00 USDのように、定期購入型アイテムの期間に対する有料オプションとして表示されます。次に、配信先のデバイスを選択し、[Get App] をクリックします。
デバイスでのクイック定期購入のテスト
デバイスでクイック定期購入のテストを開始するには、LATの招待Eメールまたはデバイスの通知を使用できます。
LATの招待Eメールからテストするには:
- 招待Eメールに記載されているリンクを使用して、Amazonウェブサイトのアプリの詳細ページに移動します。
- [App Only] オプションをクリックします。
- [配信先:] ドロップダウンメニューで、[Cloud Only] をクリックします。
- [Get App] をクリックします。
- Amazonアカウントに関連付けられているFire TVデバイスで、[マイアプリ・チャンネル] のアイコンをクリックします(アイコンはナビゲーションバーに3つの四角形とプラス記号で表示されます)。
- アプリアイコンにTESTバナーが表示されているLATバージョンのアプリを探します。アプリを表示するには、[アプリライブラリ] をクリックする必要のある場合があります。
- デバイスで、アプリアイコンをクリックしてアプリの詳細ページを開きます。
- [Subscription Options] をクリックし、アプリをダウンロードします。
通知からテストするには:
LATの招待Eメールを送信すると、テスターEメールに関連付けられているテストデバイスに通知が届きます。通知が表示されたときに開くと、LATアプリの詳細ページに移動します。この通知は5~10秒間表示されます。通知が最初に表示されたときに見逃した場合は、設定アイコン(歯車アイコン)をクリックし、[通知] をクリックすることで確認できます。ここで通知を読み、アプリの詳細ページに移動できます。[Subscription Options] をクリックし、アプリをダウンロードします。
重要
- LATによるクイック定期購入のテストは、以下の場合はサポートされません。
- 配信先の特定のデバイスを選択するときに、ウェブサイトで [App Only] オプションを使用した場合。
- デバイスで [App Only] オプションを使用した場合。
-
クイック定期購入以外の目的でLATを使用してアプリをテストする場合は、[App Only] オプションを使用して、アプリを配信する特定のデバイスを選択できます。
-
クイック定期購入のテスト中は、タイムラインが短縮された定期購入型アイテムをオフにしてください。
-
テストアカウントのクイック定期購入をリセットするには、開発者コンソールにアクセスしてLAT用の定期購入型アイテムをリセットします。詳細については、アプリ内課金(IAP)アイテムのリセット(LAT内の全テスターを対象)または個々のテスターの管理を参照してください。
- 30日間のキャンセル期間をテスト用に1日に短縮する必要がある場合は、Amazonの担当者にお問い合わせください。
関連トピック
Last updated: 2024年10月2日