Apprendre
Classe de moteur
MarketplaceService
Création impossible
Service

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.


Résumé

Méthodes
GetProductInfo(assetId: number,infoType: Enum.InfoType):Dictionary
Déprécié
GetUsersPriceLevelsAsync(userIds: {any}):{PriceLevelInfo}
OpenShop(player: Player):()
PlayerOwnsAsset(player: Instance,assetId: number):boolean
Déprécié
PlayerOwnsBundle(player: Player,bundleId: number):boolean
Déprécié
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):()
Déprécié
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}
Membres hérités

Référence API
Méthodes
BindReceiptHandler
Capacités : Monetization
MarketplaceService:BindReceiptHandler(
transactionType:Enum.ReceiptType, handler:function, filter:{any}?
Paramètres
transactionType:Enum.ReceiptType
handler:function
filter:{any}?
Échantillons de code
MarketplaceService:BindReceiptHandler
-- REMARQUE : Si votre gestionnaire accorde des avantages persistants (monnaie, objets), utilisez
-- DataStoreService:UpdateAsync() sur l'ID de demande de transfert pour éviter
-- de doubler la remise lorsque le même reçu est remis à plusieurs serveurs.
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Gérer les reçus de l'expéditeur (le joueur qui a envoyé des Robux)
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.RobuxTransferSender,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Le joueur n'est pas sur ce serveur ; différer afin que le reçu soit
-- remis à quel que soit le serveur dans lequel il se trouve actuellement
return Enum.ReceiptDecision.NotProcessedYet
end
print(
`{player.Name} a envoyé {receiptInfo.CurrencySpent} Robux`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Accorder toute reconnaissance côté expéditeur ou mettre à jour l'interface utilisateur ici
return Enum.ReceiptDecision.Processed
end
)
-- Gérer les reçus du destinataire (le joueur qui a reçu des 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} a reçu {receiptInfo.CurrencySpent} Robux`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Accorder tous les avantages côté destinataire ou mettre à jour l'interface utilisateur ici
return Enum.ReceiptDecision.Processed
end
)
MarketplaceService:BindReceiptHandler
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
-- Remplacez par l'ID du produit développeur qui accorde 100 pièces
local COINS_PRODUCT_ID = 123456789
local COINS_PER_PURCHASE = 100
local purchaseHistoryStore = DataStoreService:GetDataStore("PurchaseHistory")
-- Passer un tableau de filtres lie ce gestionnaire uniquement aux ID de produits listés.
-- Omettez le filtre pour enregistrer un gestionnaire général qui se déclenche pour tout
-- reçu de produit développeur non réclamé par un gestionnaire filtré.
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.DeveloperProduct,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- L'acheteur n'est pas sur ce serveur ; différer pour que le reçu soit
-- redélivré plus tard ou la prochaine fois qu'il rejoint un serveur
return Enum.ReceiptDecision.NotProcessedYet
end
-- Accorder le produit exactement une fois, même si le même reçu est
-- livré plus d'une fois, en se basant sur PurchaseId. Le rappel
-- enregistre vrai uniquement lorsque le bénéfice est durablement accordé, donc
-- UpdateAsync résout à vrai précisément lorsque ce reçu est terminé.
local success, granted = pcall(function()
return purchaseHistoryStore:UpdateAsync(receiptInfo.PurchaseId, function(alreadyGranted)
if alreadyGranted then
-- Une livraison précédente a déjà accordé cet achat ; ne pas
-- l'accorder à nouveau, mais garder le reçu résolu
return true
end
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins")
if not coins then
-- Les statistiques du joueur ne sont pas encore prêtes. Retourner nil pour annuler
-- l'écriture afin que rien ne soit enregistré comme accordé et que le
-- reçu soit redélivré plus tard
return nil
end
coins.Value += COINS_PER_PURCHASE
return true
end)
end)
if not success or granted ~= true then
-- Une erreur de magasin de données s'est produite ou le bénéfice n'a pas été accordé ; laisser
-- le reçu non résolu afin qu'il soit redélivré plus tard
return Enum.ReceiptDecision.NotProcessedYet
end
return Enum.ReceiptDecision.Processed
end,
{ COINS_PRODUCT_ID }
)

GetDeveloperProductsAsync
Rendement
Capacités : AssetRead
MarketplaceService:GetDeveloperProductsAsync():Instance
Retours
Échantillons de code
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
Déprécié

GetProductInfoAsync
Rendement
Capacités : AssetRead
MarketplaceService:GetProductInfoAsync(
assetId:number, infoType:Enum.InfoType
Paramètres
assetId:number
infoType:Enum.InfoType
Valeur par défaut : "Asset"
Retours
Échantillons de code
Obtenir des informations sur le produit
local MarketplaceService = game:GetService("MarketplaceService")
local ASSET_ID = 125378389
local asset = MarketplaceService:GetProductInfoAsync(ASSET_ID)
print(asset.Name .. " :: " .. asset.Description)
Affichage des Remises de Prix
local MarketplaceService = game:GetService("MarketplaceService")
local PASS_ID = 12345678
local textLabel = script.Parent
local DiscountTypeDisplay = {
RobloxPlusSubscription = "Remise Roblox Plus",
}
local productInfo = MarketplaceService:GetProductInfoAsync(PASS_ID, Enum.InfoType.GamePass)
print(string.format("Prix Original: %d", productInfo.UserBasePriceInRobux))
for _, discount in ipairs(productInfo.PriceDiscountDetails) do
local displayName = DiscountTypeDisplay[discount.Type] or "Autre Remise"
print(string.format("%s (%d%%): -%d", displayName, discount.Percent, discount.AmountInRobux))
end
print(string.format("Vous Payez: %d", productInfo.PriceInRobux))
Affichage des options temporisées disponibles
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 jours - %d Robux", days, option.Price))
end
end
Récupération parallèle des informations sur le produit avec un traitement par lots transparent
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("Échec de la récupération des informations pour le produit:", productId, info)
end
remaining -= 1
end
-- Lancer tous les appels simultanément permet au moteur de les regrouper en
-- moins de requêtes HTTP automatiquement.
for _, productId in productIds do
task.spawn(fetch, productId)
end
-- Attendre que toutes les requêtes soient terminées.
while remaining > 0 do
task.wait()
end
-- Tous les résultats sont maintenant disponibles.
for productId, info in results do
print(info.Name, "-", info.PriceInRobux, "Robux")
end

GetRobloxSubscriptionDetailsAsync
Rendement
Capacités : Monetization
MarketplaceService:GetRobloxSubscriptionDetailsAsync(user:Player):Dictionary
Paramètres
user:Player
Retours
Échantillons de code
Vérifier les détails de l'abonnement 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. Vérifier la fidélité (par exemple, abonné pendant > 60 jours)
local threeMonths = 60 * 24 * 60 * 60
if details.StartTime and (os.time() - details.StartTime.UnixTimestamp) > threeMonths then
print("Attribution du skin 'Vétéran d'Abonnement de 3 Mois' !")
end
-- 2. Vérifier l'attribution
if details.IsOriginExperience then
print("Attribution confirmée : L'utilisateur s'est abonné via cette expérience.")
else
print("L'utilisateur s'est abonné ailleurs (site Web ou une autre expérience).")
end
end
end)

GetSubscriptionProductInfoAsync
Rendement
Capacités : AssetRead
MarketplaceService:GetSubscriptionProductInfoAsync(subscriptionId:string):Dictionary
Paramètres
subscriptionId:string
Retours

GetUsersPriceLevelsAsync
Rendement
Capacités : Monetization
MarketplaceService:GetUsersPriceLevelsAsync(userIds:{any}):{PriceLevelInfo}
Paramètres
userIds:{any}
Retours
{PriceLevelInfo}
Échantillons de code
Obtenir les niveaux de prix pour une liste d'utilisateurs
-- Obtenir le MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Définir une fonction pour récupérer les niveaux de prix pour une liste d'utilisateurs
local function getPriceLevels(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- Mapper chaque PriceLevelInfo à une table de correspondance UserId -> PriceLevel
local lookup = {}
for _, info in ipairs(result) do
lookup[info.UserId] = info.PriceLevel
end
return lookup
else
warn("Erreur lors de l'obtention des niveaux de prix:", result)
return nil
end
end
-- Exemple utilisant des ID de remplacement
local user1Id = 123456789
local user2Id = 987654321
-- Appeler la fonction et stocker le résultat
local priceLevels = getPriceLevels({user1Id, user2Id})
-- Si cela réussit, afficher le niveau de chaque utilisateur
if priceLevels then
print("Niveau de prix pour l'utilisateur 1:", priceLevels[user1Id])
print("Niveau de prix pour l'utilisateur 2:", priceLevels[user2Id])
else
print("Échec de la récupération des niveaux de prix.")
end

GetUserSubscriptionDetailsAsync
Rendement
Capacités : Monetization
MarketplaceService:GetUserSubscriptionDetailsAsync(
user:Player, subscriptionId:string
Paramètres
user:Player
subscriptionId:string
Retours

GetUserSubscriptionPaymentHistoryAsync
Rendement
Capacités : Monetization
MarketplaceService:GetUserSubscriptionPaymentHistoryAsync(
user:Player, subscriptionId:string
Paramètres
user:Player
subscriptionId:string
Retours
Échantillons de code
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(`Erreur lors de la vérification de l'historique des abonnements : {err}`)
return
end
if next(subscriptionHistory) then
-- L'utilisateur a un historique d'abonnement au cours des 12 derniers mois.
-- Imprimez les détails de chaque entrée de paiement de l'historique d'abonnement.
print(`Le joueur {player.Name} s'est abonné à {SUBSCRIPTION_ID} auparavant :`)
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(`Le joueur {player.Name} ne s'est jamais abonné à {SUBSCRIPTION_ID} auparavant.`)
end
end
-- Appeler checkSubscriptionHistory pour tous les joueurs déjà dans le jeu
for _, player in ipairs(Players:GetPlayers()) do
checkSubscriptionHistory(player)
end
-- Appeler checkSubscriptionHistory pour tous les futurs joueurs
Players.PlayerAdded:Connect(checkSubscriptionHistory)

GetUserSubscriptionStatusAsync
Rendement
Capacités : Monetization
MarketplaceService:GetUserSubscriptionStatusAsync(
user:Player, subscriptionId:string
Paramètres
user:Player
subscriptionId:string
Retours
Échantillons de code
Vérifier le statut d'abonnement de l'utilisateur
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()
-- renvoie IsRenewing et IsSubscribed
subStatus = MarketplaceService:GetUserSubscriptionStatusAsync(player, subscriptionID)
end)
if not success then
warn("Erreur lors de la vérification si le joueur a un abonnement : " .. tostring(message))
return
end
if subStatus["IsSubscribed"] then
print(player.Name .. " est abonné avec " .. subscriptionID)
-- Donner au joueur les permissions associées à l'abonnement
end
end
Players.PlayerAdded:Connect(checkSubStatus)

OpenShop
Capacités : PromptExternalPurchase
MarketplaceService:OpenShop(player:Player):()
Paramètres
player:Player
Retours
()
Échantillons de code
Ouvrir le magasin en jeu description: Cet exemple de code montre comment ouvrir le magasin en jeu pour le joueur local. Le magasin affiche une liste personnalisée des passes du jeu et des produits des développeurs.
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
MarketplaceService:OpenShop(player)

PlayerOwnsAsset
Déprécié

PlayerOwnsAssetAsync
Rendement
Capacités : AssetRead
MarketplaceService:PlayerOwnsAssetAsync(
player:Instance, assetId:number
Paramètres
player:Instance
assetId:number
Retours
Échantillons de code
Vérifiez la propriété d'un objet
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- L'objet que nous vérifions : 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(`Erreur lors de la vérification si {player.Name} possède {ASSET_NAME}: {errorMessage}`)
return
end
if doesPlayerOwnAsset then
print(`{player.Name} possède {ASSET_NAME}`)
else
print(`{player.Name} ne possède pas {ASSET_NAME}`)
end
end
Players.PlayerAdded:Connect(onPlayerAdded)

PlayerOwnsBundle
Déprécié

PlayerOwnsBundleAsync
Rendement
Capacités : AssetRead
MarketplaceService:PlayerOwnsBundleAsync(
player:Player, bundleId:number
Paramètres
player:Player
bundleId:number
Retours
Échantillons de code
Vérifier la Propriété du Package
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- Le bundle que nous vérifions : 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("L'appel à PlayerOwnsBundleAsync a échoué : ", doesPlayerOwnBundle)
return
end
if doesPlayerOwnBundle then
print(player.Name .. " possède " .. BUNDLE_NAME)
else
print(player.Name .. " ne possède pas " .. BUNDLE_NAME)
end
end)

PromptBulkPurchase
Capacités : PromptExternalPurchase
MarketplaceService:PromptBulkPurchase(
player:Player, lineItems:{any}, options:Dictionary
):()
Paramètres
player:Player
lineItems:{any}
options:Dictionary
Retours
()
Échantillons de code
Client d'Achat en Gros 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)
Serveur d'Achat en Gros de Prompt
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptBulkPurchaseEvent = Instance.new("RemoteEvent")
promptBulkPurchaseEvent.Name = "PromptBulkPurchaseEvent"
promptBulkPurchaseEvent.Parent = ReplicatedStorage
-- Écoutez le RemoteEvent se déclencher depuis un client et ensuite déclenchez l'invite d'achat en gros
promptBulkPurchaseEvent.OnServerEvent:Connect(function(player, items)
MarketplaceService:PromptBulkPurchase(player, items, {})
end)
Achat d'option temporisée
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
-- Trouver l'option de la durée la plus courte
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
Capacités : PromptExternalPurchase
MarketplaceService:PromptBundlePurchase(
player:Instance, bundleId:number
):()
Paramètres
player:Instance
bundleId:number
Retours
()

PromptCancelSubscription
Capacités : PromptExternalPurchase
MarketplaceService:PromptCancelSubscription(
user:Player, subscriptionId:string
):()
Paramètres
user:Player
subscriptionId:string
Retours
()

PromptGamePassPurchase
Capacités : PromptExternalPurchase
MarketplaceService:PromptGamePassPurchase(
player:Instance, gamePassId:number
):()
Paramètres
player:Instance
gamePassId:number
Retours
()

PromptPremiumPurchase
Déprécié

PromptProductPurchase
Capacités : PromptExternalPurchase
MarketplaceService:PromptProductPurchase(
player:Instance, productId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Paramètres
player:Instance
productId:number
equipIfPurchased:boolean
Valeur par défaut : true
currencyType:Enum.CurrencyType
Valeur par défaut : "Default"
Retours
()
Échantillons de code
MarketplaceService:PromptProductPurchase
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local productId = 0000000 -- Changez ceci avec l'ID de votre produit développeur
-- Fonction pour inciter à l'achat du produit développeur
local function promptPurchase()
MarketplaceService:PromptProductPurchase(player, productId)
end
promptPurchase()

PromptPurchase
Capacités : PromptExternalPurchase
MarketplaceService:PromptPurchase(
player:Instance, assetId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Paramètres
player:Instance
assetId:number
equipIfPurchased:boolean
Valeur par défaut : true
currencyType:Enum.CurrencyType
Valeur par défaut : "Default"
Retours
()
Échantillons de code
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 (Serveur)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptPurchaseEvent = Instance.new("RemoteEvent")
promptPurchaseEvent.Name = "PromptPurchaseEvent"
promptPurchaseEvent.Parent = ReplicatedStorage
-- Écoutez le RemoteEvent se déclencher depuis un Client et ensuite déclenchez l'invite d'achat
promptPurchaseEvent.OnServerEvent:Connect(function(player, id)
MarketplaceService:PromptPurchase(player, id)
end)

PromptRobloxSubscriptionPurchase
Capacités : PromptExternalPurchase
MarketplaceService:PromptRobloxSubscriptionPurchase(user:Player):()
Paramètres
user:Player
Retours
()
Échantillons de code
Demande d'achat d'abonnement 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)
-- Accorder la récompense et téléporter le joueur abonné dans la zone exclusive
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
-- Détecter les parties du personnage touchant le téléporteur
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
-- Le joueur a déjà Roblox Plus ; accorder la récompense immédiatement
grantRewardAndTeleport(player)
else
-- Demander l'abonnement Roblox Plus, limité à une fois toutes les quelques secondes
if not showModal then
return
end
showModal = false
task.delay(5, function()
showModal = true
end)
MarketplaceService:PromptRobloxSubscriptionPurchase(player)
end
end)
-- Détecter les parties du personnage quittant le téléporteur
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)
-- Accorder la récompense lorsque le serveur confirme un changement d'abonnement
-- Connecter le changement HasRobloxSubscription pour chaque joueur
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
Rendement
Capacités : PromptExternalPurchase
MarketplaceService:PromptRobuxTransferAsync(
sender:Player, receiverUserId:number, amount:number
Paramètres
sender:Player
receiverUserId:number
amount:number
Retours
Échantillons de code
MarketplaceService:PromptRobuxTransferAsync
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Exemple : transférer des Robux lorsqu'un joueur déclenche un RemoteEvent
local transferEvent = game.ReplicatedStorage:WaitForChild("RequestTransfer")
transferEvent.OnServerEvent:Connect(function(sender, receiverUserId, amount)
-- Valider les entrées
if not sender or not sender:IsA("Player") then
return
end
if typeof(receiverUserId) ~= "number" or receiverUserId <= 0 then
warn("receiverUserId invalide")
return
end
if typeof(amount) ~= "number" or amount <= 0 then
warn("montant invalide")
return
end
local success, result = pcall(function()
return MarketplaceService:PromptRobuxTransferAsync(sender, receiverUserId, amount)
end)
if success then
print(`Transfert initié avec TransferRequestId : {result}`)
else
warn(`Échec du transfert : {result}`)
end
end)

PromptSubscriptionPurchase
Capacités : PromptExternalPurchase
MarketplaceService:PromptSubscriptionPurchase(
user:Player, subscriptionId:string
):()
Paramètres
user:Player
subscriptionId:string
Retours
()

RankProductsAsync
Rendement
MarketplaceService:RankProductsAsync(productIdentifiers:{any}):{RankedItem}
Paramètres
productIdentifiers:{any}
Retours
{RankedItem}
Échantillons de code
Obtenez une liste de produits classés en fonction des ID de produit fournis
-- Obtenez le MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Créez le tableau de produits que vous souhaitez classer
local productIdentifiers = {
{InfoType = Enum.InfoType.GamePass, Id = 123},
{InfoType = Enum.InfoType.Product, Id = 456},
{InfoType = Enum.InfoType.Product, Id = 789}
}
-- Appelez dans un appel protégé pour gérer les erreurs gracieusement
local success, rankedProducts = pcall(function()
return MarketplaceService:RankProductsAsync(productIdentifiers)
end)
if not success then
error("Échec du classement des produits")
end
-- Chargez les articles retournés dans le magasin.
for i, rankedItem in ipairs(rankedProducts) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Logique pour ajouter des produits dans le magasin
end

RecommendTopProductsAsync
Rendement
MarketplaceService:RecommendTopProductsAsync(infoTypes:{any}):{RankedItem}
Paramètres
infoTypes:{any}
Retours
{RankedItem}
Échantillons de code
Obtenez une liste classée des meilleurs produits pour votre magasin en expérience
-- Obtenez le MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Créez un tableau de types de produits à inclure. Dans ce cas, les passes de jeu et les produits développeurs
local productTypes = {Enum.InfoType.GamePass, Enum.InfoType.Product}
-- Appelez dans un appel protégé pour gérer les erreurs gracieusement
local success, topRankedItems = pcall(function()
return MarketplaceService:RecommendTopProductsAsync(productTypes)
end)
if not success then
error("Échec du classement des produits")
end
-- Chargez les articles retournés dans le magasin. Assurez-vous de filtrer les articles non éligibles de topRankedItems tels que les produits développeurs que l'utilisateur ne peut plus acheter
for i, rankedItem in ipairs(topRankedItems) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Logique pour ajouter des produits dans le magasin
end

UserOwnsGamePassAsync
Rendement
Capacités : AssetRead
MarketplaceService:UserOwnsGamePassAsync(
userId:User, gamePassId:number
Paramètres
userId:User
gamePassId:number
Retours
Échantillons de code
Vérification de plusieurs passes de jeu avec un traitement par lots transparent
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
-- Lancer tous les appels simultanément permet au moteur de les regrouper en
-- moins de requêtes HTTP automatiquement.
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, "possède", #ownedPasses, "passes")
end)

Événements
PromptBulkPurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptBulkPurchaseFinished(

PromptBundlePurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptBundlePurchaseFinished(
player:Instance, bundleId:number, wasPurchased:boolean
Paramètres
player:Instance
bundleId:number
wasPurchased:boolean

PromptGamePassPurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptGamePassPurchaseFinished(
player:Instance, gamePassId:number, wasPurchased:boolean
Paramètres
player:Instance
gamePassId:number
wasPurchased:boolean
Échantillons de code
Gestion de l'achat de Gamepass terminé
local MarketplaceService = game:GetService("MarketplaceService")
local function gamepassPurchaseFinished(...)
-- Imprimer tous les détails de l'invite, par exemple :
-- PromptGamePassPurchaseFinished PlayerName 123456 false
print("PromptGamePassPurchaseFinished", ...)
end
MarketplaceService.PromptGamePassPurchaseFinished:Connect(gamepassPurchaseFinished)

PromptPremiumPurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptPremiumPurchaseFinished():RBXScriptSignal

PromptProductPurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptProductPurchaseFinished(
userId:number, productId:number, isPurchased:boolean
Paramètres
userId:number
productId:number
isPurchased:boolean

PromptPurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptPurchaseFinished(
player:Instance, assetId:number, isPurchased:boolean
Paramètres
player:Instance
assetId:number
isPurchased:boolean
Échantillons de code
Gestion de l'événement PromptPurchaseFinished
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptPurchaseFinished(player, assetId, isPurchased)
if isPurchased then
print(player.Name, "a acheté un objet avec l'AssetID :", assetId)
else
print(player.Name, "n'a pas acheté un objet avec l'AssetID :", assetId)
end
end
MarketplaceService.PromptPurchaseFinished:Connect(onPromptPurchaseFinished)

PromptRobloxSubscriptionPurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished(
user:Player, didTryPurchasing:boolean
Paramètres
user:Player
didTryPurchasing:boolean
Échantillons de code
Gérer l'événement PromptRobloxSubscriptionPurchaseFinished
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptRobloxSubscriptionPurchaseFinished(player, didTryPurchasing)
if didTryPurchasing then
-- Le joueur a tenté de s'abonner ; attendez le changement de HasRobloxSubscription pour confirmer
print(player.Name, "a tenté de s'abonner à Roblox Plus")
else
print(player.Name, "a fermé l'invite d'abonnement Roblox Plus sans acheter")
end
end
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished:Connect(onPromptRobloxSubscriptionPurchaseFinished)

PromptSubscriptionPurchaseFinished
Capacités : PromptExternalPurchase
MarketplaceService.PromptSubscriptionPurchaseFinished(
user:Player, subscriptionId:string, didTryPurchasing:boolean
Paramètres
user:Player
subscriptionId:string
didTryPurchasing:boolean

Rappels
ProcessReceipt
Capacités : Monetization
MarketplaceService.ProcessReceipt(receiptInfo:Dictionary):Enum.ProductPurchaseDecision
Paramètres
receiptInfo:Dictionary
Échantillons de code
Callback de Traitement de Reçu
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
-- Configuration du magasin de données pour suivre les achats qui ont été traités avec succès
local purchaseHistoryStore = DataStoreService:GetDataStore("PurchaseHistory")
local productIdByName = {
fullHeal = 123123,
gold100 = 456456,
}
-- Un dictionnaire pour rechercher la fonction de gestion qui accorde un achat correspondant à un ID de produit
-- Ces fonctions retournent vrai si l'achat a été accordé avec succès
-- Ces fonctions ne doivent jamais suspendre l'exécution car elles sont appelées plus tard dans un rappel UpdateAsync()
local grantPurchaseHandlerByProductId = {
[productIdByName.fullHeal] = function(_receipt, player)
local character = player.Character
local humanoid = character and character:FindFirstChild("Humanoid")
-- Assurez-vous que le joueur a un humanoïde à soigner
if not humanoid then
return false
end
-- Soignez le joueur à pleine santé
humanoid.Health = humanoid.MaxHealth
-- Indiquez un accord réussi
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
-- Ajoutez 100 or à la statistique d'or du joueur
goldStat.Value += 100
-- Indiquez un accord réussi
return true
end,
}
-- La fonction de rappel ProcessReceipt principale
-- Cette implémentation gère la plupart des scénarios d'échec mais ne mitige pas complètement les scénarios d'échec de données entre serveurs
local function processReceipt(receiptInfo)
local success, result = pcall(
purchaseHistoryStore.UpdateAsync,
purchaseHistoryStore,
receiptInfo.PurchaseId,
function(isPurchased)
if isPurchased then
-- Cet achat a déjà été enregistré comme accordé, il doit donc avoir été traité précédemment
-- Évitez d'appeler le gestionnaire d'accord ici pour éviter d'accorder l'achat deux fois
-- Bien que la valeur dans le magasin de données soit déjà vraie, vrai est retourné à nouveau afin que la variable de résultat de pcall soit également vraie
-- Cela sera utilisé plus tard pour retourner PurchaseGranted depuis le processeur de reçus
return true
end
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Évite d'accorder l'achat si le joueur n'est pas sur le serveur
-- Lorsqu'il se reconnecte, ce processeur de reçus sera appelé à nouveau
return nil
end
local grantPurchaseHandler = grantPurchaseHandlerByProductId[receiptInfo.ProductId]
if not grantPurchaseHandler then
-- S'il n'y a pas de gestionnaire défini pour cet ID de produit, l'achat ne peut pas être traité
-- Cela ne se produira jamais tant qu'un gestionnaire est défini pour chaque ID de produit vendu dans l'expérience
warn(`Aucun gestionnaire d'achat défini pour l'ID de produit '{receiptInfo.ProductId}'`)
return nil
end
local handlerSucceeded, handlerResult = pcall(grantPurchaseHandler, receiptInfo, player)
if not handlerSucceeded then
local errorMessage = handlerResult
warn(
`Le gestionnaire d'accord d'achat a rencontré une erreur lors du traitement de l'achat de '{player.Name}' pour l'ID de produit '{receiptInfo.ProductId}': {errorMessage}`
)
return nil
end
local didHandlerGrantPurchase = handlerResult == true
if not didHandlerGrantPurchase then
-- Le gestionnaire n'a pas accordé l'achat, donc enregistrez-le comme non accordé
return nil
end
-- L'achat est maintenant accordé au joueur, donc enregistrez-le comme accordé
-- Cela sera utilisé plus tard pour retourner PurchaseGranted depuis le processeur de reçus
return true
end
)
if not success then
local errorMessage = result
warn(`Échec du traitement du reçu en raison d'une erreur de magasin de données : {errorMessage}`)
return Enum.ProductPurchaseDecision.NotProcessedYet
end
local didGrantPurchase = result == true
return if didGrantPurchase
then Enum.ProductPurchaseDecision.PurchaseGranted
else Enum.ProductPurchaseDecision.NotProcessedYet
end
-- Définissez le rappel ; cela ne peut être fait qu'une seule fois par un script sur le serveur
MarketplaceService.ProcessReceipt = processReceipt

©2026 Société Roblox. Roblox, le logo Roblox et Powering Imagination font partie de nos marques déposées aux États-Unis et dans d'autres pays.