订阅

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

体验内的订阅 可让你为用户提供定期的好处以每月收费。与通行证类似,订阅与通行证之间的主要差异在于,通行证的利益是永久授予的,而订阅的利益取决于用户支付每月费用。Roblox 上的订阅具有以下特点:

  • 自动续订: 订阅是自动续订的,不是一次性购买,价格以当地货币计价。
  • Robux 支付: 你在 Robux 收到订阅收入。了解更多详情,请参阅 通过订阅获得收入
  • 单层结构: 体验内的所有订阅可以同时由用户拥有。不支持相互排他的订阅。

用户可以使用 Roblox 礼品卡积分或信用卡或借记卡在桌面应用程序或网站上购买订阅,或通过资格区域的 Apple 和 Google 商店的付款方式购买。用户可以在其 Roblox 帐户设置的 订阅 选项卡中查看和管理订阅购买。

订阅将在未来推出到更多地区。 不可用区域包括: 阿根廷、哥倫比亞、印度、印尼、日本、俄羅斯、臺灣、土耳其(土耳其)、阿聯酋、烏克蘭和越南。

订阅指南

在创建订阅之前,请确保它们与 Roblox 使用条款 一致,并遵守当地法律。任何参与诈骗、试图以虚假优惠引导用户或以其他方式违反我们的 社区标准 的经验都将被拆除。此外,确保您的订阅遵守以下指南:

  • 提供清除、可区分的订阅选项: 使用短、精确、易于解释的名称,将订阅选项与 друг дру之间区分开来。在体验商品化时,指定每个选项的价格和时长。
  • 在平台和设备上提供相同的好处: 无论订阅在哪里购买,都要确保用户获得相同的订阅计划的好处。
  • 设计订阅以适合彼此和整体体验提供: 将相同的套餐优惠分为"青铜"、"银"和"金"三个相互排他的层级,目前尚不可用。确保订阅代表不同的福利集合。
  • 为订阅的全期提供好处: 一旦订阅提供已发布效,请遵守描述的好处,并不要在幕后撤销好处。
  • 不要将用户指向另一个平台购买(例如移动、网页等体验中: 虽然您可以与平台外的用户交流,但使用 Roblox 应用程序将用户引导到另一个地方购买是被禁止的。
  • 不要因用户支付费用而增加要求,一旦用户支付费用,就无法获得他们支付费(游戏)的福利: 要求用户执行额外任务,例如发布到社交媒体,以获取他们支付的福利是禁止的。该指南不会影响战斗通行证,您可以创建并作为订阅购买市场化。

创建订阅

在您创建订阅之前,您必须是电话或身份证验证。要创建订阅:

  1. 导航到你的体验到 创建者仪表板 ,然后选择 货币化产品 > 订阅 。然后单击 创建订阅

  2. 为您的订阅上传封面图像。图像在审核后对其他人可见。

  3. 创建一个独特的 订阅名称 。体验中的两个订阅不能共享相同的名称。此订阅名称出现在收费声明中,旁边是您体验名称的缩略版。允许的字符为 a-z、A-Z、0-9、空格和 .,:/!?@#&'

  4. 写一个 描述 您的订阅。这是用户在决定购买您的订阅时看到的内容。您的描述必须清楚描述您的订阅提供的好处。描述受限于 1,000 个字符,支持表情符号。一旦您激活订阅,您无法减少其优惠。

  5. 选择订阅 产品类型 。有三种产品类型:

    1. 耐用: 使用或获取后仍然存在的永久物品,例如像武器这样的物理物品。如果订阅包含一组不同类型的商品,其中一个或多个具有持续时间的商品,例如包含剑和药水的价值包,请选择 可持续 作为其产品输入。
    2. 消耗品: 可临时重复购买的物品,例如消耗药水,可以在一段时间后过期,提供暂时提升。
    3. 货币: 任何用户可以使用的交换媒介,用于在你的体验中购买物品。
  6. 选择您订阅的价格 (以美元计) 。您根据网站价格获得 Robux。移动应用订阅者需支付更高的价格。订阅者以本地货币支付费用。

  7. 重复频率 是用户每多久需要为订阅付费。目前,这个值总是每月。点击 创建订阅

  8. 重新检查细节,然后单击 创建

激活订阅

一旦订阅准备好上架销售,点击订阅瓷砖右上角的 并选择 启用 。激活的订阅可在 体验详情 页面和体验本身中出售。

在第一次激活订阅之前,您必须确认简短版本的体验名称。当用户订阅时,显示这个缩短的体验名称,与你在 创建订阅 中创建的订阅名称一起出现。它还可以在 Roblox 和应用商店设置中管理订阅。

编辑订阅

您可以在激活和非激活订阅之间有最多 50 个订阅体验。要编辑订阅,请导航到您的体验在 创建者面板 并选择 货币化产品 > 订阅

您可以编辑订阅的图像、描述或状态。如果您想编辑这些属性以外的内容,您需要删除并重创订阅以进行所需更改。

更改图像

要更新订阅的图像:

  1. 选择订阅后,单击 更改 按钮。

  2. 选择新图像,然后单击 保存保存更改 。新图像在通过审核后生效。

更改描述

要更改订阅的描述:

  1. 选择订阅后,单击 描述 字段。
  2. 编辑描述,然后单击 保存更改 。描述限制为 1,000 个字符,可支持表情符号。
  3. 在确认窗口单击 是,确认 即可确认更改。描述更新立即反映。

更改状态

订阅有两种可能状态:

  • 激活 — 激活订阅可供出待售,订阅者可以在下一期的开始时续订他们的订阅。
  • 不活跃 — 不活跃的订阅无法待促销。

要更改订阅状态:

  1. 在订阅页面上,单击 在订阅瓷瓦片的右上角。无论是 启用取消销售 显示,取决于订阅当前状态以及其他选项,旁边。
  2. 选择 启用停止销售 来切换订阅状态。
    1. 如果您选择 停止销售 ,您将被提供允许现有订阅者更新或取消未来续订现有订阅者的选择。一通用来说,建议允许现有订阅者继续续订,除非你计划永久地从体验中删除相关的订阅优惠。

将订阅集成到体验中

这段代码示例是您体验中实现订阅检测的简单示例:


-- 在服务器上运行此代码
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local SUBSCRIPTION_ID = "EXP-11111111" -- 用您的订阅ID替换
local function grantAward(player: Player)
-- 你应该在这里授予与订阅相关的奖项
end
local function revokeAwardIfGranted(player: Player)
-- 这个方法被调用到每个玩家,如果他没有订阅_not_
-- 如果您的代码保存到数据存储中或提供一些需要“撤销”的好处
-- 你应该使用这种方法来处理撤销
end
local function checkSubStatus(player)
local success, response = pcall(function()
return MarketplaceService:GetUserSubscriptionStatusAsync(player, SUBSCRIPTION_ID)
end)
if not success then
warn(`Error while checking if player has subscription: {response}`)
return
end
if response.IsSubscribed then
grantAward(player)
else
revokeAwardIfGranted(player)
end
end
local function onUserSubscriptionStatusChanged(player: Player, subscriptionId: string)
if subscriptionId == SUBSCRIPTION_ID then
checkSubStatus(player)
end
end
Players.PlayerAdded:Connect(checkSubStatus)
Players.UserSubscriptionStatusChanged:Connect(onUserSubscriptionStatusChanged)

用订阅替换游戏通行证

在您的体验中部署订阅的一个选择是,用订阅替换现有的游戏通行证。如果您想快速在体验中实现订阅而不添加新功能或奖项,这是一个很好的选择。

当将游戏通行证替换为订阅时,有两个重要考虑因素:

  • 任何现有持有游戏通行证的人应继续收到他们支付的好处。
  • 游戏通行证应从销售中撤销,以便新用户可以购买订阅。
  • 订阅可以被撤销,这意味着如果您的游戏通行证以前将其优惠转为数据存商店,您需要“撤销”这些优惠。这一考虑不适用于所有游戏通行证实现,但可能适用于更复杂的实现。

以下代码示例显示如何用订阅替换游戏通行证:


-- 在服务器上运行此代码
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local LEGACY_GAME_PASS_ID = 1234 -- 用替换游戏通行证的订阅ID替换
local SUBSCRIPTION_ID = "EXP-11111111" -- 用您的订阅ID替换
local function awardBenefit(player: Player)
-- 你应该在这里奖励订阅者
end
local function revokeBenefitIfGranted(player: Player)
-- 这个方法被调用到每个玩家,如果他没有订阅_not_
-- 如果您的代码保存到数据存储中或提供一些需要“撤销”的好处
-- 你应该使用这种方法来处理撤销
end
local function checkSubscriptionStatus(player: Player)
local success, result = pcall(function()
return MarketplaceService:GetUserSubscriptionStatusAsync(player, SUBSCRIPTION_ID)
end)
if not success then
print(`Error fetching subscription status: {result}`)
return
end
if result.IsSubscribed then
awardBenefit(player)
else
revokeBenefitIfGranted(player)
end
end
local function onPlayerAdded(player: Player)
local success, result = pcall(function()
return MarketplaceService:UserOwnsGamePassAsync(player.UserId, LEGACY_GAME_PASS_ID)
end)
if not success then
print(`Error fetching game pass status: {result}`)
return
end
if result then
-- 如果玩家购买了遗产游戏通行证,我们不需要查找他们的订阅状态
-- 因为他们有终生获得的好处
awardBenefit(player)
return
end
checkSubscriptionStatus(player)
end
local function onUserSubscriptionStatusChanged(player: Player, subscriptionId: string)
if subscriptionId == SUBSCRIPTION_ID then
checkSubscriptionStatus(player)
end
end
local function onPromptGamePassPurchaseFinished(player: Player, purchasedPassID: number, purchaseSuccess: boolean)
if purchaseSuccess and purchasedPassID == LEGACY_GAME_PASS_ID then
awardBenefit(player)
end
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.UserSubscriptionStatusChanged:Connect(onUserSubscriptionStatusChanged)
-- 我们将继续在游戏中听取游戏通行证购买,以防游戏通行证仍在销促销中
MarketplaceService.PromptGamePassPurchaseFinished:Connect(onPromptGamePassPurchaseFinished)

提示订阅购买

虽然用户可以直接从体验的 游戏详情 页面购买订阅,但你也应该添加一种方法来在游戏中购买订阅。

当您提示订阅购买时, 会发生,如果玩家已经拥有订阅,这有助于捕捉玩家在游戏中购买订阅的场景,而他们已经在游戏中。

虽然您可以从客户端提示订阅购买,但检查用户是否已经通过 MarketplaceService.GetUserSubscriptionStatusAsync 订阅必须从服务器进行。

这个例子创建了一个 RemoteFunction 客户可以使用来请求订阅状态的:


--这段代码应该在服务器上运行
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- 创建一个客户端可以使用的远程函数,用于查询订阅状态
local getSubscriptionStatusRemote = Instance.new("RemoteFunction")
getSubscriptionStatusRemote.Name = "GetSubscriptionStatus"
getSubscriptionStatusRemote.Parent = ReplicatedStorage
getSubscriptionStatusRemote.OnServerInvoke = function(player: Player, subscriptionId: string)
assert(typeof(subscriptionId) == "string")
return MarketplaceService:GetUserSubscriptionStatusAsync(player, subscriptionId)
end

-- 这段代码应该在客户端运行
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local SUBSCRIPTION_ID = "EXP-11111111" -- 用您的订阅ID替换
local getSubscriptionStatusRemote = ReplicatedStorage:WaitForChild("GetSubscriptionStatus")
local purchaseSubscriptionButton = script.Parent.PromptPurchaseSubscription -- 替换为您的按钮
local function playerHasSubscription()
-- 注意,如果您的订阅正在替换游戏通行证,您也需要检查游戏通行证是否也属于这里
local success, result = pcall(function()
return getSubscriptionStatusRemote:InvokeServer(SUBSCRIPTION_ID)
end)
if not success then
print(`Error fetching subscription status: {result}`)
return
end
return result.IsSubscribed
end
-- 隐藏按钮,如果玩家已经订阅了
local function hideButtonIfPlayerHasSubscription()
if playerHasSubscription() then
purchaseSubscriptionButton.Visible = false
end
end
local function onPromptSubscriptionPurchaseFinished(player: Player, subscriptionId: string, didTryPurchasing: boolean)
if didTryPurchasing then
-- 注册订阅可能需要一段时间,因此我们将检查是否在 10 秒内完成了购买
-- 并隐藏按钮,如果它有
task.delay(10, hideButtonIfPlayerHasSubscription)
end
end
-- 如果玩家已经有订阅,我们不想显示按钮
hideButtonIfPlayerHasSubscription()
purchaseSubscriptionButton.Activated:Connect(function()
MarketplaceService:PromptSubscriptionPurchase(Players.LocalPlayer, SUBSCRIPTION_ID)
-- 如果玩家已经拥有订阅,隐藏按钮
hideButtonIfPlayerHasSubscription()
end)
MarketplaceService.PromptSubscriptionPurchaseFinished:Connect(onPromptSubscriptionPurchaseFinished)

其他相关功能

其他相关功能可用于 MarketplaceService :

通过订阅获得收入

订阅以本地货币计价,但你根据平台费用后选择的基础平台价格赚取 Robux 的速率为 0.01 美元到 1 Robux。Roblox仅在第一个月收取 30% 平台费,这意味着你从第二个月开始收到全额订阅收入。这个收入分配是在所有平台上一致的。

例如,如果用户以基价 $9.99(桌面)或 $12.99(移动)订阅:

  • 第一个月: 订阅的创建者收到 999 * .7 = 6991299 * .7 = 909(移动)。
  • 第二个月开始: 订阅的创建者收到 999 = 9991299 = 1299(移动)。

收入需要 30 天的保留,会在订阅全期结束后添加到您的 Robux 余额。如果用户在一个月的滞留期间通过银行或应用商店要求退订订阅,滞留将被取消,你将不会收到该交易的付款。

在撤销窗口之外收到的退款将导致退款金额从你的 Robux 余额中扣除。如果您的体验由群组拥有,群组的余额小于要扣除的金额,剩余部分将从群组所有者的 Robux 余额中扣除。

用户取消激活订阅并未能及时续订会自动导致退款。用户必须手动要求退款,这些退款以案件为基础进行处理。了解有关用户订阅退款过程的更多信息,请查看帮助中心

订阅支付

付款发现在 Robux 余额 > 我的交易 :

订阅群组订阅 付款出现在 收入 Robux下,而退款被组合在 出口 Robux下作为 付款撤销 。订阅和群组订阅子页面提供各自类别的额外信息。

要查看个人用户的退款信息,请使用 MarketplaceService:GetUserSubscriptionPaymentHistoryAsync()

订阅分析

订阅分析 帮助您衡量个人订阅的成功,识别趋势,并预测未来的潜在收入。订阅在激活后第一次添加到订阅分析页面,激活或删除后不会被移除。您可以通过创建者仪表板访问预制分析,或使用网络钩在实时更新订阅中捕获。

通过创建者仪表板

要在创建者仪表板上访问订阅分析:

  1. 导航到您的 创作 页面,在 创建者仪表板 上选择您的体验。

  2. 导航到 货币化 选项卡,然后选择 订阅

订阅分析跟踪以下指标:

  • 订阅: 您体验中的活订阅总数。
  • 预计收入: 经过费用后获得的体验收入。不包含退款信息。
  • 订阅者分布: 不同类型的订阅者。
    • : 第一次订阅者购买订阅数量。
    • 已续订 : 在以前期间购买的续订订阅数量。
    • 复活 : 由以前取消订阅的用户购买的新订阅数量。
  • 取消 : 未续订的订阅数量。这包括所有取消,无论是用户取消、创作者建者禁用订阅或其他手段取消。
    • 取消与退款不同。取消订阅是不再续订但仍支付剩余会计周期费用的订阅,而退款将返回用户支付的订阅金额。
  • 按平台订阅 :每个平台购买的订阅数量。
  • 平台收入 :每个平台购买的订阅收入的净收入。

这些信息可以在 趋势 选项卡下的日期范围形式中可见,也可以在 历史 选项卡下的全面列表中查看。

通过 webhook

云 API 网关功能包括四个订阅事件触发器:取消、购买、退款和续订。这些通知立即发射,因此您可以在实时响应或创建自己的自定义分析。了解有关如何设置 webhook 的更多信息,请参阅 webhook 通知