Meer informatie
Engine-klasse
MarketplaceService
Niet maakbaar
Service

*Deze inhoud is vertaald met behulp van AI (bèta) en kan fouten bevatten. Klik hier om deze pagina in het Engels te bekijken.


Samenvatting

Methoden
GetProductInfo(assetId: number,infoType: Enum.InfoType):Dictionary
Verouderd
GetUsersPriceLevelsAsync(userIds: {any}):{PriceLevelInfo}
OpenShop(player: Player):()
PlayerOwnsAsset(player: Instance,assetId: number):boolean
Verouderd
PlayerOwnsBundle(player: Player,bundleId: number):boolean
Verouderd
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):()
Verouderd
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}
Overgenomen leden

API-referentie
Methoden
BindReceiptHandler
Mogelijkheden: Monetization
MarketplaceService:BindReceiptHandler(
transactionType:Enum.ReceiptType, handler:function, filter:{any}?
Parameters
transactionType:Enum.ReceiptType
handler:function
filter:{any}?
Codevoorbeelden
MarketplaceService:BindReceiptHandler
-- OPMERKING: Als je handler blijvende voordelen verleent (valuta, items), gebruik
-- DataStoreService:UpdateAsync() op de TransferRequestId om te voorkomen
-- dat er dubbel wordt verleend wanneer dezelfde ontvangst naar meerdere servers wordt verzonden.
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Behandel verzenderontvangsten (de speler die Robux heeft verzonden)
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.RobuxTransferSender,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Speler is niet op deze server; stel uit zodat de ontvangst
-- opnieuw wordt afgeleverd aan welke server ze momenteel zijn
return Enum.ReceiptDecision.NotProcessedYet
end
print(
`{player.Name} heeft {receiptInfo.CurrencySpent} Robux verzonden`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Verleen hier eventuele erkenning aan de verzender of werk de UI bij
return Enum.ReceiptDecision.Processed
end
)
-- Behandel ontvangerontvangsten (de speler die Robux heeft ontvangen)
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} heeft {receiptInfo.CurrencySpent} Robux ontvangen`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Verleen hier eventuele voordelen voor de ontvanger of werk de UI bij
return Enum.ReceiptDecision.Processed
end
)
MarketplaceService:BindReceiptHandler
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
-- Vervang door de ontwikkelaarsproduct-ID die 100 munten verleent
local COINS_PRODUCT_ID = 123456789
local COINS_PER_PURCHASE = 100
local purchaseHistoryStore = DataStoreService:GetDataStore("PurchaseHistory")
-- Het doorgeven van een filterarray bindt deze handler alleen aan de vermelde product-ID's.
-- Laat de filter weg om een catch-all handler te registreren die afgaat voor elke
-- ontwikkelaarsproductontvangst die niet is opgeëist door een gefilterde handler.
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.DeveloperProduct,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- De koper is niet op deze server; stel uit zodat de ontvangst
-- later opnieuw wordt geleverd of de volgende keer dat ze een server joinen
return Enum.ReceiptDecision.NotProcessedYet
end
-- Verleen het product precies één keer, zelfs als dezelfde ontvangst
-- meer dan eens wordt geleverd, door te keyen op PurchaseId. De callback
-- registreert true alleen wanneer het voordeel duurzaam is verleend, dus
-- UpdateAsync resulteert in true precies wanneer deze ontvangst is voltooid.
local success, granted = pcall(function()
return purchaseHistoryStore:UpdateAsync(receiptInfo.PurchaseId, function(alreadyGranted)
if alreadyGranted then
-- Een eerdere levering heeft deze aankoop al verleend; geef het niet
-- opnieuw, maar houd de ontvangst opgelost
return true
end
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins")
if not coins then
-- De statistieken van de speler zijn nog niet klaar. Geef nil terug om te annuleren
-- de schrijfopdracht zodat er niets wordt geregistreerd als verleend en de
-- ontvangst later opnieuw wordt geleverd
return nil
end
coins.Value += COINS_PER_PURCHASE
return true
end)
end)
if not success or granted ~= true then
-- Er is een fout opgetreden in de gegevensopslag of het voordeel is niet verleend; laat
-- de ontvangst onopgelost zodat deze later opnieuw wordt geleverd
return Enum.ReceiptDecision.NotProcessedYet
end
return Enum.ReceiptDecision.Processed
end,
{ COINS_PRODUCT_ID }
)

GetDeveloperProductsAsync
Opbrengst
Mogelijkheden: AssetRead
MarketplaceService:GetDeveloperProductsAsync():Instance
Teruggaves
Codevoorbeelden
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
Verouderd

GetProductInfoAsync
Opbrengst
Mogelijkheden: AssetRead
MarketplaceService:GetProductInfoAsync(
assetId:number, infoType:Enum.InfoType
Parameters
assetId:number
infoType:Enum.InfoType
Standaardwaarde: Asset
Teruggaves
Codevoorbeelden
Productinformatie Opvragen
local MarketplaceService = game:GetService("MarketplaceService")
local ASSET_ID = 125378389
local asset = MarketplaceService:GetProductInfoAsync(ASSET_ID)
print(asset.Name .. " :: " .. asset.Description)
Prijs Kortingen Weergeven
local MarketplaceService = game:GetService("MarketplaceService")
local PASS_ID = 12345678
local textLabel = script.Parent
local DiscountTypeDisplay = {
RobloxPlusSubscription = "Roblox Plus Korting",
}
local productInfo = MarketplaceService:GetProductInfoAsync(PASS_ID, Enum.InfoType.GamePass)
print(string.format("Oorspronkelijke Prijs: %d", productInfo.UserBasePriceInRobux))
for _, discount in ipairs(productInfo.PriceDiscountDetails) do
local displayName = DiscountTypeDisplay[discount.Type] or "Andere Korting"
print(string.format("%s (%d%%): -%d", displayName, discount.Percent, discount.AmountInRobux))
end
print(string.format("Je Betaalt: %d", productInfo.PriceInRobux))
Beschikbare Tijdopties Weergeven
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 dagen - %d Robux", days, option.Price))
end
end
Parallel GetProductInfoAsync met Transparante Batchverwerking
local MarketplaceService = game:GetService("MarketplaceService")
local productIds = {123456, 987654, 555777}
local results = {}
local remaining = #productIds
local function fetch(productId)
local success, info = pcall(function()
return MarketplaceService:GetProductInfoAsync(productId, Enum.InfoType.Product)
end)
if success then
results[productId] = info
else
warn("Kon informatie voor product niet ophalen:", productId, info)
end
remaining -= 1
end
-- Het gelijktijdig starten van alle aanroepen laat de engine ze automatisch
-- bundelen in minder HTTP-verzoeken.
for _, productId in productIds do
task.spawn(fetch, productId)
end
-- Wacht tot alle verzoeken zijn voltooid.
while remaining > 0 do
task.wait()
end
-- Alle resultaten zijn nu beschikbaar.
for productId, info in results do
print(info.Name, "-", info.PriceInRobux, "Robux")
end

GetRobloxSubscriptionDetailsAsync
Opbrengst
Mogelijkheden: Monetization
MarketplaceService:GetRobloxSubscriptionDetailsAsync(user:Player):Dictionary
Parameters
user:Player
Teruggaves
Codevoorbeelden
Controleer Roblox Abonnementsdetails
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. Controleer op Loyaliteit (bijv. Abonnees voor > 60 dagen)
local threeMonths = 60 * 24 * 60 * 60
if details.StartTime and (os.time() - details.StartTime.UnixTimestamp) > threeMonths then
print("De '3-Maanden Abonnements Veteraan' skin wordt toegekend!")
end
-- 2. Controleer op Toewijzing
if details.IsOriginExperience then
print("Toewijzing bevestigd: Gebruiker is geabonneerd via deze ervaring.")
else
print("Gebruiker is ergens anders geabonneerd (Website of een andere Ervaring).")
end
end
end)

GetSubscriptionProductInfoAsync
Opbrengst
Mogelijkheden: AssetRead
MarketplaceService:GetSubscriptionProductInfoAsync(subscriptionId:string):Dictionary
Parameters
subscriptionId:string
Teruggaves

GetUsersPriceLevelsAsync
Opbrengst
Mogelijkheden: Monetization
MarketplaceService:GetUsersPriceLevelsAsync(userIds:{any}):{PriceLevelInfo}
Parameters
userIds:{any}
Teruggaves
{PriceLevelInfo}
Codevoorbeelden
Krijg prijsniveaus voor een lijst van gebruikers
-- Verkrijg de MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Definieer een functie om prijsniveaus voor een lijst van gebruikers op te halen
local function getPriceLevels(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- Koppel elk PriceLevelInfo aan een UserId -> PriceLevel lookup tabel
local lookup = {}
for _, info in ipairs(result) do
lookup[info.UserId] = info.PriceLevel
end
return lookup
else
warn("Fout bij het ophalen van prijsniveaus:", result)
return nil
end
end
-- Voorbeeld met tijdelijke ID's
local user1Id = 123456789
local user2Id = 987654321
-- Roep de functie aan en sla het resultaat op
local priceLevels = getPriceLevels({user1Id, user2Id})
-- Als het succesvol is, print elk gebruikersniveau
if priceLevels then
print("Prijsniveau voor Gebruiker 1:", priceLevels[user1Id])
print("Prijsniveau voor Gebruiker 2:", priceLevels[user2Id])
else
print("Mislukt om prijsniveaus op te halen.")
end

GetUserSubscriptionDetailsAsync
Opbrengst
Mogelijkheden: Monetization
MarketplaceService:GetUserSubscriptionDetailsAsync(
user:Player, subscriptionId:string
Parameters
user:Player
subscriptionId:string
Teruggaves

GetUserSubscriptionPaymentHistoryAsync
Opbrengst
Mogelijkheden: Monetization
MarketplaceService:GetUserSubscriptionPaymentHistoryAsync(
user:Player, subscriptionId:string
Parameters
user:Player
subscriptionId:string
Teruggaves
Codevoorbeelden
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(`Fout bij het controleren van de abonnementsgeschiedenis: {err}`)
return
end
if next(subscriptionHistory) then
-- De gebruiker heeft enige abonnementsgeschiedenis binnen de afgelopen 12 maanden.
-- Print de details van elke betalingsvermelding uit de abonnementsgeschiedenis.
print(`Speler {player.Name} heeft eerder geabonneerd op {SUBSCRIPTION_ID}:`)
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(`Speler {player.Name} heeft nog nooit geabonneerd op {SUBSCRIPTION_ID}.`)
end
end
-- Roep checkSubscriptionHistory aan voor alle spelers die al in het spel zijn
for _, player in ipairs(Players:GetPlayers()) do
checkSubscriptionHistory(player)
end
-- Roep checkSubscriptionHistory aan voor alle toekomstige spelers
Players.PlayerAdded:Connect(checkSubscriptionHistory)

GetUserSubscriptionStatusAsync
Opbrengst
Mogelijkheden: Monetization
MarketplaceService:GetUserSubscriptionStatusAsync(
user:Player, subscriptionId:string
Parameters
user:Player
subscriptionId:string
Teruggaves
Codevoorbeelden
Controleer het Abonnementsstatus van de Gebruiker
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()
-- retourneert IsRenewing en IsSubscribed
subStatus = MarketplaceService:GetUserSubscriptionStatusAsync(player, subscriptionID)
end)
if not success then
warn("Fout bij het controleren of de speler een abonnement heeft: " .. tostring(message))
return
end
if subStatus["IsSubscribed"] then
print(player.Name .. " is geabonneerd met " .. subscriptionID)
-- Geef de speler de rechten die bij het abonnement horen
end
end
Players.PlayerAdded:Connect(checkSubStatus)

OpenShop
Mogelijkheden: PromptExternalPurchase
MarketplaceService:OpenShop(player:Player):()
Parameters
player:Player
Teruggaves
()
Codevoorbeelden
Open In-Game Shop description: Dit codevoorbeeld demonstreert hoe je de in-game winkel voor de lokale speler opent. De winkel toont een gepersonaliseerde lijst van de game's passen en ontwikkelaarsproducten.
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
MarketplaceService:OpenShop(player)

PlayerOwnsAsset
Verouderd

PlayerOwnsAssetAsync
Opbrengst
Mogelijkheden: AssetRead
MarketplaceService:PlayerOwnsAssetAsync(
player:Instance, assetId:number
Parameters
player:Instance
assetId:number
Teruggaves
Codevoorbeelden
Controleer op Eigendom van Item
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- Het item dat we controleren: 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(`Fout bij het controleren of {player.Name} {ASSET_NAME} bezit: {errorMessage}`)
return
end
if doesPlayerOwnAsset then
print(`{player.Name} bezit {ASSET_NAME}`)
else
print(`{player.Name} bezit {ASSET_NAME} niet`)
end
end
Players.PlayerAdded:Connect(onPlayerAdded)

PlayerOwnsBundle
Verouderd

PlayerOwnsBundleAsync
Opbrengst
Mogelijkheden: AssetRead
MarketplaceService:PlayerOwnsBundleAsync(
player:Player, bundleId:number
Parameters
player:Player
bundleId:number
Teruggaves
Codevoorbeelden
Controleer op Bundelbezit
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- De bundel waar we naar controleren: 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("PlayerOwnsBundleAsync-aanroep mislukt: ", doesPlayerOwnBundle)
return
end
if doesPlayerOwnBundle then
print(player.Name .. " bezit " .. BUNDLE_NAME)
else
print(player.Name .. " bezit " .. BUNDLE_NAME .. " niet")
end
end)

PromptBulkPurchase
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptBulkPurchase(
player:Player, lineItems:{any}, options:Dictionary
):()
Parameters
player:Player
lineItems:{any}
options:Dictionary
Teruggaves
()
Codevoorbeelden
Prompt Bulk Purchase Client
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 Bulk Purchase Server
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptBulkPurchaseEvent = Instance.new("RemoteEvent")
promptBulkPurchaseEvent.Name = "PromptBulkPurchaseEvent"
promptBulkPurchaseEvent.Parent = ReplicatedStorage
-- Luister naar de RemoteEvent die vanuit een Client wordt verzonden en activeer vervolgens de bulk aankoop prompt
promptBulkPurchaseEvent.OnServerEvent:Connect(function(player, items)
MarketplaceService:PromptBulkPurchase(player, items, {})
end)
Aankopen met Tijdslimiet Aanmoedigen
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
-- Vind de optie met de kortste duur
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
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptBundlePurchase(
player:Instance, bundleId:number
):()
Parameters
player:Instance
bundleId:number
Teruggaves
()

PromptCancelSubscription
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptCancelSubscription(
user:Player, subscriptionId:string
):()
Parameters
user:Player
subscriptionId:string
Teruggaves
()

PromptGamePassPurchase
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptGamePassPurchase(
player:Instance, gamePassId:number
):()
Parameters
player:Instance
gamePassId:number
Teruggaves
()

PromptPremiumPurchase
Verouderd

PromptProductPurchase
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptProductPurchase(
player:Instance, productId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Parameters
player:Instance
productId:number
equipIfPurchased:boolean
Standaardwaarde: true
currencyType:Enum.CurrencyType
Standaardwaarde: Default
Teruggaves
()
Codevoorbeelden
MarketplaceService:PromptProductPurchase
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local productId = 0000000 -- Verander dit in jouw ontwikkelaarsproduct ID
-- Functie om de aankoop van het ontwikkelaarsproduct aan te moedigen
local function promptPurchase()
MarketplaceService:PromptProductPurchase(player, productId)
end
promptPurchase()

PromptPurchase
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptPurchase(
player:Instance, assetId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Parameters
player:Instance
assetId:number
equipIfPurchased:boolean
Standaardwaarde: true
currencyType:Enum.CurrencyType
Standaardwaarde: Default
Teruggaves
()
Codevoorbeelden
LocalScript (Client)
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 (Server)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptPurchaseEvent = Instance.new("RemoteEvent")
promptPurchaseEvent.Name = "PromptPurchaseEvent"
promptPurchaseEvent.Parent = ReplicatedStorage
-- Luister naar de RemoteEvent die vanuit een Client wordt verzonden en activeer vervolgens de aankoopprompt
promptPurchaseEvent.OnServerEvent:Connect(function(player, id)
MarketplaceService:PromptPurchase(player, id)
end)

PromptRobloxSubscriptionPurchase
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptRobloxSubscriptionPurchase(user:Player):()
Parameters
user:Player
Teruggaves
()
Codevoorbeelden
Vraag om Roblox Plus Abonnement Aankoop
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)
-- Geef de beloning en teleporteer de abonnerende speler naar het exclusieve gebied
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
-- Detecteer karakteronderdelen die de teleporter aanraken
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
-- Speler heeft al Roblox Plus; geef onmiddellijk de beloning
grantRewardAndTeleport(player)
else
-- Vraag om Roblox Plus abonnement, debounced naar eenmaal elke paar seconden
if not showModal then
return
end
showModal = false
task.delay(5, function()
showModal = true
end)
MarketplaceService:PromptRobloxSubscriptionPurchase(player)
end
end)
-- Detecteer karakteronderdelen die de teleporter verlaten
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)
-- Geef beloning wanneer de server een wijziging in het abonnement bevestigt
-- Verbind de wijziging van HasRobloxSubscription voor elke speler
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
Opbrengst
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptRobuxTransferAsync(
sender:Player, receiverUserId:number, amount:number
Parameters
sender:Player
receiverUserId:number
amount:number
Teruggaves
Codevoorbeelden
MarketplaceService:PromptRobuxTransferAsync
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Voorbeeld: transfer Robux wanneer een speler een RemoteEvent activeert
local transferEvent = game.ReplicatedStorage:WaitForChild("RequestTransfer")
transferEvent.OnServerEvent:Connect(function(sender, receiverUserId, amount)
-- Valideer invoer
if not sender or not sender:IsA("Player") then
return
end
if typeof(receiverUserId) ~= "number" or receiverUserId <= 0 then
warn("Ongeldige receiverUserId")
return
end
if typeof(amount) ~= "number" or amount <= 0 then
warn("Ongeldig bedrag")
return
end
local success, result = pcall(function()
return MarketplaceService:PromptRobuxTransferAsync(sender, receiverUserId, amount)
end)
if success then
print(`Overdracht geïnitieerd met TransferRequestId: {result}`)
else
warn(`Overdracht mislukt: {result}`)
end
end)

PromptSubscriptionPurchase
Mogelijkheden: PromptExternalPurchase
MarketplaceService:PromptSubscriptionPurchase(
user:Player, subscriptionId:string
):()
Parameters
user:Player
subscriptionId:string
Teruggaves
()

RankProductsAsync
Opbrengst
MarketplaceService:RankProductsAsync(productIdentifiers:{any}):{RankedItem}
Parameters
productIdentifiers:{any}
Teruggaves
{RankedItem}
Codevoorbeelden
Krijg een lijst van gerangschikte producten op basis van de opgegeven product-ID's
-- Verkrijg de MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Maak de array van producten die je wilt rangschikken
local productIdentifiers = {
{InfoType = Enum.InfoType.GamePass, Id = 123},
{InfoType = Enum.InfoType.Product, Id = 456},
{InfoType = Enum.InfoType.Product, Id = 789}
}
-- Roep aan in een beschermde oproep om fouten netjes af te handelen
local success, rankedProducts = pcall(function()
return MarketplaceService:RankProductsAsync(productIdentifiers)
end)
if not success then
error("Het is niet gelukt om producten te rangschikken")
end
-- Laad de geretourneerde items in de winkel.
for i, rankedItem in ipairs(rankedProducts) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Logica om producten aan de winkel toe te voegen
end

RecommendTopProductsAsync
Opbrengst
MarketplaceService:RecommendTopProductsAsync(infoTypes:{any}):{RankedItem}
Parameters
infoTypes:{any}
Teruggaves
{RankedItem}
Codevoorbeelden
Krijg een gerangschikte lijst van de beste producten voor jouw in-experience winkel
-- Verkrijg de MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Maak een array van producttypes om op te nemen. In dit geval zowel game passes als ontwikkelaarsproducten
local productTypes = {Enum.InfoType.GamePass, Enum.InfoType.Product}
-- Roep aan in een beschermde oproep om fouten netjes af te handelen
local success, topRankedItems = pcall(function()
return MarketplaceService:RecommendTopProductsAsync(productTypes)
end)
if not success then
error("Het is niet gelukt om producten te rangschikken")
end
-- Laad de geretourneerde items in de winkel. Zorg ervoor dat je alle niet-geschikte items uit topRankedItems filtert, zoals ontwikkelaarsproducten die de gebruiker niet langer kan kopen
for i, rankedItem in ipairs(topRankedItems) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Logica om producten aan de winkel toe te voegen
end

UserOwnsGamePassAsync
Opbrengst
Mogelijkheden: AssetRead
MarketplaceService:UserOwnsGamePassAsync(
userId:User, gamePassId:number
Parameters
userId:User
gamePassId:number
Teruggaves
Codevoorbeelden
Meerdere Game Passes Controleren met Transparante Batching
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local PASS_IDS = {1234567, 2345678, 3456789, 4567890}
local function checkPassesForPlayer(player: Player)
local owned = {}
local remaining = #PASS_IDS
local function check(passId)
local success, ownsPass = pcall(function()
return MarketplaceService:UserOwnsGamePassAsync(player.UserId, passId)
end)
if success and ownsPass then
table.insert(owned, passId)
end
remaining -= 1
end
-- Alle aanroepen gelijktijdig starten laat de engine ze bundelen in
-- minder HTTP-verzoeken automatisch.
for _, passId in PASS_IDS do
task.spawn(check, passId)
end
while remaining > 0 do
task.wait()
end
return owned
end
Players.PlayerAdded:Connect(function(player)
local ownedPasses = checkPassesForPlayer(player)
print(player.Name, "heeft", #ownedPasses, "passes")
end)

Evenementen
PromptBulkPurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptBulkPurchaseFinished(

PromptBundlePurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptBundlePurchaseFinished(
player:Instance, bundleId:number, wasPurchased:boolean
Parameters
player:Instance
bundleId:number
wasPurchased:boolean

PromptGamePassPurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptGamePassPurchaseFinished(
player:Instance, gamePassId:number, wasPurchased:boolean
Parameters
player:Instance
gamePassId:number
wasPurchased:boolean
Codevoorbeelden
Afhandeling van Gamepass Aankoop Voltooid
local MarketplaceService = game:GetService("MarketplaceService")
local function gamepassPurchaseFinished(...)
-- Print alle details van de prompt, bijvoorbeeld:
-- PromptGamePassPurchaseFinished PlayerName 123456 false
print("PromptGamePassPurchaseFinished", ...)
end
MarketplaceService.PromptGamePassPurchaseFinished:Connect(gamepassPurchaseFinished)

PromptPremiumPurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptPremiumPurchaseFinished():RBXScriptSignal

PromptProductPurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptProductPurchaseFinished(
userId:number, productId:number, isPurchased:boolean
Parameters
userId:number
productId:number
isPurchased:boolean

PromptPurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptPurchaseFinished(
player:Instance, assetId:number, isPurchased:boolean
Parameters
player:Instance
assetId:number
isPurchased:boolean
Codevoorbeelden
Afhandelen van het PromptPurchaseFinished-evenement
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptPurchaseFinished(player, assetId, isPurchased)
if isPurchased then
print(player.Name, "kocht een item met AssetID:", assetId)
else
print(player.Name, "heeft geen item gekocht met AssetID:", assetId)
end
end
MarketplaceService.PromptPurchaseFinished:Connect(onPromptPurchaseFinished)

PromptRobloxSubscriptionPurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished(
user:Player, didTryPurchasing:boolean
Parameters
user:Player
didTryPurchasing:boolean
Codevoorbeelden
Behandel PromptRobloxSubscriptionPurchaseFinished Evenement
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptRobloxSubscriptionPurchaseFinished(player, didTryPurchasing)
if didTryPurchasing then
-- Speler heeft geprobeerd zich te abonneren; wacht op HasRobloxSubscription wijziging om te bevestigen
print(player.Name, "heeft geprobeerd zich te abonneren op Roblox Plus")
else
print(player.Name, "heeft de Roblox Plus abonnementsprompt gesloten zonder te kopen")
end
end
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished:Connect(onPromptRobloxSubscriptionPurchaseFinished)

PromptSubscriptionPurchaseFinished
Mogelijkheden: PromptExternalPurchase
MarketplaceService.PromptSubscriptionPurchaseFinished(
user:Player, subscriptionId:string, didTryPurchasing:boolean
Parameters
user:Player
subscriptionId:string
didTryPurchasing:boolean

Callbacks
ProcessReceipt
Mogelijkheden: Monetization
MarketplaceService.ProcessReceipt(receiptInfo:Dictionary):Enum.ProductPurchaseDecision
Parameters
receiptInfo:Dictionary
Codevoorbeelden
ProcessReceipt Callback
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
-- Gegevensopslaginstelling voor het bijhouden van aankopen die succesvol zijn verwerkt
local purchaseHistoryStore = DataStoreService:GetDataStore("PurchaseHistory")
local productIdByName = {
fullHeal = 123123,
gold100 = 456456,
}
-- Een woordenboek om de handlerfunctie op te zoeken die een aankoop verleent die overeenkomt met een product-ID
-- Deze functies geven true terug als de aankoop succesvol is verleend
-- Deze functies mogen nooit yielden, omdat ze later binnen een UpdateAsync() callback worden aangeroepen
local grantPurchaseHandlerByProductId = {
[productIdByName.fullHeal] = function(_receipt, player)
local character = player.Character
local humanoid = character and character:FindFirstChild("Humanoid")
-- Zorg ervoor dat de speler een humanoïde heeft om te genezen
if not humanoid then
return false
end
-- Genees de speler naar volle gezondheid
humanoid.Health = humanoid.MaxHealth
-- Geef een succesvolle verlening aan
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
-- Voeg 100 goud toe aan de goudstat van de speler
goldStat.Value += 100
-- Geef een succesvolle verlening aan
return true
end,
}
-- De kern ProcessReceipt callbackfunctie
-- Deze implementatie behandelt de meeste foutscenario's, maar vermindert niet volledig de cross-server gegevensfoutscenario's
local function processReceipt(receiptInfo)
local success, result = pcall(
purchaseHistoryStore.UpdateAsync,
purchaseHistoryStore,
receiptInfo.PurchaseId,
function(isPurchased)
if isPurchased then
-- Deze aankoop was al geregistreerd als verleend, dus deze moet eerder zijn verwerkt
-- Vermijd het aanroepen van de grant purchase handler hier om te voorkomen dat de aankoop twee keer wordt verleend
-- Terwijl de waarde in de gegevensopslag al true is, wordt true opnieuw teruggegeven zodat de pcall-resultaatvariabele ook true is
-- Dit zal later worden gebruikt om PurchaseGranted van de ontvangstverwerker terug te geven
return true
end
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Voorkomt het verlenen van de aankoop als de speler niet op de server is
-- Wanneer ze opnieuw aansluiten, zal deze ontvangstverwerker opnieuw worden aangeroepen
return nil
end
local grantPurchaseHandler = grantPurchaseHandlerByProductId[receiptInfo.ProductId]
if not grantPurchaseHandler then
-- Als er geen handler is gedefinieerd voor deze product-ID, kan de aankoop niet worden verwerkt
-- Dit zal nooit gebeuren zolang er een handler is ingesteld voor elke product-ID die in de ervaring wordt verkocht
warn(`Geen aankoophandler gedefinieerd voor product-ID '{receiptInfo.ProductId}'`)
return nil
end
local handlerSucceeded, handlerResult = pcall(grantPurchaseHandler, receiptInfo, player)
if not handlerSucceeded then
local errorMessage = handlerResult
warn(
`Grant purchase handler gaf een fout tijdens het verwerken van de aankoop van '{player.Name}' van product-ID '{receiptInfo.ProductId}': {errorMessage}`
)
return nil
end
local didHandlerGrantPurchase = handlerResult == true
if not didHandlerGrantPurchase then
-- De handler heeft de aankoop niet verleend, dus registreer het als niet verleend
return nil
end
-- De aankoop is nu verleend aan de speler, dus registreer het als verleend
-- Dit zal later worden gebruikt om PurchaseGranted van de ontvangstverwerker terug te geven
return true
end
)
if not success then
local errorMessage = result
warn(`Verwerken van de ontvangst mislukt vanwege gegevensopslagfout: {errorMessage}`)
return Enum.ProductPurchaseDecision.NotProcessedYet
end
local didGrantPurchase = result == true
return if didGrantPurchase
then Enum.ProductPurchaseDecision.PurchaseGranted
else Enum.ProductPurchaseDecision.NotProcessedYet
end
-- Stel de callback in; dit kan slechts één keer door één script op de server worden gedaan
MarketplaceService.ProcessReceipt = processReceipt

©2026 Roblox Corporation. Roblox, het Roblox-logo en Powering Imagination behoren tot onze geregistreerde en niet-geregistreerde handelsmerken in de VS en andere landen.