Aprenda
Classe do mecanismo
MarketplaceService
Não criável
Serviço

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.


Resumo
Métodos
GetProductInfo(assetId: number,infoType: Enum.InfoType):Dictionary
Obsoleto
GetUsersPriceLevelsAsync(userIds: {any}):{PriceLevelInfo}
PlayerOwnsAsset(player: Instance,assetId: number):boolean
Obsoleto
PlayerOwnsBundle(player: Player,bundleId: number):boolean
Obsoleto
PromptBulkPurchase(player: Player,lineItems: {any},options: Dictionary):()
PromptBundlePurchase(player: Instance,bundleId: number):()
PromptCancelSubscription(user: Player,subscriptionId: string):()
PromptGamePassPurchase(player: Instance,gamePassId: number):()
PromptPremiumPurchase(player: Instance):()
Obsoleto
PromptProductPurchase(player: Instance,productId: number,equipIfPurchased: boolean,currencyType: Enum.CurrencyType):()
PromptPurchase(player: Instance,assetId: number,equipIfPurchased: boolean,currencyType: Enum.CurrencyType):()
PromptRobuxTransferAsync(sender: Player,receiverUserId: number,amount: number):string
PromptSubscriptionPurchase(user: Player,subscriptionId: string):()
RankProductsAsync(productIdentifiers: {any}):{RankedItem}
RecommendTopProductsAsync(infoTypes: {any}):{RankedItem}
Membros herdados

Referência API
Métodos
BindReceiptHandler
Recursos: Monetization
MarketplaceService:BindReceiptHandler(
transactionType:Enum.ReceiptType, handler:function, filter:{any}?
Parâmetros
transactionType:Enum.ReceiptType
handler:function
filter:{any}?
Amostras de código
MarketplaceService:BindReceiptHandler
-- NOTA: Se seu manipulador conceder benefícios persistentes (moeda, itens), use
-- DataStoreService:UpdateAsync() no TransferRequestId para evitar
-- concessões duplas quando o mesmo recibo for entregue a múltiplos servidores.
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Manipule recibos do remetente (o jogador que enviou Robux)
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.RobuxTransferSender,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- O jogador não está neste servidor; adie para que o recibo seja
-- redelivered para o servidor em que ele está atualmente
return Enum.ReceiptDecision.NotProcessedYet
end
print(
`{player.Name} enviou {receiptInfo.CurrencySpent} Robux`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Conceda qualquer reconhecimento do lado do remetente ou atualize a UI aqui
return Enum.ReceiptDecision.Processed
end
)
-- Manipule recibos do receptor (o jogador que recebeu Robux)
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.RobuxTransferReceiver,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
return Enum.ReceiptDecision.NotProcessedYet
end
print(
`{player.Name} recebeu {receiptInfo.CurrencySpent} Robux`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Conceda qualquer benefício do lado do receptor ou atualize a UI aqui
return Enum.ReceiptDecision.Processed
end
)

GetDeveloperProductsAsync
Rendimentos
Recursos: AssetRead
MarketplaceService:GetDeveloperProductsAsync():Instance
Devolução
Amostras de código
MarketplaceService:GetDeveloperProductsAsync
local MarketplaceService = game:GetService("MarketplaceService")
local developerProducts = MarketplaceService:GetDeveloperProductsAsync():GetCurrentPage()
for _, developerProduct in pairs(developerProducts) do
for field, value in pairs(developerProduct) do
print(field .. ": " .. value)
end
print(" ")
end

GetProductInfo
Obsoleto

GetProductInfoAsync
Rendimentos
Recursos: AssetRead
MarketplaceService:GetProductInfoAsync(
assetId:number, infoType:Enum.InfoType
Parâmetros
assetId:number
infoType:Enum.InfoType
Valor Padrão: "Asset"
Devolução
Amostras de código
Obtendo Informações do Produto
local MarketplaceService = game:GetService("MarketplaceService")
local ASSET_ID = 125378389
local asset = MarketplaceService:GetProductInfoAsync(ASSET_ID)
print(asset.Name .. " :: " .. asset.Description)
Exibindo Descontos de Preço
local MarketplaceService = game:GetService("MarketplaceService")
local PASS_ID = 12345678
local textLabel = script.Parent
local DiscountTypeDisplay = {
RobloxPlusSubscription = "Desconto Roblox Plus",
}
local productInfo = MarketplaceService:GetProductInfoAsync(PASS_ID, Enum.InfoType.GamePass)
print(string.format("Preço Original: %d", productInfo.UserBasePriceInRobux))
for _, discount in ipairs(productInfo.PriceDiscountDetails) do
local displayName = DiscountTypeDisplay[discount.Type] or "Outro Desconto"
print(string.format("%s (%d%%): -%d", displayName, discount.Percent, discount.AmountInRobux))
end
print(string.format("Você Paga: %d", productInfo.PriceInRobux))
Exibindo Opções Temporizadas Disponíveis
local MarketplaceService = game:GetService("MarketplaceService")
local info = MarketplaceService:GetProductInfoAsync(105589844216517, Enum.InfoType.Asset)
if info.TimedOptions then
for _, option in info.TimedOptions do
local days = option.Duration / 86400
print(string.format("%d dias - %d Robux", days, option.Price))
end
end

GetRobloxSubscriptionDetailsAsync
Rendimentos
Recursos: Monetization
MarketplaceService:GetRobloxSubscriptionDetailsAsync(user:Player):Dictionary
Parâmetros
user:Player
Devolução
Amostras de código
Verificar Detalhes da Assinatura Roblox
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
local success, details = pcall(function()
return MarketplaceService:GetRobloxSubscriptionDetailsAsync(player)
end)
if success and details.IsSubscribed then
-- 1. Verifique a Lealdade (por exemplo, Assinado por > 60 dias)
local threeMonths = 60 * 24 * 60 * 60
if details.StartTime and (os.time() - details.StartTime.UnixTimestamp) > threeMonths then
print("Concedendo a skin 'Veterano de Assinatura de 3 Meses'!")
end
-- 2. Verifique a Atribuição
if details.IsOriginExperience then
print("Atribuição confirmada: Usuário assinado através desta experiência.")
else
print("Usuário assinado em outro lugar (Site ou outra Experiência).")
end
end
end)

GetSubscriptionProductInfoAsync
Rendimentos
Recursos: AssetRead
MarketplaceService:GetSubscriptionProductInfoAsync(subscriptionId:string):Dictionary
Parâmetros
subscriptionId:string
Devolução

GetUsersPriceLevelsAsync
Rendimentos
Recursos: Monetization
MarketplaceService:GetUsersPriceLevelsAsync(userIds:{any}):{PriceLevelInfo}
Parâmetros
userIds:{any}
Devolução
{PriceLevelInfo}
Amostras de código
Obter níveis de preço para uma lista de usuários
-- Obtenha o MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Defina uma função para recuperar níveis de preço para uma lista de usuários
local function getPriceLevels(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- Mapeie cada PriceLevelInfo para uma tabela de busca UserId -> PriceLevel
local lookup = {}
for _, info in ipairs(result) do
lookup[info.UserId] = info.PriceLevel
end
return lookup
else
warn("Erro ao obter níveis de preço:", result)
return nil
end
end
-- Exemplo usando IDs de espaço reservado
local user1Id = 123456789
local user2Id = 987654321
-- Chame a função e armazene o resultado
local priceLevels = getPriceLevels({user1Id, user2Id})
-- Se bem-sucedido, imprima o nível de cada usuário
if priceLevels then
print("Nível de preço para o Usuário 1:", priceLevels[user1Id])
print("Nível de preço para o Usuário 2:", priceLevels[user2Id])
else
print("Falha ao recuperar níveis de preço.")
end

GetUserSubscriptionDetailsAsync
Rendimentos
Recursos: Monetization
MarketplaceService:GetUserSubscriptionDetailsAsync(
user:Player, subscriptionId:string
Parâmetros
user:Player
subscriptionId:string
Devolução

GetUserSubscriptionPaymentHistoryAsync
Rendimentos
Recursos: Monetization
MarketplaceService:GetUserSubscriptionPaymentHistoryAsync(
user:Player, subscriptionId:string
Parâmetros
user:Player
subscriptionId:string
Devolução
Amostras de código
MarketplaceService:GetUserSubscriptionPaymentHistoryAsync
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local SUBSCRIPTION_ID = "EXP-0"
local function checkSubscriptionHistory(player: Player)
local subscriptionHistory = {}
local success, err = pcall(function()
subscriptionHistory = MarketplaceService:GetUserSubscriptionPaymentHistoryAsync(player, SUBSCRIPTION_ID)
end)
if not success then
warn(`Erro ao verificar o histórico de assinaturas: {err}`)
return
end
if next(subscriptionHistory) then
-- O usuário tem algum histórico de assinatura nos últimos 12 meses.
-- Imprima os detalhes de cada entrada de pagamento do histórico de assinaturas.
print(`O jogador {player.Name} já assinou {SUBSCRIPTION_ID} antes:`)
for entryNum, paymentEntry in subscriptionHistory do
local paymentStatus = tostring(paymentEntry.PaymentStatus)
local cycleStartTime = paymentEntry.CycleStartTime:FormatLocalTime("LLL", "en-us")
local cycleEndTime = paymentEntry.CycleEndTime:FormatLocalTime("LLL", "en-us")
print(`{entryNum}: {paymentStatus} ({cycleStartTime} - {cycleEndTime})`)
end
else
print(`O jogador {player.Name} nunca assinou {SUBSCRIPTION_ID} antes.`)
end
end
-- Chame checkSubscriptionHistory para todos os jogadores já no jogo
for _, player in ipairs(Players:GetPlayers()) do
checkSubscriptionHistory(player)
end
-- Chame checkSubscriptionHistory para todos os futuros jogadores
Players.PlayerAdded:Connect(checkSubscriptionHistory)

GetUserSubscriptionStatusAsync
Rendimentos
Recursos: Monetization
MarketplaceService:GetUserSubscriptionStatusAsync(
user:Player, subscriptionId:string
Parâmetros
user:Player
subscriptionId:string
Devolução
Amostras de código
Verificar Status da Assinatura do Usuário
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local subscriptionID = "EXP-00000"
local function checkSubStatus(player)
local subStatus = {}
local success, message = pcall(function()
-- retorna IsRenewing e IsSubscribed
subStatus = MarketplaceService:GetUserSubscriptionStatusAsync(player, subscriptionID)
end)
if not success then
warn("Erro ao verificar se o jogador possui assinatura: " .. tostring(message))
return
end
if subStatus["IsSubscribed"] then
print(player.Name .. " está inscrito com " .. subscriptionID)
-- Dar permissões ao jogador associadas à assinatura
end
end
Players.PlayerAdded:Connect(checkSubStatus)

PlayerOwnsAsset
Obsoleto

PlayerOwnsAssetAsync
Rendimentos
Recursos: AssetRead
MarketplaceService:PlayerOwnsAssetAsync(
player:Instance, assetId:number
Parâmetros
player:Instance
assetId:number
Devolução
Amostras de código
Verificar a Posse de Item
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- O item que estamos verificando: https://www.roblox.com/catalog/30331986/Midnight-Shades
local ASSET_ID = 30331986
local ASSET_NAME = "Midnight Shades"
local function onPlayerAdded(player)
local success, doesPlayerOwnAsset =
pcall(MarketplaceService.PlayerOwnsAssetAsync, MarketplaceService, player, ASSET_ID)
if not success then
local errorMessage = doesPlayerOwnAsset
warn(`Erro ao verificar se {player.Name} possui {ASSET_NAME}: {errorMessage}`)
return
end
if doesPlayerOwnAsset then
print(`{player.Name} possui {ASSET_NAME}`)
else
print(`{player.Name} não possui {ASSET_NAME}`)
end
end
Players.PlayerAdded:Connect(onPlayerAdded)

PlayerOwnsBundle
Obsoleto

PlayerOwnsBundleAsync
Rendimentos
Recursos: AssetRead
MarketplaceService:PlayerOwnsBundleAsync(
player:Player, bundleId:number
Parâmetros
player:Player
bundleId:number
Devolução
Amostras de código
Verificar Propriedade do Pacote
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- O pacote que estamos verificando: https://www.roblox.com/bundles/589/Junkbot
local BUNDLE_ID = 589
local BUNDLE_NAME = "Junkbot"
Players.PlayerAdded:Connect(function(player)
local success, doesPlayerOwnBundle = pcall(function()
return MarketplaceService:PlayerOwnsBundleAsync(player, BUNDLE_ID)
end)
if success == false then
print("A chamada para PlayerOwnsBundleAsync falhou: ", doesPlayerOwnBundle)
return
end
if doesPlayerOwnBundle then
print(player.Name .. " possui " .. BUNDLE_NAME)
else
print(player.Name .. " não possui " .. BUNDLE_NAME)
end
end)

PromptBulkPurchase
Recursos: PromptExternalPurchase
MarketplaceService:PromptBulkPurchase(
player:Player, lineItems:{any}, options:Dictionary
):()
Parâmetros
player:Player
lineItems:{any}
options:Dictionary
Devolução
()
Amostras de código
Cliente de Compra em Lote de Prompt
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local promptBulkPurchaseEvent = ReplicatedStorage:WaitForChild("PromptBulkPurchaseEvent")
local part = Instance.new("Part")
part.Parent = workspace
local clickDetector = Instance.new("ClickDetector")
clickDetector.Parent = part
clickDetector.MouseClick:Connect(function()
promptBulkPurchaseEvent:FireServer({
{ Type = Enum.MarketplaceProductType.AvatarAsset, Id = "16630147" },
{ Type = Enum.MarketplaceProductType.AvatarBundle, Id = "182" },
})
end)
Prompt de Compra em Massa no Servidor
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptBulkPurchaseEvent = Instance.new("RemoteEvent")
promptBulkPurchaseEvent.Name = "PromptBulkPurchaseEvent"
promptBulkPurchaseEvent.Parent = ReplicatedStorage
--Escute o RemoteEvent disparar de um Cliente e então inicie o prompt de compra em massa
promptBulkPurchaseEvent.OnServerEvent:Connect(function(player, items)
MarketplaceService:PromptBulkPurchase(player, items, {})
end)
Compra de Opção Temporizada
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local ASSET_ID = 105589844216517
Players.PlayerAdded:Connect(function(player)
local info = MarketplaceService:GetProductInfoAsync(ASSET_ID, Enum.InfoType.Asset)
if info.TimedOptions and #info.TimedOptions > 0 then
-- Encontre a opção de duração mais curta
local shortest = info.TimedOptions[1]
for _, option in info.TimedOptions do
if option.Duration < shortest.Duration then
shortest = option
end
end
local items = {
{
Type = Enum.MarketplaceProductType.AvatarAsset,
Id = tostring(ASSET_ID),
PurchaseOptions = {
{ Type = Enum.PurchaseOption.TimedOption, Value = shortest.Duration },
},
}
}
MarketplaceService:PromptBulkPurchase(player, items, {})
end
end)

PromptBundlePurchase
Recursos: PromptExternalPurchase
MarketplaceService:PromptBundlePurchase(
player:Instance, bundleId:number
):()
Parâmetros
player:Instance
bundleId:number
Devolução
()

PromptCancelSubscription
Recursos: PromptExternalPurchase
MarketplaceService:PromptCancelSubscription(
user:Player, subscriptionId:string
):()
Parâmetros
user:Player
subscriptionId:string
Devolução
()

PromptGamePassPurchase
Recursos: PromptExternalPurchase
MarketplaceService:PromptGamePassPurchase(
player:Instance, gamePassId:number
):()
Parâmetros
player:Instance
gamePassId:number
Devolução
()

PromptPremiumPurchase
Obsoleto

PromptProductPurchase
Recursos: PromptExternalPurchase
MarketplaceService:PromptProductPurchase(
player:Instance, productId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Parâmetros
player:Instance
productId:number
equipIfPurchased:boolean
Valor Padrão: true
currencyType:Enum.CurrencyType
Valor Padrão: "Default"
Devolução
()
Amostras de código
MarketplaceService:PromptProductPurchase
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local productId = 0000000 -- Altere isso para o ID do seu produto do desenvolvedor
-- Função para solicitar a compra do produto do desenvolvedor
local function promptPurchase()
MarketplaceService:PromptProductPurchase(player, productId)
end
promptPurchase()

PromptPurchase
Recursos: PromptExternalPurchase
MarketplaceService:PromptPurchase(
player:Instance, assetId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Parâmetros
player:Instance
assetId:number
equipIfPurchased:boolean
Valor Padrão: true
currencyType:Enum.CurrencyType
Valor Padrão: "Default"
Devolução
()
Amostras de código
LocalScript (Cliente)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local promptPurchaseEvent = ReplicatedStorage:WaitForChild("PromptPurchaseEvent")
local part = Instance.new("Part")
part.Parent = workspace
local clickDetector = Instance.new("ClickDetector")
clickDetector.Parent = part
clickDetector.MouseClick:Connect(function()
promptPurchaseEvent:FireServer(16630147)
end)
Script (Servidor)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptPurchaseEvent = Instance.new("RemoteEvent")
promptPurchaseEvent.Name = "PromptPurchaseEvent"
promptPurchaseEvent.Parent = ReplicatedStorage
-- Ouça o RemoteEvent disparar de um Cliente e então acione o prompt de compra
promptPurchaseEvent.OnServerEvent:Connect(function(player, id)
MarketplaceService:PromptPurchase(player, id)
end)

PromptRobloxSubscriptionPurchase
Recursos: PromptExternalPurchase
MarketplaceService:PromptRobloxSubscriptionPurchase(user:Player):()
Parâmetros
user:Player
Devolução
()
Amostras de código
Solicitar Compra de Assinatura do Roblox Plus
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local teleporter = script.Parent
local showModal = true
local EXCLUSIVE_AREA_POSITION = Vector3.new(1200, 200, 60)
-- Conceder a recompensa e teleportar o jogador assinante para a área exclusiva
local function grantRewardAndTeleport(player)
player:RequestStreamAroundAsync(EXCLUSIVE_AREA_POSITION)
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(EXCLUSIVE_AREA_POSITION))
end
end
-- Detectar partes do caráter tocando o teletransportador
teleporter.Touched:Connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if not player then
return
end
if not player:GetAttribute("CharacterPartsTouching") then
player:SetAttribute("CharacterPartsTouching", 0)
end
player:SetAttribute("CharacterPartsTouching", player:GetAttribute("CharacterPartsTouching") + 1)
if player.HasRobloxSubscription then
-- O jogador já tem Roblox Plus; conceder recompensa imediatamente
grantRewardAndTeleport(player)
else
-- Solicitar assinatura do Roblox Plus, debounced para uma vez a cada poucos segundos
if not showModal then
return
end
showModal = false
task.delay(5, function()
showModal = true
end)
MarketplaceService:PromptRobloxSubscriptionPurchase(player)
end
end)
-- Detectar partes do caráter saindo do teletransportador
teleporter.TouchEnded:Connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player and player:GetAttribute("CharacterPartsTouching") then
player:SetAttribute("CharacterPartsTouching", player:GetAttribute("CharacterPartsTouching") - 1)
end
end)
-- Conceder recompensa quando o servidor confirmar uma mudança de assinatura
-- Conectar a mudança de HasRobloxSubscription para cada jogador
Players.PlayerAdded:Connect(function(player)
player:GetPropertyChangedSignal("HasRobloxSubscription"):Connect(function()
if player.HasRobloxSubscription
and player:GetAttribute("CharacterPartsTouching")
and player:GetAttribute("CharacterPartsTouching") > 0
then
grantRewardAndTeleport(player)
end
end)
end)

PromptRobuxTransferAsync
Rendimentos
Recursos: PromptExternalPurchase
MarketplaceService:PromptRobuxTransferAsync(
sender:Player, receiverUserId:number, amount:number
Parâmetros
sender:Player
receiverUserId:number
amount:number
Devolução
Amostras de código
MarketplaceService:PromptRobuxTransferAsync
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Exemplo: transferir Robux quando um jogador aciona um RemoteEvent
local transferEvent = game.ReplicatedStorage:WaitForChild("RequestTransfer")
transferEvent.OnServerEvent:Connect(function(sender, receiverUserId, amount)
-- Validar entradas
if not sender or not sender:IsA("Player") then
return
end
if typeof(receiverUserId) ~= "number" or receiverUserId <= 0 then
warn("receiverUserId inválido")
return
end
if typeof(amount) ~= "number" or amount <= 0 then
warn("quantidade inválida")
return
end
local success, result = pcall(function()
return MarketplaceService:PromptRobuxTransferAsync(sender, receiverUserId, amount)
end)
if success then
print(`Transferência iniciada com TransferRequestId: {result}`)
else
warn(`Transferência falhou: {result}`)
end
end)

PromptSubscriptionPurchase
Recursos: PromptExternalPurchase
MarketplaceService:PromptSubscriptionPurchase(
user:Player, subscriptionId:string
):()
Parâmetros
user:Player
subscriptionId:string
Devolução
()

RankProductsAsync
Rendimentos
MarketplaceService:RankProductsAsync(productIdentifiers:{any}):{RankedItem}
Parâmetros
productIdentifiers:{any}
Devolução
{RankedItem}
Amostras de código
Obtenha uma lista de produtos classificados com base nos IDs de produto fornecidos
-- Obtenha o MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Crie a matriz de produtos que você deseja classificar
local productIdentifiers = {
{InfoType = Enum.InfoType.GamePass, Id = 123},
{InfoType = Enum.InfoType.Product, Id = 456},
{InfoType = Enum.InfoType.Product, Id = 789}
}
-- Chame em uma chamada protegida para tratar erros graciosamente
local success, rankedProducts = pcall(function()
return MarketplaceService:RankProductsAsync(productIdentifiers)
end)
if not success then
error("Falha ao classificar produtos")
end
-- Carregue os itens retornados na loja.
for i, rankedItem in ipairs(rankedProducts) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Lógica para adicionar produtos à loja
end

RecommendTopProductsAsync
Rendimentos
MarketplaceService:RecommendTopProductsAsync(infoTypes:{any}):{RankedItem}
Parâmetros
infoTypes:{any}
Devolução
{RankedItem}
Amostras de código
Obtenha uma lista classificada dos principais produtos em sua loja de experiência
-- Obtenha o MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Crie um array de tipos de produtos para incluir. Neste caso, tanto passes de jogo quanto produtos de desenvolvedor
local productTypes = {Enum.InfoType.GamePass, Enum.InfoType.Product}
-- Chame em uma chamada protegida para tratar erros de forma apropriada
local success, topRankedItems = pcall(function()
return MarketplaceService:RecommendTopProductsAsync(productTypes)
end)
if not success then
error("Falha ao classificar produtos")
end
-- Carregue os itens retornados na loja. Certifique-se de filtrar quaisquer itens inelegíveis de topRankedItems, como produtos de desenvolvedor que o usuário não pode mais comprar
for i, rankedItem in ipairs(topRankedItems) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Lógica para adicionar produtos na loja
end

UserOwnsGamePassAsync
Rendimentos
Recursos: AssetRead
MarketplaceService:UserOwnsGamePassAsync(
userId:User, gamePassId:number
Parâmetros
userId:User
gamePassId:number
Devolução

Eventos
PromptBulkPurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptBulkPurchaseFinished(

PromptBundlePurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptBundlePurchaseFinished(
player:Instance, bundleId:number, wasPurchased:boolean
Parâmetros
player:Instance
bundleId:number
wasPurchased:boolean

PromptGamePassPurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptGamePassPurchaseFinished(
player:Instance, gamePassId:number, wasPurchased:boolean
Parâmetros
player:Instance
gamePassId:number
wasPurchased:boolean
Amostras de código
Finalização da Compra do Gamepass
local MarketplaceService = game:GetService("MarketplaceService")
local function gamepassPurchaseFinished(...)
-- Imprima todos os detalhes do aviso, por exemplo:
-- PromptGamePassPurchaseFinished PlayerName 123456 false
print("PromptGamePassPurchaseFinished", ...)
end
MarketplaceService.PromptGamePassPurchaseFinished:Connect(gamepassPurchaseFinished)

PromptPremiumPurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptPremiumPurchaseFinished():RBXScriptSignal

PromptProductPurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptProductPurchaseFinished(
userId:number, productId:number, isPurchased:boolean
Parâmetros
userId:number
productId:number
isPurchased:boolean

PromptPurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptPurchaseFinished(
player:Instance, assetId:number, isPurchased:boolean
Parâmetros
player:Instance
assetId:number
isPurchased:boolean
Amostras de código
Gerenciando o Evento PromptPurchaseFinished
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptPurchaseFinished(player, assetId, isPurchased)
if isPurchased then
print(player.Name, "comprou um item com AssetID:", assetId)
else
print(player.Name, "não comprou um item com AssetID:", assetId)
end
end
MarketplaceService.PromptPurchaseFinished:Connect(onPromptPurchaseFinished)

PromptRobloxSubscriptionPurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished(
user:Player, didTryPurchasing:boolean
Parâmetros
user:Player
didTryPurchasing:boolean
Amostras de código
Manipular o Evento PromptRobloxSubscriptionPurchaseFinished
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptRobloxSubscriptionPurchaseFinished(player, didTryPurchasing)
if didTryPurchasing then
-- O jogador tentou se inscrever; espere pela mudança em HasRobloxSubscription para confirmar
print(player.Name, "tentou se inscrever no Roblox Plus")
else
print(player.Name, "fechou o prompt de assinatura do Roblox Plus sem comprar")
end
end
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished:Connect(onPromptRobloxSubscriptionPurchaseFinished)

PromptSubscriptionPurchaseFinished
Recursos: PromptExternalPurchase
MarketplaceService.PromptSubscriptionPurchaseFinished(
user:Player, subscriptionId:string, didTryPurchasing:boolean
Parâmetros
user:Player
subscriptionId:string
didTryPurchasing:boolean

Callbacks
ProcessReceipt
Recursos: Monetization
MarketplaceService.ProcessReceipt(receiptInfo:Dictionary):Enum.ProductPurchaseDecision
Parâmetros
receiptInfo:Dictionary
Amostras de código
Callback de ProcessReceipt
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
-- Configuração do data store para rastreamento de compras que foram processadas com sucesso
local purchaseHistoryStore = DataStoreService:GetDataStore("PurchaseHistory")
local productIdByName = {
fullHeal = 123123,
gold100 = 456456,
}
-- Um dicionário para procurar a função de manipulador para conceder uma compra correspondente a um ID de produto
-- Essas funções retornam true se a compra foi concedida com sucesso
-- Essas funções nunca devem yielded, pois são chamadas mais tarde dentro de um callback UpdateAsync()
local grantPurchaseHandlerByProductId = {
[productIdByName.fullHeal] = function(_receipt, player)
local character = player.Character
local humanoid = character and character:FindFirstChild("Humanoid")
-- Garantir que o jogador tenha um humanoide para curar
if not humanoid then
return false
end
-- Curar o jogador até a saúde máxima
humanoid.Health = humanoid.MaxHealth
-- Indicar uma concessão bem-sucedida
return true
end,
[productIdByName.gold100] = function(_receipt, player)
local leaderstats = player:FindFirstChild("leaderstats")
local goldStat = leaderstats and leaderstats:FindFirstChild("Gold")
if not goldStat then
return false
end
-- Adicionar 100 ouro ao estatística de ouro do jogador
goldStat.Value += 100
-- Indicar uma concessão bem-sucedida
return true
end,
}
-- A função de callback principal de ProcessReceipt
-- Esta implementação lida com a maioria dos cenários de falha, mas não mitiga completamente os cenários de falha de dados entre servidores
local function processReceipt(receiptInfo)
local success, result = pcall(
purchaseHistoryStore.UpdateAsync,
purchaseHistoryStore,
receiptInfo.PurchaseId,
function(isPurchased)
if isPurchased then
-- Esta compra já foi registrada como concedida, portanto, deve ter sido tratada anteriormente
-- Evite chamar o manipulador de concessão aqui para evitar conceder a compra duas vezes
-- Enquanto o valor no data store já é verdadeiro, verdadeiro é retornado novamente para que a variável de resultado do pcall também seja verdadeira
-- Isto será usado mais tarde para retornar PurchaseGranted do processador de recibos
return true
end
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Evita conceder a compra se o jogador não estiver no servidor
-- Quando ele reentrar, este processador de recibos será chamado novamente
return nil
end
local grantPurchaseHandler = grantPurchaseHandlerByProductId[receiptInfo.ProductId]
if not grantPurchaseHandler then
-- Se não houver um manipulador definido para este ID de produto, a compra não pode ser processada
-- Isso nunca acontecerá enquanto um manipulador estiver definido para cada ID de produto vendido na experiência
warn(`Nenhum manipulador de compra definido para o ID de produto '{receiptInfo.ProductId}'`)
return nil
end
local handlerSucceeded, handlerResult = pcall(grantPurchaseHandler, receiptInfo, player)
if not handlerSucceeded then
local errorMessage = handlerResult
warn(
`O manipulador de concessão de compra falhou ao processar a compra de '{player.Name}' do ID de produto '{receiptInfo.ProductId}': {errorMessage}`
)
return nil
end
local didHandlerGrantPurchase = handlerResult == true
if not didHandlerGrantPurchase then
-- O manipulador não concedeu a compra, então registre-a como não concedida
return nil
end
-- A compra agora é concedida ao jogador, então registre-a como concedida
-- Isto será usado mais tarde para retornar PurchaseGranted do processador de recibos
return true
end
)
if not success then
local errorMessage = result
warn(`Falha ao processar recibo devido ao erro no data store: {errorMessage}`)
return Enum.ProductPurchaseDecision.NotProcessedYet
end
local didGrantPurchase = result == true
return if didGrantPurchase
then Enum.ProductPurchaseDecision.PurchaseGranted
else Enum.ProductPurchaseDecision.NotProcessedYet
end
-- Defina o callback; isso só pode ser feito uma vez por um script no servidor
MarketplaceService.ProcessReceipt = processReceipt

©2026 Roblox Corporation, Roblox, o logotipo Roblox e Powering Imagination estão entre nossas marcas registradas e não registradas nos EUA e em outros países.