商店和销售(旧版 Economy)

重要

经济 v1 API 处于维护模式,将不会收到任何新功能,只有 bug 修复。 v1 API 将在可预见的未来进行维护。 请参阅 经济 v2 概述 ,详细了解 PlayFab 经济的下一个版本!

在 PlayFab 中,商店是在目录货币的基础上构建的。 你的主目录应定义游戏中的所有物品,并以你创建的货币为它们分配价格。

商店应定义目录中物品的子集,并使其可按不同于目录价格的特定价格进行购买。

商店允许你挑出一组特定物品,然后使它们可在设定时间段内以特定价格获得。

本教程说明了基于虚拟货币和真实货币定义商店的最佳实践。

要求

  • 熟悉 PlayFab Game Manager
  • 已经定义了一个或多个虚拟货币。 本教程中的后一个示例使用:
    • SP银件
    • GP金件)。
  • 你必须已经定义了具有一个或多个物品的主要目录
    • 第一个示例使用多个物品/捆绑包,类似于奖品表教程中描述的那些。
    • 本教程中的第二个示例使用小、中、大生命药水。

最佳做法

目录价格应为固定的长期价格,它们定义物品的真实价格。

商店应是临时的,根据你的 LiveOps 策略进行添加和删除。

注意

期望通过循环商店以及将物品转入和转出活动商店来获得大部分收入。

有关商店和目录定价的一般信息

  • 定价:目录中定义的价格应定义为物品的常规价格。 商店允许你使用常见零售策略定义物品的临时销售价格。 或者,商店可为通常根本不可销售的物品提供临时价格。
  • 零成本:如果特定货币的物品成本未设置 (null) 或为,则不能对目录和商店使用该货币进行购买。 可以通过将其他货币的该条目留空或将它们重置为,零成本使物品以专用免费货币或专用付费货币获得。
  • 实际货币:“RM”货币在所有目录和商店中均可用。 RM 是受限制的货币密钥,仅指示实际货币交易。 你应仅为具有重要价值的物品或有付费货币的捆绑包/容器收取 RM。
  • 价格为二者择一:如果对某个物品定义了两个价格,可使用其中一个或另一个价格购买该物品。 对于单个物品不可要求两种货币。

定义实际货币商店

Game Manager 中:

  • 导航到你的“游戏”。
  • 从左侧菜单中选择“Economy”。
  • 在“目录”选项卡上,选择主目录,然后选择“商店”。
  • 选择“新建商店”按钮。

奖品表示例中,我们创建了一个有 11 个物品的奖品捆绑包。 对于此示例,我们将使三个类似捆绑包可在实际货币商店获得。

注意

任何物品都可以实际货币出售,但最佳做法是仅使特定贵重物品或捆绑包可直接获得。

下面提供的屏幕截图显示了一个全新的商店,其中包含三个可用实际货币获得的物品捆绑包

Game Manager - Economy - 编辑商店

我们的高级教程无收据付款处理介绍如何完成实际货币购买的具体信息。

实际货币商店的最佳实践

如何使用实际货币在很大程度上取决于游戏的具体设计。 直接购买游戏内物品是有效的,但不太常用。

更典型的情况是,你的游戏应允许使用实际货币购买付费虚拟货币。 你可以使用付费货币与实际货币的不同比率来循环多个商店。

提示

要点是确保玩家能够始终为你付钱。

定义虚拟货币商店

我们来了解用虚拟货币购买游戏内物品的具体细节和代码。

初始步骤与上一示例几乎相同:

  1. 创建三个新物品:大生命药水,它们具有免费货币价格和付费货币价格。
  2. 新建销售这些物品的商店。

Game Manager - Economy - 新建商店

一次性购买多个物品

要用虚拟货币购买单个物品,可以使用 PurchaseItem 方法,如商店快速入门中所述。 本教程介绍了如何在一次购买中购买多个物品。

此过程的第一步应是获取商店,并将其显示给用户。

void GetVcStore()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog
    var storeId = "Potion Store"; // In your game, this should be a constant for a permanent store, or retrieved from titleData for a time-sensitive store
    var request = new GetStoreItemsRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId
    };
    PlayFabClientAPI.GetStoreItems(request, LogSuccess, LogFailure);
}

此示例中的LogSuccess回调将接收GetStoreItemsResult,其中包含商店中所有物品的完整描述、它们的商店价格以及商店本身包含的任何元数据。

展示商店的最佳实践

具有商店的游戏应使用 GetCatalogItems 方法调用和缓存其主目录。 可以在待售物品旁显示目录价格和商店价格,以及 10% 折扣或类似的奖励修饰。

提示

玩家更有可能购买特价商品,尤其是此销售为限时优惠。

此时,GUI 代码负责向用户提供机会来选择他们想要购买的物品和数量。

  • 在游戏与 PlayFab 之间,剩下的步骤是几个单独的 API 调用,但你可使玩家看不到多个调用的顺序。
  • 预先收集有关购买的所有信息,然后在收集了所有玩家输入后进行完整的调用顺序。
void DefinePurchase()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog.
    var storeId = "Potion Store"; // At this point in the process, it's just maintaining the same storeId used above.
    var request = new StartPurchaseRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId,
        Items = new List<ItemPurchaseRequest> {
             // The presence of these lines are based on the results from GetStoreItems, and user selection - Yours will be more generic.
            new ItemPurchaseRequest { ItemId = "Small Health Potion", Quantity = 20,},
            new ItemPurchaseRequest { ItemId = "Medium Health Potion", Quantity = 100,},
            new ItemPurchaseRequest { ItemId = "Large Health Potion", Quantity = 2,},
        }
    };
    PlayFabClientAPI.StartPurchase(request, result => { Debug.Log("Purchase started: " + result.OrderId); }, LogFailure);
}

在物品选择过程中,必须使用户能够选择他们想要为这些物品支付的货币。 在此示例中,所有物品都有以SPGP为单位的价格,这意味着用户可选择要支付的货币。

注意

上述代码示例中 StartPurchase API 的结果包含一列 PaymentOptions。 每个付款选项都包含可用于进行购买的CurrencyPriceProviderName

限制

单次购买只允许使用一种虚拟货币。 所有选择的物品都必须能够以单一货币购买。

必须在调用中指定货币,当有多种可能的货币时,这很重要。 如果请求中有物品没有使用所选货币的相应价格,该顺序将失败。

还必须在调用中指定 ProviderName。 对于实际货币购买,提供商名称是用于为购买提供资金的人员,例如 Facebook、PayPal 或 Steam。 对于虚拟货币购买,它将是基于游戏 ID 的字符串。 可以从 StartPurchaseResultPaymentOptions 字段中获取 ProviderName,如上一注释中所述。

提示

对于虚拟货币购买,游戏的 ProviderName 是一个字符串,由单词“Title”与十六进制 TitleId 的十进制等效值串联而成。 例如,“Title123456”。

展示商店物品的最佳实践

确保商店中的所有物品都具有一致的选项,从而避免让玩家感到困惑。

实际货币物品应位于与付费 VC 物品以及免费 VC 物品不同的商店中。 如果单个商店允许使用多种货币,则该商店中的所有物品都应始终使用相同的多种货币组合。 创建所需数量的商店,以便提供顺畅的客户体验。

void DefinePaymentCurrency(string orderId, string currencyKey, string providerName)
{
    var request =new PayForPurchaseRequest {
        OrderId = orderId, // orderId comes from StartPurchase above.
        Currency = currencyKey, // User defines which currency they wish to use to pay for this purchase (all items must have a defined/non-zero cost in this currency).
        ProviderName = providerName // providerName comes from the PaymentOptions in the result from StartPurchase above.
    };
    PlayFabClientAPI.PayForPurchase(request, LogSuccess, LogFailure);
}

最后,完全定义购买后,便可完成该过程,如下所示。

// Unity/C#
void FinishPurchase(string orderId)
{
    var request = new ConfirmPurchaseRequest { OrderId = orderId };
    PlayFabClientAPI.ConfirmPurchase(request, LogSuccess, LogFailure);
}

处理 API 失败结果的最佳实践

任何单个 API 调用都可能因很多原因而失败。 手机等无线设备通常可能出现连接断断续续的情况,任何互联网电话都可能因随机延迟而失败。

每次调用都应检查是否存在多个故障情况。 如果响应显示请求无效(例如,无法购买具有单种货币的多个物品),应中止。 你的商店设计可能存在问题。

如果响应指示连接失败,可使用指数后退延迟再次尝试。

总结

商店是鼓励玩家购买物品的一个绝佳机制。

商店可使用任何类型的虚拟货币。 商店还可通过一系列替代 API 方法使用实际货币。

有关实际货币购买的详细信息,请参阅非收据付款处理

有关高级商店的使用,请参阅面向玩家细分的自定义商店教程。