订阅

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

订阅 在体验中让您向用户提供 recurring 付费。与通行证类似,订阅和通行证的主要区别是,通行证的福利是在永久性基础上授予的,而不是在用户付费时付费。Roblox 的订阅有以下特点:

  • 自动重新订阅: 订阅是自动重新订阅,不是一次性购买,并且以本地货币价格。
  • Robux 支付: 您在 Robux 上收到订阅收入。有关更多信息,请参阅通过订阅赚取
  • 单一层级: 所有在体验中拥有的订阅都可以由用户同时拥有。不支持互为独立的订阅。

用户可以使用 Roblox 礼品卡积分或信用卡或 Debit 卡在桌面应用程序或网站上购买订阅,并通过 Apple 和 Google 商店在资格区域的 Apple 和 Google 商店购买订阅。用户可以在 Roblox 帐户设置中查看和管理他们的订阅购买。

订阅将在未来向更多地区扩展。 不可用区域包括: 阿根廷、哥倫比亞、印度、印度尼西亚、日本、俄罗斯、台湾、土耳其、阿联酋、乌克兰和越南。

订阅指南

在创建您的订阅之前,请确保它们与 Roblox 的使用条款 一致,并且遵守当地法律。 任何与骗局、试图欺骗用户、或者违反我们的 社区标准 有关的体验都将被淘汰。 另外,请确保您的订阅遵守以下指导方针:

  • 提供清除、明确的订阅选项: 使用短、精确、自我解释的名称来区分订阅选项之间。 指定价格和持续时间为每个选项在体验中购买时。
  • 在平台和设备上提供相同的优惠: 无论订阅是否从特定的购买渠道购买,请确保用户在任何给定的订阅计划上都获得相同的优惠。
  • 设计订阅以适合 друг друга并总体体验: 提供“青铜”、“银”和“金”等相同套餐的礼遇,这些礼遇之间是相互独立的,目前不是可用的。请确保订阅代表不同的套餐。
  • 为订阅期满的订阅提供福利: 一旦订阅优惠活动开已发布,请尊重已描述的福利,并且不要在场景后取消福利。
  • 不要在体验中引导用户购买其他平台的产品(例如移动、网站等): 在您使用 Roblox 应用程序向用户发送交流时,您可以自由地与用户交流,但您不能在体验中引导用户购买其他平台的产品。
  • 不要因为用户付费(游戏)费时再次提供订阅收益而使用额外要求: 要求用户执行与社交媒体发布等额外任务,以获得付费用户已付费的权利。 此指南不会影响战斗通行证,因为您可以在创建和市场销售两种订阅购买。

创建订阅

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

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

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

  3. 创建一个独特的 订阅名 。 在体验中不能有两个订阅使用相同的名称。 此订阅名称在帐户声明中与体验名称的缩写版本一起出现。 允许字符是 a-z、a-z、0-9、空格和 .,:/!?@#&'

  4. 写一个 描述 您的订阅。这是用户决定购买您的订阅时看到的内容。您的描述必须清晰地描述您的订阅提供的好处。描述是由 1,000 个字符限制,并且支持表情符号。激活订阅后,您无法减少其好处。

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

    1. 耐久: 永久物品,例如武器。如果订阅包含一系列不同类型的商品,其中一个或多个商品耐久,例如配有剑和药水的价值包,请选择 耐久 作为其产品输入。
    2. 消耗品: 临时重购可能物品,该过期后使用或获取得,例如消耗的药水,可以提供临时强化道具,例如持续时间的消耗。
    3. 货币: 任何用户可以在您的体验内购买物品的中间货币。
  6. 选择您的订阅价格 美元 。您根据网站价格赚取 Robux。移动应用程序订阅者的价格要高得多。订阅者的价格要在本地货币中计费。

  7. 重复速度是用户订阅的费用。目前,该值为每月。单击 创建订阅

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

激活订阅

一旦订阅准备好上架,请单击 在订阅页面右上角,然后选择 激活 。激活的订阅可以在 体验详情 页面上以及在体验中自身购买。

在第一次激活您的订阅时,您必须确认您的体验名称的缩减版。此缩减版体验名称在用户订阅时显示,显示在创建订阅。它还显示在 Roblox 和 App Store 设置中管理订阅。

编辑订阅

您可以在激活和未激活订阅之间有 up to 50 个订阅 per experience 。要编辑订阅,请导航到您的体验在 创建者面板 中,然后选择 货币化产品 > 订阅。

您可以编辑订阅的图像、描述或状态。如果您想要编辑更多这些属性,您需要删除并重新创建订阅以反映所需的更改。

更改图像

要更新订阅图像:

  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)

提示订阅购买

虽然用户可以直接从体验的 游戏详细信息 页面购买订阅,但您也应该添加在游戏中购买订阅的方法。

当您提示订阅购买时,Players.UserSubscriptionStatusChanged 会触发,如果玩家已经拥有订阅,这可以帮助捕捉玩家在游戏详细信息页面上购买订阅时。

尽管您可以从客户端提示购买订阅,但检查用户是否已经有订阅必须从服务器进行。

此示例创建了一个 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 (desktop) 或 $12.99 (移动) 订阅:

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

收入将受到 30 天的保留,并在订阅期满后的 Robux 余额中添加。如果用户在持有期间内通过银行或应用商店请求退款,持有将被取消,您将不收到该交易的付款。

受到的退款在持有窗口之外将结果退款的交易金额,扣除您的 Robux 余额。如果您的体验是由群组拥有,群组的余额小于要扣除的交易金额,剩余将从群组所有者的 Robux 余额中扣除。

用户取消有效的订阅,但未能重新订阅会不会自动导致退款?用户必须手动请求退款,这是由案件到案的基础。有关用户订阅退款过程的更多信息,请参阅帮助中心

订阅支付

付款是在 Robux Balance > My Transactions 中找到:

订阅群组订阅 付款显示在 即将到来的 Robux 下,而退款是按群组顺序返还 Robux 为0> 支付反向0>。 订阅和群组订阅子页为其各类别提供额外信息。

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

订阅分析

订阅分析 帮助您衡量个人订阅的成功,识别趋势,并预测未来的潜在收益。订阅在激活后会添加到订阅分析页面,不会在它们被关闭或删除时删除。您可以通过“创建者仪表板”访问预制分析,或者通过 webhook 实时传输订阅更新。

通过创建者仪表板

要访问“创作中心”上的订阅分析:

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

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

订阅分析跟踪以下指标:

  • 订阅: 您体验中的订阅总数。
  • 预计收入: 体验费后赚取的净收入。不包括退款信息。
  • 订阅者分析: 不同类型的订阅者。
    • 新增 : 第一次订阅者的订阅数量。
    • 更新了 : 购买在以前期间购买的订阅数量。
    • 复活了 : 用户之前取消的用户购买的新订阅数。
  • 取消订阅 : 取消订阅的订阅数量。这包括所有取消订阅的订阅,无论是用户取消、创建创作者启用其他方式取消订阅或其他方式取消。
    • 取消是与退款不同的。取消的订阅是订阅将不再重新更新,但是在剩余的帐户单价回款的订阅,而不是退款返回用户。
  • 按平台订阅 :每个平台上购买的订阅数量。
  • 平台收益 :通过每个平台购买订阅获得的净收入。

此信息以 趋势 选项卡中的日期范围和 历史 选项卡中的总订阅数量为基础,显示为曲线图形,并作为历史选项卡中提供的完整列表。

通过 Webhook

云端 API 网站连接器包括四个订阅事件的触发:取消、购买、退款和续费。这些通知立即触发, so you can 在实时时间或创建自己的自定义分析。有关设置 webhook 的更多信息,请参阅webhook 通知