一个 开发者产品 是用户可以购买多次的物品或能力,例如游戏内货币、弹药或药水。

创建开发者产品
要创建开发者产品:
- 转到 Creations 并选择一个游戏。
- 转到 货币化 ⟩ 开发者产品。
- 点击 创建开发者产品。
- 上传一张图片作为产品图标。确保图片不超过 512x512 像素,不包含圆形边界外的重要细节,并且格式为 .jpg、.png 或 .bmp。
- 输入产品名称和描述。
- 选择产品的类别。此类别用于组织您在游戏内商店中的物品。
- 设置产品的价格以 Robux 计。最低价格为 1 Robux,最高价格为 10亿 Robux。
- 点击 保存更改。
获取开发者产品 ID
要使用脚本,您需要开发者产品 ID。获取产品 ID 的方法如下:
转到 货币化 ⟩ 开发者产品。
悬停在产品缩略图上,点击 ⋯ 按钮,并在上下文菜单中选择 复制资产 ID。

销售开发者产品
在销售开发者产品之前,请确保您正确处理销售收据并向用户授予他们购买的产品。为此,您必须:
- 使用 ProcessReceipt API 检查购买收据。ProcessReceipt 会自动读取并确认用户在游戏外购买了产品。
- 验证每个收据的 用户 ID、开发者产品 ID 和收据状态。
- 如果收据的状态为 开放,则向用户授予他们所购买的开发者物品。
- 对 ProcessReceipt API 响应一个消息,确认收据并验证所购买的物品已被授予。
您可以通过两种方式销售开发者产品:
在您的游戏内
要在游戏内实现和销售开发者产品,请调用 MarketplaceService 函数。
使用 GetProductInfo 检索开发者产品的诸如名称和价格等信息,然后将该产品展示给用户。例如,您可以在游戏的市场中销售该产品。对于开发者产品,第二个参数必须为 Enum.InfoType.Product。
local MarketplaceService = game:GetService("MarketplaceService")
-- 用你的开发者产品 ID 替换占位符 ID
local productId = 000000
local success, productInfo = pcall(function()
return MarketplaceService:GetProductInfo(productId, Enum.InfoType.Product)
end)
if success and productInfo then
-- 显示产品信息
-- 用 UI 代码替换打印语句以显示产品
print("开发者产品名称: " .. productInfo.Name)
print("价格(Robux): " .. productInfo.PriceInRobux)
print("描述: " .. productInfo.Description)
end
使用 GetDeveloperProductsAsync 检索与您的游戏关联的所有开发者产品。此功能返回一个 Pages 对象,您可以检查和过滤以构建游戏内商店或产品列表 GUI。
local MarketplaceService = game:GetService("MarketplaceService")
local success, developerProducts = pcall(function()
return MarketplaceService:GetDeveloperProductsAsync()
end)
if success and developerProducts then
local firstPage = developerProducts:GetCurrentPage()
for _, developerProduct in firstPage do
-- 用 UI 代码替换打印语句以显示产品
print(field .. ": " .. value)
end
end
使用 PromptProductPurchase 提示用户在游戏内购买产品。您可以在用户执行诸如按下按钮或与供应商 NPC 交谈等操作时调用此功能。
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- 用你的开发者产品 ID 替换占位符 ID
local productId = 000000
local function promptProductPurchase()
local success, errorMessage = pcall(function()
MarketplaceService:PromptProductPurchase(player, productId)
end)
if success then
print("成功显示购买提示")
end
end
您还可以将函数组合在 LocalScript 中。例如,您可以创建 UI 元素,如按钮或供应商 NPC,然后使用 GetProductInfo() 将现有的开发者产品与该元素连接,检查产品是否在售,并使用 PromptProductPurchase() 每当用户点击时提示购买。
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local button = script.Parent
-- 用你的开发者产品 ID 替换占位符 ID
local productId = 000000
-- 用户点击 UI 按钮时获取产品信息
button.MouseButton1Click:Connect(function()
local success, productInfo = pcall(function()
return MarketplaceService:GetProductInfo(productId, Enum.InfoType.Product)
end)
if success and productInfo then
-- 检查产品是否在售
if productInfo.IsForSale then
print("此产品正在销售")
-- 提示产品购买
MarketplaceService:PromptProductPurchase(player, productId)
else
-- 通知产品当前不在售
print("此产品当前不在售。")
end
else
print("获取产品信息时出错: " .. tostring(productInfo))
end
end)
在您的游戏外
要在游戏外启用开发者产品购买,您必须使用 ProcessReceipt API。在用户在您的游戏详细信息页面的 商店 标签中进行购买后,您必须使用 ProcessReceipt 确认他们的购买并在他们进入游戏后授予他们的物品。
测试模式
测试模式 功能帮助您验证通过模拟开发者产品在游戏外的购买流程。您应该使用测试模式以确保您正确实现了 ProcessReceipt,然后再启用外部开发者产品销售。
您在测试模式下销售的开发者产品只能被您和您的组的成员看到。它们对用户不可见。
要测试您的实现:
- 在 Creator Hub 中,转到 货币化 ⟩ 开发者产品。
- 点击 ⋮ 菜单并选择 外部购买设置。
- 在 外部购买设置 页面,点击 启用测试模式。
- 测试模式启用后,返回 开发者产品 页面并选择要测试的产品。
- 在 基本设置 页面,选择 允许外部购买 复选框并保存更改。
- 转到游戏详细信息页面的 商店 标签,购买您已提供销售的产品。
- 进入游戏并确认您已收到所购买的产品。ProcessReceipt API 的收据状态应更新为 已关闭。
测试实现后,Roblox 会验证测试是否已成功完成,并允许您完全启用外部开发者产品销售功能。
有关 ProcessReceipt API 及其实现的更多信息,请参见 ProcessReceipt 页面。
启用外部销售
要启用外部销售:
- 转到 外部购买设置 页面。
- 打开 外部购买。
- 返回 开发者产品 页面并选择要在游戏外销售的产品。
- 在 基本设置 页面,选择 允许外部购买 复选框并保存更改。
- 确认产品现在在游戏详细信息页面的 商店 标签中可以购买。
要禁用开发者产品的外部销售,请在 开发者产品 页面上选择该产品并清除 允许外部购买 复选框。
限制
- 测试模式下的待售物品实际花费 Robux。我们建议测试低成本的开发者产品。
- 测试模式下的待售物品只能被您或您的组的成员看到。
- 要在外部出售,您的开发者产品 必须 有缩略图。
- 不应在游戏外销售以下物品:
- 付费随机物品
- 限定于特定数量、时间、地点或用户设置和角色的物品
处理开发者产品购买
在用户购买开发者产品后,您必须处理并记录交易。为此,使用 Script 在 ServerScriptService 中使用 ProcessReceipt 函数。
有关 ProcessReceipt API 及其实现的更多信息,请参见 ProcessReceipt 页面。
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local productFunctions = {}
-- 示例:产品 ID 123123 恢复用户的全部健康
productFunctions[123123] = function(receipt, player)
local character = player.Character
local humanoid = character and character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = humanoid.MaxHealth
-- 表示购买成功
return true
end
end
-- 示例:产品 ID 456456 奖励用户 100 个金币
productFunctions[456456] = function(receipt, player)
local leaderstats = player:FindFirstChild("leaderstats")
local gold = leaderstats and leaderstats:FindFirstChild("Gold")
if gold then
gold.Value += 100
return true
end
end
local function processReceipt(receiptInfo)
local userId = receiptInfo.PlayerId
local productId = receiptInfo.ProductId
local player = Players:GetPlayerByUserId(userId)
if player then
-- 获取与开发者产品 ID 相关联的处理函数并尝试运行
local handler = productFunctions[productId]
local success, result = pcall(handler, receiptInfo, player)
if success then
-- 用户已经获得了他们的物品
-- 返回 "PurchaseGranted" 确认交易
return Enum.ProductPurchaseDecision.PurchaseGranted
else
warn("处理收据时失败:", receiptInfo, result)
end
end
-- 用户的物品无法授予
-- 返回 "NotProcessedYet" 并在用户下次加入游戏时再次尝试
return Enum.ProductPurchaseDecision.NotProcessedYet
end
-- 设置回调
-- 这只能通过一个服务器脚本完成一次
MarketplaceService.ProcessReceipt = processReceipt
个性化您的游戏内商店
您可以使用产品智能 API 对开发者产品进行排序并推荐给用户。个性化您的游戏内商店有助于将最相关的物品展示给每个用户,提高参与度和收入。通过根据用户偏好定制开发者产品,您可以改善其发现,提高转换率,并解锁新的货币化机会。
为待售开发者产品排名
RankProductsAsync 接收一组产品 ID,并返回这些产品的个性化排序列表。您可以使用此方法为用户提供个性化的物品推荐。

local MarketplaceService = game:GetService("MarketplaceService")
-- 创建一个您想要排名的产品数组
local productIdentifiers = {
{InfoType = Enum.InfoType.GamePass, Id = 123},
{InfoType = Enum.InfoType.Product, Id = 456},
{InfoType = Enum.InfoType.Product, Id = 789}
}
-- 进行保护调用以处理错误
local success, rankedProducts = pcall(function()
return MarketplaceService:RankProductsAsync(productIdentifiers)
end)
if not success then
error("产品排名失败")
end
-- 将返回的物品加载到商店中
for i, rankedItem in ipairs(rankedProducts) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- 将产品添加到商店的逻辑
end
显示您的顶级开发者产品
RecommendTopProductsAsync 接收一个 InfoType 值数组,并返回用户最有可能参与和购买的最多 50 个物品。您可以使用此方法在游戏内商店创建 “精选” 部分。
如果无法确定推荐,RecommendTopProductsAsync 将返回 0 个物品。
在少数情况下,对排名模型的调用可能会很慢。为了帮助防止用户出现额外的延迟,我们建议使用 task.spawn 使对 RecommendTopProducts 的调用为非阻塞。

local MarketplaceService = game:GetService("MarketplaceService")
-- 创建一个您想要包含在推荐中的产品类型数组 -- 此示例同时包含通行证和开发者产品
local productTypes = {Enum.InfoType.GamePass, Enum.InfoType.Product}
-- 进行保护调用以处理错误
local success, topRankedItems = pcall(function()
return MarketplaceService:RecommendTopProductsAsync(productTypes)
end)
if not success then
error("产品排名失败")
end
-- 将返回的物品加载到商店中
-- 确保从 topRankedItems 中过滤掉任何不合格的物品,例如用户不再可以购买的开发者产品
for i, rankedItem in ipairs(topRankedItems) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- 将产品添加到商店的逻辑
end
开发者产品分析
使用开发者产品分析来分析单个产品的成功情况,识别趋势并预测潜在未来收益。
通过分析,您可以:
- 查看您在选定时间段内的顶级开发者产品。
- 在时间序列图上展示最多八个销量最高的物品,以分析整体销售和净收入。
- 监控您的目录,并按销售和净收入对物品进行排序。
要访问开发者产品分析:
- 转到 Creations 并选择一个游戏。
- 转到 货币化 ⟩ 开发者产品。
- 选择 分析 标签。
