メインコンテンツまでスキップ

Managing Entitlements

Last updated on November 23, 2023

概要

AccelByte Gaming Services (AGS) エンタイトルメントサービスは、購入または受け取ったアイテムについて、個々のプレイヤーの所有権を管理します。エンタイトルメントを使用して、プレイヤーとの間でアイテムのインスタンスを付与したり取り消したりできます。アイテムの作成と設定はストアで処理されます。

エンタイトルメントには 2 つのタイプがあります。

  • 耐久品エンタイトルメント:スタックできない永続的なものです。使用後に消えることはありません。耐久品エンタイトルメントの例としては、ゲームスキン、武器、ロック解除可能なキャラクターなどが挙げられます。
  • 消耗品:使用後に消失します。消耗品はスタック可またはスタック不可に設定できます。複数のスタック可アイテムは同じエンタイトルメント下にありますが、複数のスタック不可アイテムは、同じアイテムから生じた場合でも、それぞれに独自のエンタイトルメントを持ちます。消耗品エンタイトルメントの例としては、弾薬、ポーション、食料があります。

エンタイトルメント管理では、特定のプレイヤー、または特定のエンタイトルメントを所有するプレイヤーのエンタイトルメント履歴を確認できます。

目標

このセクションの目標は、次の方法について説明することです。

  • プレイヤーにエンタイトルメントを付与する。
  • プレイヤーのエンタイトルメントを検索する。
  • プレイヤーのエンタイトルメントを無効化する。
  • プレイヤーのエンタイトルメントを有効化する。
  • プレイヤーのエンタイトルメントを取り消す。
  • プレイヤーのエンタイトルメント履歴をリスト表示する。

前提条件

  • AccelByte 管理者ポータルにアクセスできること
  • 適切な名前空間を作成していること

プレイヤーにエンタイトルメントを付与する

AccelByte 管理者ポータルからプレイヤーにエンタイトルメントを付与できます。以下の手順に従ってください。

  1. 管理者ポータルで、[E-Commerce (E コマース)]セクションをクリックし、利用可能なオプションから[Entitlements (エンタイトルメント)]をクリックします。

  2. 次に[Entitlements (エンタイトルメント)]ページで、[Grant Item (アイテムを付与)]ボタンをクリックします。

    Grant Item

    Grant Item (アイテムを付与)]フォームが開きます。

    Grant Item Form

  3. 必須のフィールドに入力します。

    • Add Item (アイテムを追加)]フィールドで、プレイヤーに付与するアイテムを検索します。
    • エンタイトルメントを付与するプレイヤーの[User ID (ユーザー ID)]を[Select User (ユーザーを選択)]フィールドに入力します。次に[Add (追加)]をクリックします。
    • プレイヤーに付与するアイテムの[Quantity (数量)]を入力します。
  4. すべてのフィールドに入力したら、[Grant (付与)]ボタンをクリックします。新しいエンタイトルメントがプレイヤーに付与され、プレイヤーのアカウントに表示されます。

プレイヤーのエンタイトルメントを検索する

AccelByte 管理者ポータルからプレイヤーのエンタイトルメントのリストを取得できます。以下の手順に従ってください。

  1. 管理者ポータルで、[E-Commerce (E コマース)]セクションをクリックし、下のオプションから[Entitlements (エンタイトルメント)]をクリックします。

  2. Entitlements (エンタイトルメント)]パネルの[Search (検索)]フィールドで、Full Entitlement ID (完全エンタイトルメント ID)、User ID (ユーザー ID) または Email (メールアドレス) での検索を選択します。

    Search entitlements

    完全エンタイトルメント ID で検索すると、所有プレイヤーのユーザー ID を表示するエンタイトルメント ID に基づく、特定のエンタイトルメントが表示されます。

  3. 検索ワードを入力します。たとえばメールアドレスの場合は、プレイヤーのメールアドレスを入力します。

  4. フィルターとして[User ID (ユーザー ID)]または[Email (メールアドレス)]を選択した場合、[Entitlement Class (エンタイトルメントクラス)]と[Features Name (特徴名)]に基づいて結果をフィルタリングすることもできます。

    注記

    [Entitlement Class (エンタイトルメントクラス)]フィールドの[Entitlement (エンタイトルメント)]オプションでは、[App (アプリ)]、[Code (コード)]、[Subscription (サブスクリプション)]、[Media (メディア)]、[Option Box (オプションボックス)]以外のアイテムのタイプを選択できます。アイテムのタイプの詳細については、E コマースのドキュメントを参照してください。

    Entitlement Class (エンタイトルメントクラス)]:アイテムのタイプに基づいて結果をフィルタリングします。[All (すべて)]、[App (アプリ)]、[Entitlement (エンタイトルメント)]、[Code (コード)]、[Subscription (サブスクリプション)]、[Media (メディア)]、[Option Box (オプションボックス)]、[Loot Box (ルートボックス)]を選択できます。

    Features Name (特徴名)]を使用して、特徴に基づいて結果をフィルタリングします。複数の特徴名を入力するには、Enter キーを押して別の特徴を追加します。

    注記

    アイテムに特徴を追加するなど、特徴名の追加の詳細については、ストアの設定を参照してください。

  5. 完了したら[Apply Filter (フィルターを適用)]ボタンをクリックします。

プレイヤーのエンタイトルメントを無効化する

AccelByte 管理者ポータルからプレイヤーのエンタイトルメントを無効化できます。以下の手順に従ってください。

  1. 管理者ポータルから、[E-Commerce (E コマース)]セクションをクリックし、下のオプションから[Entitlements (エンタイトルメント)]をクリックします。

  2. Entitlements (エンタイトルメント)]パネルで、無効化するレコードを検索します。

  3. 選択したレコードで、[Action (アクション)]列にある[More Actions (...) (さらなるアクション (...))]アイコンをクリックし、[Disable (無効化)]をクリックします。

    Disable player entitlements

  4. Disable Entitlement (エンタイトルメントを無効化)]フォームが開きます。[Confirm (確認)]をクリックします。

管理者ポータルにおけるアイテムのステータスが[Inactive (非アクティブ)]に変化し、アイテムはプレイヤー側からは非表示になり使用できなくなります。

Disable player entitlements

プレイヤーのエンタイトルメントを有効化する

AccelByte 管理者ポータルからプレイヤーのエンタイトルメントを有効化できます。以下の手順に従ってください。

  1. 管理者ポータルから、[E-Commerce (E コマース)]セクションをクリックし、下のオプションから[Entitlements (エンタイトルメント)]をクリックします。

  2. Entitlements panel (エンタイトルメント)]パネルで、有効化するレコードを検索します。

  3. 選択したレコードで、[Action (アクション)]列にある[More Actions (...) (さらなるアクション (...))]アイコンをクリックし、[Enable (有効化)]をクリックします。

    Enable player entitlements

  4. [Enable Entitlement (エンタイトルメントを有効化)]フォームが開きます。[Confirm (確認)]をクリックします。

管理者ポータルにおけるアイテムのステータスが[Active (アクティブ)]に変化し、プレイヤーは再びアイテムを使用できるようになります。

Active player entitlements

プレイヤーのエンタイトルメントを取り消す

AccelByte 管理者ポータルからプレイヤーのエンタイトルメントを取り消すことができます。以下の手順に従ってください。

  1. AccelByte管理者ポータルを開き、[E-Commerce (E コマース)]セクションに移動し、利用可能なオプションから[Entitlements (エンタイトルメント)]をクリックします。

  2. Entitlements (エンタイトルメント)]パネルで、上記の説明に沿って当該のプレイヤーのエンタイトルメントを検索します。

  3. 選択したレコードで、[Action (アクション)]列にある[More Actions (...) (さらなるアクション (...))]アイコンをクリックし、[Revoke (取り消す)]をクリックします。

    Revoke player entitlements

  4. Revoke Entitlement (エンタイトルメントを取り消す)]フォームが表示されます。[Confirm (確認)]をクリックします。

管理者ポータルでは、アイテムのステータスが[Revoked (取り消し済み)]に変化し、アイテムはプレイヤーのアカウントから削除されます。

プレイヤーのエンタイトルメント履歴をリスト表示する

エンタイトルメント履歴は、エンタイトルメントのステータスの履歴リストです。たとえば最初は付与されていたものの、後に取り消されたなどの記録です。プレイヤーのエンタイトルメントの履歴は、AccelByte 管理者ポータルから確認できます。以下の手順に従ってください。

  1. AccelByte 管理者ポータルで、[E-Commerce (E コマース)]セクションをクリックし、下のオプションから[Entitlements (エンタイトルメント)]をクリックします。

  2. Entitlements (エンタイトルメント)]パネルの検索フィールドで、プレイヤーのエンタイトルメントを検索します (「プレイヤーにエンタイトルメントを付与する」セクションを参照)。

  3. View (表示)]をクリックして、エンタイトルメントのリストから表示するレコードを選択します。

  4. Entitlement History (エンタイトルメント履歴)]ポップアップに、エンタイトルメント履歴が降順で表示されます。

クライアント SDK でエンタイトルメントを実装する

プレイヤーがアイテムを注文すると、エンタイトルメントが自動的に付与されます。エンタイトルメントがアカウントに追加されます。

プレイヤーのエンタイトルメントを確認する

サブスクリプションが提供されているプレイヤーの場合

ゲームまたはプラットフォームがプレイヤーにサブスクリプションを提供している場合は、次のコードを使用してプレイヤーのエンタイトルメントとサブスクリプションプランを確認できます。

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient("key"); 

FString EntitlementName = "Entitlement";
FString ItemId = "ItemId";
TArray<FString> Features = { "feature1" };
int Offset = 0;
int Limit = 20;
ApiClient->Entitlement.QueryUserEntitlements(EntitlementName, ItemId, Offset, Limit
, THandler<FAccelByteModelsEntitlementPagingSlicedResult>::CreateLambda(
[=](const FAccelByteModelsEntitlementPagingSlicedResult& Result)
{
UE_LOG(LogTemp Log, TEXT(" Success"));
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage)
}
, EAccelByteEntitlementClass::NONE
, EAccelByteAppType::NONE);

サブスクリプションが提供されていないプレイヤーの場合

サブスクリプションを提供しない場合は、次のコードを使用してプレイヤーのエンタイトルメントを確認できます。プレイヤーのエンタイトルメントをすべて取得するには、EntitlementNameItemId"" (つまり空の文字列) に設定します。

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient("key");

FString EntitlementName = "";
FString ItemId = "";
int32 Offset = 0;
int32 Limit = 20;

ApiClient->Entitlement.QueryUserEntitlements(EntitlementName, ItemId, Offset, Limit,
THandler<FAccelByteModelsEntitlementPagingSlicedResult>::CreateWeakLambda(this, [](const FAccelByteModelsEntitlementPagingSlicedResult& Result)
{
UE_LOG(LogTemp, Log, TEXT("Query User Entitlements Success!"));
}),
FErrorHandler::CreateWeakLambda(this, [](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("Query User Entitlements Failed, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}),
EAccelByteEntitlementClass::NONE,
EAccelByteAppType::NONE
);

QueryUserEntitlements() からの応答オブジェクトには、エンタイトルメント関連 ID すべてを含むエンタイトルメント情報の配列が含まれています。これには EntitlementIdItemIdSKUId が含まれます。これらの ID は、後でアイテムまたは特定のエンタイトルメント情報を取得するために使用できます。

注記

名前空間と環境に依存しない独自のアイテム ID を持っている場合は、SKU 関連の関数を使用することをお勧めします。自動生成される ItemId とは異なり、管理者ポータルで SKU ID を手動で定義できます。詳細については、アイテムの作成ドキュメントを参照してください。

エンタイトルメントの引き換えたアイテムを確認する

引き換えたアイテムを確認するには、エンタイトルメント API から getUserEntitlementById を呼び出します。応答には、引き換えたアイテムに関する詳細情報を記載した itemSnapshot が含まれています。エンタイトルメントがコードの引き換えプロセスの結果である場合、応答に表示されるエンタイトルメントソースは `REDEEM_CODE である必要があります。

FString EntitlementId = "EntitlementId"
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient("key");

ApiClient->Entitlement.Entitlement.GetUserEntitlementById(EntitlementId, THandler<FAccelByteModelsEntitlementInfo>::CreateLambda([](const FAccelByteModelsEntitlementInfo& Result)
{
UE_LOG(LogTemp, Log, TEXT("The redeemed item ID: %s with name %s"), *Result.ItemId, *Result.ItemSnapshot.Name);
}), FErrorHandler::CreateLambda([](int32 Code, const FString& Message){}));

SKU によるユーザーエンタイトルメントの取得

この関数はまだ SDK でサポートされていませんが、エンドポイントは API で使用できます。

サードパーティのアイテムエンタイトルメントの同期

Apple

Apple のエンタイトルメントを同期するには、次の関数を使用します。

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient("key");

//login with apple account
FString AppleAuthToken = “Token-from-apple”;
ApiClient->User.LoginWithOtherPlatform(EAccelBytePlatformType::Apple, AppleAuthToken), FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
//do something when success
}), FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
//do something when error
}));

...

//sync apple item entitlement
bSyncDone = false;
FAccelByteModelsPlatformSyncMobileApple SyncReqApple;
SyncReqApple.ProductId = "testProductIdInvalid";
SyncReqApple.TransactionId = "testTransactionIdInvalid";
SyncReqApple.ReceiptData = "testReceiptDataInvalid";
SyncReqApple.ExcludeOldTransactions = true;
SyncReqApple.Region = "ID";
SyncReqApple.Language = "en";
ApiClient->Entitlement.SyncMobilePlatformPurchaseApple(SyncReqApple
, FVoidHandler::CreateLambda(
[=]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
})
, FErrorHandler::CreateLambda(
[](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogAccelByteEcommerceTest, Log, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
})
);

Google

Google のエンタイトルメントを同期するには、次の関数を使用します。

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient("key");
//login with Google account
FString GoogleAuthToken = “Token-from-Google”;
ApiClient->User.LoginWithOtherPlatform(EAccelBytePlatformType::Google, GoogleAuthToken ), FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
//do something when success
}), FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
//do something when error
}));

...

FAccelByteModelsItemInfo itemInfo;
ApiClient->Item.GetItemBySku(TEXT("sku-number")
, TEXT("en")
, TEXT("US")
, THandler<FAccelByteModelsItemInfo>::CreateLambda(
[=](const FAccelByteModelsItemInfo& Response)
{
itemInfo = Response;
})
,FErrorHandler::CreateLambda(
[&bGetItemDone](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Log, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
})
);

...

FAccelByteModelsPlatformSyncMobileGoogle SyncReqGoogle;
SyncReqGoogle.OrderId = TEXT("test-OrderId");
SyncReqGoogle.PackageName = TEXT("test-packageName");
SyncReqGoogle.ProductId = TEXT("testProductId");
SyncReqGoogle.PurchaseTime = 0;
SyncReqGoogle.PurchaseToken = TEXT("test.PurchaseToken");
if (bGetItemSuccess == true && itemInfo.EntitlementType == EAccelByteEntitlementType::DURABLE)
{
SyncReqGoogle.AutoAck = true;
}
else
{
SyncReqGoogle.AutoAck = false;
}
SyncReqGoogle.Region = TEXT("ID");
SyncReqGoogle.Language = TEXT("en");

if (!GoogleConfig.ApplicationName.IsEmpty())
{
ApiClient->Entitlement.SyncMobilePlatformPurchaseGooglePlay(SyncReqGoogle
, THandler<FAccelByteModelsPlatformSyncMobileGoogleResponse>::CreateLambda(
[&bSyncDone](FAccelByteModelsPlatformSyncMobileGoogleResponse const& response)
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
if (response.NeedConsume)
UE_LOG(LogTemp, Log, TEXT("The item is consumable"));
if (!response.NeedConsume)
UE_LOG(LogTemp, Log, TEXT("The item is durable"));
})
, FErrorHandler::CreateLambda(
[&bSyncDone](int32 ErrorCode, const FString& ErrorMessage)
{
bSyncDone = true;
UE_LOG(LogTemp, Log, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
})
);
}

Twitch

Twitch のエンタイトルメントを同期するには、次の関数を使用します。

FString TwitchAuthToken = "Token-from-twitch";
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient("key");

//login with apple account
ApiClient->User.LoginWithOtherPlatform(EAccelBytePlatformType::Twitch, TwitchAuthToken), FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
//do something when success
}), FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
//do something when error
}));

...

//sync twitch entitlement
FAccelByteModelsTwitchDropEntitlement model;
model.GameId = TEXT("123456"); //your gameId
model.Region = TEXT("US");
model.Language = TEXT("en-US");
ApiClient->Entitlement.SyncTwitchDropEntitlement(model,
FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
//do something when success
}),FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Warning, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
//do something when error
}));