Học
Lớp công cụ
MarketplaceService
Không Thể Tạo
Dịch Vụ

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.


Tóm Tắt
Phương Pháp
GetProductInfo(assetId: number,infoType: Enum.InfoType):Dictionary
Đã Lỗi Thời
GetUsersPriceLevelsAsync(userIds: {any}):{PriceLevelInfo}
PlayerOwnsAsset(player: Instance,assetId: number):boolean
Đã Lỗi Thời
PlayerOwnsBundle(player: Player,bundleId: number):boolean
Đã Lỗi Thời
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):()
Đã Lỗi Thời
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}
Thành viên kế thừa

Tài Liệu Tham Khảo API
Phương Pháp
BindReceiptHandler
Các khả năng: Monetization
MarketplaceService:BindReceiptHandler(
transactionType:Enum.ReceiptType, handler:function, filter:{any}?
Tham Số
transactionType:Enum.ReceiptType
handler:function
filter:{any}?
Lợi Nhuận
Mẫu mã
MarketplaceService:BindReceiptHandler
-- LƯU Ý: Nếu trình xử lý của bạn cấp lợi ích lâu dài (tiền tệ, vật phẩm), hãy sử dụng
-- DataStoreService:UpdateAsync() trên TransferRequestId để ngăn chặn
-- việc cấp đôi khi cùng một biên lai được gửi đến nhiều máy chủ.
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Xử lý biên lai của người gửi (người chơi đã gửi Robux)
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.RobuxTransferSender,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Người chơi không có trên máy chủ này; hoãn lại để biên lai
-- được gửi lại đến máy chủ mà họ đang ở
return Enum.ReceiptDecision.NotProcessedYet
end
print(
`{player.Name} đã gửi {receiptInfo.CurrencySpent} Robux`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Cấp bất kỳ xác nhận nào từ phía người gửi hoặc cập nhật UI ở đây
return Enum.ReceiptDecision.Processed
end
)
-- Xử lý biên lai của người nhận (người chơi đã nhận 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} đã nhận {receiptInfo.CurrencySpent} Robux`
.. ` (TransferRequestId: {receiptInfo.TransferRequestId})`
)
-- Cấp bất kỳ lợi ích nào từ phía người nhận hoặc cập nhật UI ở đây
return Enum.ReceiptDecision.Processed
end
)
MarketplaceService:BindReceiptHandler
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
-- Thay thế bằng ID sản phẩm phát triển cấp 100 đồng
local COINS_PRODUCT_ID = 123456789
local COINS_PER_PURCHASE = 100
local purchaseHistoryStore = DataStoreService:GetDataStore("PurchaseHistory")
-- Việc truyền một mảng bộ lọc chỉ liên kết trình xử lý này với các ID sản phẩm được liệt kê.
-- Bỏ qua bộ lọc để đăng ký một trình xử lý bắt tất cả sẽ kích hoạt cho bất kỳ
-- biên lai sản phẩm phát triển nào không được yêu cầu bởi một trình xử lý đã lọc.
MarketplaceService:BindReceiptHandler(
Enum.ReceiptType.DeveloperProduct,
function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Người mua không có trên máy chủ này; hoãn lại để biên lai
-- được giao lại sau hoặc lần tiếp theo họ tham gia một máy chủ
return Enum.ReceiptDecision.NotProcessedYet
end
-- Cấp sản phẩm chính xác một lần, ngay cả khi cùng một biên lai
-- được giao nhiều hơn một lần, bằng cách dựa vào PurchaseId. Callback
-- ghi lại true chỉ khi lợi ích được cấp một cách bền vững, vì vậy
-- UpdateAsync sẽ trả về true chính xác khi biên lai này đã hoàn tất.
local success, granted = pcall(function()
return purchaseHistoryStore:UpdateAsync(receiptInfo.PurchaseId, function(alreadyGranted)
if alreadyGranted then
-- Một lần giao trước đó đã cấp mua này; không
-- cấp lại, nhưng giữ cho biên lai đã được giải quyết
return true
end
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins")
if not coins then
-- Thống kê của người chơi chưa sẵn sàng. Trả về nil để hủy
-- ghi lại để không có gì được ghi nhận là đã cấp và
-- biên lai sẽ được giao lại sau
return nil
end
coins.Value += COINS_PER_PURCHASE
return true
end)
end)
if not success or granted ~= true then
-- Đã xảy ra lỗi lưu trữ dữ liệu hoặc lợi ích không được cấp; để lại
-- biên lai chưa được giải quyết để nó được giao lại sau
return Enum.ReceiptDecision.NotProcessedYet
end
return Enum.ReceiptDecision.Processed
end,
{ COINS_PRODUCT_ID }
)

GetDeveloperProductsAsync
Sinh Lợi
Các khả năng: AssetRead
MarketplaceService:GetDeveloperProductsAsync():Instance
Lợi Nhuận
Mẫu mã
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
Đã Lỗi Thời

GetProductInfoAsync
Sinh Lợi
Các khả năng: AssetRead
MarketplaceService:GetProductInfoAsync(
assetId:number, infoType:Enum.InfoType
Tham Số
assetId:number
infoType:Enum.InfoType
Giá Trị Mặc Định: "Asset"
Lợi Nhuận
Mẫu mã
Lấy Thông Tin Sản Phẩm
local MarketplaceService = game:GetService("MarketplaceService")
local ASSET_ID = 125378389
local asset = MarketplaceService:GetProductInfoAsync(ASSET_ID)
print(asset.Name .. " :: " .. asset.Description)
Hiển thị Giảm giá Giá
local MarketplaceService = game:GetService("MarketplaceService")
local PASS_ID = 12345678
local textLabel = script.Parent
local DiscountTypeDisplay = {
RobloxPlusSubscription = "Giảm giá Roblox Plus",
}
local productInfo = MarketplaceService:GetProductInfoAsync(PASS_ID, Enum.InfoType.GamePass)
print(string.format("Giá gốc: %d", productInfo.UserBasePriceInRobux))
for _, discount in ipairs(productInfo.PriceDiscountDetails) do
local displayName = DiscountTypeDisplay[discount.Type] or "Giảm giá khác"
print(string.format("%s (%d%%): -%d", displayName, discount.Percent, discount.AmountInRobux))
end
print(string.format("Bạn phải trả: %d", productInfo.PriceInRobux))
Hiển Thị Các Tùy Chọn Thời Gian Có Sẵn
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 ngày - %d Robux", days, option.Price))
end
end
Lấy thông tin sản phẩm đồng thời với Batching Minh bạch
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("Không thể lấy thông tin cho sản phẩm:", productId, info)
end
remaining -= 1
end
-- Khởi động tất cả các cuộc gọi đồng thời cho phép động cơ nhóm chúng thành
-- ít yêu cầu HTTP hơn tự động.
for _, productId in productIds do
task.spawn(fetch, productId)
end
-- Chờ tất cả các yêu cầu hoàn thành.
while remaining > 0 do
task.wait()
end
-- Tất cả kết quả hiện đã có sẵn.
for productId, info in results do
print(info.Name, "-", info.PriceInRobux, "Robux")
end

GetRobloxSubscriptionDetailsAsync
Sinh Lợi
Các khả năng: Monetization
MarketplaceService:GetRobloxSubscriptionDetailsAsync(user:Player):Dictionary
Tham Số
user:Player
Lợi Nhuận
Mẫu mã
Kiểm tra Chi tiết Đăng ký 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. Kiểm tra lòng trung thành (vd: Đăng ký > 60 ngày)
local threeMonths = 60 * 24 * 60 * 60
if details.StartTime and (os.time() - details.StartTime.UnixTimestamp) > threeMonths then
print("Trao skin 'Cựu chiến binh Đăng ký 3 tháng'!")
end
-- 2. Kiểm tra sự thuộc về
if details.IsOriginExperience then
print("Xác nhận sự thuộc về: Người dùng đã đăng ký qua trải nghiệm này.")
else
print("Người dùng đã đăng ký ở nơi khác (Website hoặc trải nghiệm khác).")
end
end
end)

GetSubscriptionProductInfoAsync
Sinh Lợi
Các khả năng: AssetRead
MarketplaceService:GetSubscriptionProductInfoAsync(subscriptionId:string):Dictionary
Tham Số
subscriptionId:string
Lợi Nhuận

GetUsersPriceLevelsAsync
Sinh Lợi
Các khả năng: Monetization
MarketplaceService:GetUsersPriceLevelsAsync(userIds:{any}):{PriceLevelInfo}
Tham Số
userIds:{any}
Lợi Nhuận
{PriceLevelInfo}
Mẫu mã
Lấy mức giá cho danh sách người dùng
-- Lấy MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Định nghĩa một hàm để lấy cấp độ giá cho danh sách người dùng
local function getPriceLevels(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- Ánh xạ từng PriceLevelInfo tới bảng tra cứu UserId -> PriceLevel
local lookup = {}
for _, info in ipairs(result) do
lookup[info.UserId] = info.PriceLevel
end
return lookup
else
warn("Lỗi khi lấy cấp độ giá:", result)
return nil
end
end
-- Ví dụ sử dụng ID tạm thời
local user1Id = 123456789
local user2Id = 987654321
-- Gọi hàm và lưu kết quả
local priceLevels = getPriceLevels({user1Id, user2Id})
-- Nếu thành công, in ra cấp độ của từng người dùng
if priceLevels then
print("Cấp độ giá cho Người dùng 1:", priceLevels[user1Id])
print("Cấp độ giá cho Người dùng 2:", priceLevels[user2Id])
else
print("Không thể lấy cấp độ giá.")
end

GetUserSubscriptionDetailsAsync
Sinh Lợi
Các khả năng: Monetization
MarketplaceService:GetUserSubscriptionDetailsAsync(
user:Player, subscriptionId:string
Tham Số
user:Player
subscriptionId:string
Lợi Nhuận

GetUserSubscriptionPaymentHistoryAsync
Sinh Lợi
Các khả năng: Monetization
MarketplaceService:GetUserSubscriptionPaymentHistoryAsync(
user:Player, subscriptionId:string
Tham Số
user:Player
subscriptionId:string
Lợi Nhuận
Mẫu mã
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(`Lỗi khi kiểm tra lịch sử đăng ký: {err}`)
return
end
if next(subscriptionHistory) then
-- Người dùng có một số lịch sử đăng ký trong 12 tháng qua.
-- In chi tiết của từng mục thanh toán từ lịch sử đăng ký.
print(`Người chơi {player.Name} đã đăng ký {SUBSCRIPTION_ID} trước đây:`)
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(`Người chơi {player.Name} chưa bao giờ đăng ký {SUBSCRIPTION_ID} trước đây.`)
end
end
-- Gọi checkSubscriptionHistory cho bất kỳ người chơi nào đã có trong trò chơi
for _, player in ipairs(Players:GetPlayers()) do
checkSubscriptionHistory(player)
end
-- Gọi checkSubscriptionHistory cho tất cả người chơi trong tương lai
Players.PlayerAdded:Connect(checkSubscriptionHistory)

GetUserSubscriptionStatusAsync
Sinh Lợi
Các khả năng: Monetization
MarketplaceService:GetUserSubscriptionStatusAsync(
user:Player, subscriptionId:string
Tham Số
user:Player
subscriptionId:string
Lợi Nhuận
Mẫu mã
Kiểm Tra Trạng Thái Đăng Ký Người Dùng
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()
-- trả về IsRenewing và IsSubscribed
subStatus = MarketplaceService:GetUserSubscriptionStatusAsync(player, subscriptionID)
end)
if not success then
warn("Lỗi khi kiểm tra xem người chơi có đăng ký không: " .. tostring(message))
return
end
if subStatus["IsSubscribed"] then
print(player.Name .. " đã đăng ký với " .. subscriptionID)
-- Cấp quyền cho người chơi liên quan đến đăng ký
end
end
Players.PlayerAdded:Connect(checkSubStatus)

PlayerOwnsAsset
Đã Lỗi Thời

PlayerOwnsAssetAsync
Sinh Lợi
Các khả năng: AssetRead
MarketplaceService:PlayerOwnsAssetAsync(
player:Instance, assetId:number
Tham Số
player:Instance
assetId:number
Lợi Nhuận
Mẫu mã
Kiểm tra quyền sở hữu vật phẩm
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- Vật phẩm mà chúng tôi đang kiểm tra: 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(`Lỗi khi kiểm tra xem {player.Name} có sở hữu {ASSET_NAME}: {errorMessage}`)
return
end
if doesPlayerOwnAsset then
print(`{player.Name} sở hữu {ASSET_NAME}`)
else
print(`{player.Name} không sở hữu {ASSET_NAME}`)
end
end
Players.PlayerAdded:Connect(onPlayerAdded)

PlayerOwnsBundle
Đã Lỗi Thời

PlayerOwnsBundleAsync
Sinh Lợi
Các khả năng: AssetRead
MarketplaceService:PlayerOwnsBundleAsync(
player:Player, bundleId:number
Tham Số
player:Player
bundleId:number
Lợi Nhuận
Mẫu mã
Kiểm tra quyền sở hữu gói
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
-- Bộ mà chúng ta đang kiểm tra: 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("Gọi PlayerOwnsBundleAsync thất bại: ", doesPlayerOwnBundle)
return
end
if doesPlayerOwnBundle then
print(player.Name .. " sở hữu " .. BUNDLE_NAME)
else
print(player.Name .. " không sở hữu " .. BUNDLE_NAME)
end
end)

PromptBulkPurchase
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptBulkPurchase(
player:Player, lineItems:{any}, options:Dictionary
):()
Tham Số
player:Player
lineItems:{any}
options:Dictionary
Lợi Nhuận
()
Mẫu mã
Khách Hàng Mua Sắm Số Lượng Lớn
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)
Máy chủ Mua Sắm Số Lượng Lớn
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptBulkPurchaseEvent = Instance.new("RemoteEvent")
promptBulkPurchaseEvent.Name = "PromptBulkPurchaseEvent"
promptBulkPurchaseEvent.Parent = ReplicatedStorage
-- Lắng nghe sự kiện RemoteEvent từ một Khách hàng và sau đó kích hoạt lời mời mua số lượng lớn
promptBulkPurchaseEvent.OnServerEvent:Connect(function(player, items)
MarketplaceService:PromptBulkPurchase(player, items, {})
end)
Mua Tùy Chọn Có Thời Gian
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
-- Tìm tùy chọn có thời gian ngắn nhất
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
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptBundlePurchase(
player:Instance, bundleId:number
):()
Tham Số
player:Instance
bundleId:number
Lợi Nhuận
()

PromptCancelSubscription
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptCancelSubscription(
user:Player, subscriptionId:string
):()
Tham Số
user:Player
subscriptionId:string
Lợi Nhuận
()

PromptGamePassPurchase
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptGamePassPurchase(
player:Instance, gamePassId:number
):()
Tham Số
player:Instance
gamePassId:number
Lợi Nhuận
()

PromptPremiumPurchase
Đã Lỗi Thời

PromptProductPurchase
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptProductPurchase(
player:Instance, productId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Tham Số
player:Instance
productId:number
equipIfPurchased:boolean
Giá Trị Mặc Định: true
currencyType:Enum.CurrencyType
Giá Trị Mặc Định: "Default"
Lợi Nhuận
()
Mẫu mã
MarketplaceService:PromptProductPurchase
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local productId = 0000000 -- Thay đổi điều này thành ID sản phẩm phát triển của bạn
-- Hàm để yêu cầu mua sản phẩm phát triển
local function promptPurchase()
MarketplaceService:PromptProductPurchase(player, productId)
end
promptPurchase()

PromptPurchase
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptPurchase(
player:Instance, assetId:number, equipIfPurchased:boolean, currencyType:Enum.CurrencyType
):()
Tham Số
player:Instance
assetId:number
equipIfPurchased:boolean
Giá Trị Mặc Định: true
currencyType:Enum.CurrencyType
Giá Trị Mặc Định: "Default"
Lợi Nhuận
()
Mẫu mã
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)
Kịch bản (Máy chủ)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MarketplaceService = game:GetService("MarketplaceService")
local promptPurchaseEvent = Instance.new("RemoteEvent")
promptPurchaseEvent.Name = "PromptPurchaseEvent"
promptPurchaseEvent.Parent = ReplicatedStorage
-- Lắng nghe RemoteEvent để kích hoạt từ một Khách hàng và sau đó kích hoạt lời mời mua
promptPurchaseEvent.OnServerEvent:Connect(function(player, id)
MarketplaceService:PromptPurchase(player, id)
end)

PromptRobloxSubscriptionPurchase
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptRobloxSubscriptionPurchase(user:Player):()
Tham Số
user:Player
Lợi Nhuận
()
Mẫu mã
Yêu cầu mua gói đăng ký 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)
-- Cấp phần thưởng và dịch chuyển người chơi đăng ký đến khu vực độc quyền
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
-- Phát hiện các phần của nhân vật chạm vào teleporter
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
-- Người chơi đã có Roblox Plus; cấp phần thưởng ngay lập tức
grantRewardAndTeleport(player)
else
-- Yêu cầu đăng ký Roblox Plus, chỉ cho phép một lần mỗi vài giây
if not showModal then
return
end
showModal = false
task.delay(5, function()
showModal = true
end)
MarketplaceService:PromptRobloxSubscriptionPurchase(player)
end
end)
-- Phát hiện các phần của nhân vật rời khỏi teleporter
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)
-- Cấp phần thưởng khi máy chủ xác nhận thay đổi đăng ký
-- Kết nối thay đổi HasRobloxSubscription cho mỗi người chơi
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
Sinh Lợi
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptRobuxTransferAsync(
sender:Player, receiverUserId:number, amount:number
Tham Số
sender:Player
receiverUserId:number
amount:number
Lợi Nhuận
Mẫu mã
MarketplaceService:PromptRobuxTransferAsync
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
-- Ví dụ: chuyển Robux khi một người chơi kích hoạt một RemoteEvent
local transferEvent = game.ReplicatedStorage:WaitForChild("RequestTransfer")
transferEvent.OnServerEvent:Connect(function(sender, receiverUserId, amount)
-- Xác thực đầu vào
if not sender or not sender:IsA("Player") then
return
end
if typeof(receiverUserId) ~= "number" or receiverUserId <= 0 then
warn("receiverUserId không hợp lệ")
return
end
if typeof(amount) ~= "number" or amount <= 0 then
warn("số tiền không hợp lệ")
return
end
local success, result = pcall(function()
return MarketplaceService:PromptRobuxTransferAsync(sender, receiverUserId, amount)
end)
if success then
print(`Giao dịch đã được khởi động với TransferRequestId: {result}`)
else
warn(`Giao dịch thất bại: {result}`)
end
end)

PromptSubscriptionPurchase
Các khả năng: PromptExternalPurchase
MarketplaceService:PromptSubscriptionPurchase(
user:Player, subscriptionId:string
):()
Tham Số
user:Player
subscriptionId:string
Lợi Nhuận
()

RankProductsAsync
Sinh Lợi
MarketplaceService:RankProductsAsync(productIdentifiers:{any}):{RankedItem}
Tham Số
productIdentifiers:{any}
Lợi Nhuận
{RankedItem}
Mẫu mã
Lấy danh sách sản phẩm có xếp hạng dựa trên ID sản phẩm đã cung cấp
-- Lấy MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Tạo mảng các sản phẩm mà bạn muốn xếp hạng
local productIdentifiers = {
{InfoType = Enum.InfoType.GamePass, Id = 123},
{InfoType = Enum.InfoType.Product, Id = 456},
{InfoType = Enum.InfoType.Product, Id = 789}
}
-- Gọi trong một cuộc gọi bảo vệ để xử lý lỗi một cách nhẹ nhàng
local success, rankedProducts = pcall(function()
return MarketplaceService:RankProductsAsync(productIdentifiers)
end)
if not success then
error("Không thể xếp hạng sản phẩm")
end
-- Tải các mục đã trả về vào cửa hàng.
for i, rankedItem in ipairs(rankedProducts) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Logic để thêm sản phẩm vào cửa hàng
end

RecommendTopProductsAsync
Sinh Lợi
MarketplaceService:RecommendTopProductsAsync(infoTypes:{any}):{RankedItem}
Tham Số
infoTypes:{any}
Lợi Nhuận
{RankedItem}
Mẫu mã
Nhận danh sách xếp hạng các sản phẩm hàng đầu trong cửa hàng trải nghiệm của bạn
-- Nhận dịch vụ MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Tạo một mảng các loại sản phẩm để bao gồm. Trong trường hợp này cả hai loại là game passes và sản phẩm phát triển
local productTypes = {Enum.InfoType.GamePass, Enum.InfoType.Product}
-- Gọi trong một cuộc gọi bảo vệ để xử lý lỗi một cách thanh lịch
local success, topRankedItems = pcall(function()
return MarketplaceService:RecommendTopProductsAsync(productTypes)
end)
if not success then
error("Không thể xếp hạng sản phẩm")
end
-- Tải các mục đã trả về vào cửa hàng. Đảm bảo lọc ra bất kỳ mục không đủ điều kiện nào từ topRankedItems chẳng hạn như sản phẩm phát triển mà người dùng không còn mua được
for i, rankedItem in ipairs(topRankedItems) do
local productIdentifier = rankedItem.ProductIdentifier
local productInfo = rankedItem.ProductInfo
-- ...
-- Logic để thêm sản phẩm vào cửa hàng
end

UserOwnsGamePassAsync
Sinh Lợi
Các khả năng: AssetRead
MarketplaceService:UserOwnsGamePassAsync(
userId:User, gamePassId:number
Tham Số
userId:User
gamePassId:number
Lợi Nhuận
Mẫu mã
Kiểm Tra Nhiều Game Pass với Batching Minh Bạch
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
-- Khởi động tất cả các cuộc gọi đồng thời cho phép engine nhóm chúng vào
-- ít yêu cầu HTTP hơn tự động.
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, "sở hữu", #ownedPasses, "game pass")
end)

Sự Kiện
PromptBulkPurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptBulkPurchaseFinished(

PromptBundlePurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptBundlePurchaseFinished(
player:Instance, bundleId:number, wasPurchased:boolean
Tham Số
player:Instance
bundleId:number
wasPurchased:boolean

PromptGamePassPurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptGamePassPurchaseFinished(
player:Instance, gamePassId:number, wasPurchased:boolean
Tham Số
player:Instance
gamePassId:number
wasPurchased:boolean
Mẫu mã
Xử lý hoàn tất mua Gamepass
local MarketplaceService = game:GetService("MarketplaceService")
local function gamepassPurchaseFinished(...)
-- In ra tất cả các chi tiết của thông báo, ví dụ:
-- PromptGamePassPurchaseFinished PlayerName 123456 false
print("PromptGamePassPurchaseFinished", ...)
end
MarketplaceService.PromptGamePassPurchaseFinished:Connect(gamepassPurchaseFinished)

PromptPremiumPurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptPremiumPurchaseFinished():RBXScriptSignal

PromptProductPurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptProductPurchaseFinished(
userId:number, productId:number, isPurchased:boolean
Tham Số
userId:number
productId:number
isPurchased:boolean

PromptPurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptPurchaseFinished(
player:Instance, assetId:number, isPurchased:boolean
Tham Số
player:Instance
assetId:number
isPurchased:boolean
Mẫu mã
Xử lý sự kiện PromptPurchaseFinished
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptPurchaseFinished(player, assetId, isPurchased)
if isPurchased then
print(player.Name, "đã mua một món đồ với AssetID:", assetId)
else
print(player.Name, "không mua một món đồ với AssetID:", assetId)
end
end
MarketplaceService.PromptPurchaseFinished:Connect(onPromptPurchaseFinished)

PromptRobloxSubscriptionPurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished(
user:Player, didTryPurchasing:boolean
Tham Số
user:Player
didTryPurchasing:boolean
Mẫu mã
Xử lý sự kiện PromptRobloxSubscriptionPurchaseFinished
local MarketplaceService = game:GetService("MarketplaceService")
local function onPromptRobloxSubscriptionPurchaseFinished(player, didTryPurchasing)
if didTryPurchasing then
-- Người chơi đã cố gắng đăng ký; chờ thay đổi HasRobloxSubscription để xác nhận
print(player.Name, "cố gắng đăng ký Roblox Plus")
else
print(player.Name, "đã đóng lời mời đăng ký Roblox Plus mà không mua sắm")
end
end
MarketplaceService.PromptRobloxSubscriptionPurchaseFinished:Connect(onPromptRobloxSubscriptionPurchaseFinished)

PromptSubscriptionPurchaseFinished
Các khả năng: PromptExternalPurchase
MarketplaceService.PromptSubscriptionPurchaseFinished(
user:Player, subscriptionId:string, didTryPurchasing:boolean
Tham Số
user:Player
subscriptionId:string
didTryPurchasing:boolean

Gọi Lại
ProcessReceipt
Các khả năng: Monetization
MarketplaceService.ProcessReceipt(receiptInfo:Dictionary):Enum.ProductPurchaseDecision
Tham Số
receiptInfo:Dictionary
Mẫu mã
Hàm Callback ProcessReceipt
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
-- Thiết lập kho dữ liệu để theo dõi các giao dịch mua đã được xử lý thành công
local purchaseHistoryStore = DataStoreService:GetDataStore("PurchaseHistory")
local productIdByName = {
fullHeal = 123123,
gold100 = 456456,
}
-- Một từ điển để tra cứu hàm xử lý để cấp phát một giao dịch mua tương ứng với ID sản phẩm
-- Các hàm này trả về true nếu giao dịch mua đã được cấp phát thành công
-- Các hàm này không bao giờ được yield vì chúng được gọi sau đó trong một callback UpdateAsync()
local grantPurchaseHandlerByProductId = {
[productIdByName.fullHeal] = function(_receipt, player)
local character = player.Character
local humanoid = character and character:FindFirstChild("Humanoid")
-- Đảm bảo người chơi có một humanoid để hồi phục
if not humanoid then
return false
end
-- Hồi phục người chơi đến sức khỏe tối đa
humanoid.Health = humanoid.MaxHealth
-- Chỉ ra một cấp phát thành công
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
-- Thêm 100 vàng vào chỉ số vàng của người chơi
goldStat.Value += 100
-- Chỉ ra một cấp phát thành công
return true
end,
}
-- Hàm callback ProcessReceipt chính
-- Triển khai này xử lý hầu hết các kịch bản thất bại nhưng không hoàn toàn giảm thiểu các kịch bản thất bại dữ liệu giữa các máy chủ
local function processReceipt(receiptInfo)
local success, result = pcall(
purchaseHistoryStore.UpdateAsync,
purchaseHistoryStore,
receiptInfo.PurchaseId,
function(isPurchased)
if isPurchased then
-- Giao dịch mua này đã được ghi lại là đã cấp phát, vì vậy nó phải đã được xử lý trước đó
-- Tránh gọi hàm cấp phát giao dịch mua ở đây để ngăn cấp phát giao dịch mua hai lần
-- Trong khi giá trị trong kho dữ liệu đã là true, true được trả về một lần nữa để biến pcall cũng là true
-- Điều này sẽ được sử dụng sau để trả về PurchaseGranted từ bộ xử lý biên lai
return true
end
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
-- Tránh cấp phát giao dịch mua nếu người chơi không có trong máy chủ
-- Khi họ tham gia lại, bộ xử lý biên lai này sẽ được gọi lại
return nil
end
local grantPurchaseHandler = grantPurchaseHandlerByProductId[receiptInfo.ProductId]
if not grantPurchaseHandler then
-- Nếu không có hàm xử lý nào được định nghĩa cho ID sản phẩm này, giao dịch mua không thể được xử lý
-- Điều này sẽ không bao giờ xảy ra miễn là có một hàm xử lý được thiết lập cho mỗi ID sản phẩm được bán trong trải nghiệm
warn(`Không có hàm xử lý giao dịch mua nào được định nghĩa cho ID sản phẩm '{receiptInfo.ProductId}'`)
return nil
end
local handlerSucceeded, handlerResult = pcall(grantPurchaseHandler, receiptInfo, player)
if not handlerSucceeded then
local errorMessage = handlerResult
warn(
`Hàm xử lý cấp phát giao dịch mua gặp lỗi trong khi xử lý giao dịch mua từ '{player.Name}' của ID sản phẩm '{receiptInfo.ProductId}': {errorMessage}`
)
return nil
end
local didHandlerGrantPurchase = handlerResult == true
if not didHandlerGrantPurchase then
-- Hàm xử lý không cấp phát giao dịch mua, vì vậy ghi lại nó là không được cấp phát
return nil
end
-- Giao dịch mua hiện đã được cấp phát cho người chơi, vì vậy ghi lại nó là đã cấp phát
-- Điều này sẽ được sử dụng sau để trả về PurchaseGranted từ bộ xử lý biên lai
return true
end
)
if not success then
local errorMessage = result
warn(`Không thể xử lý biên lai do lỗi kho dữ liệu: {errorMessage}`)
return Enum.ProductPurchaseDecision.NotProcessedYet
end
local didGrantPurchase = result == true
return if didGrantPurchase
then Enum.ProductPurchaseDecision.PurchaseGranted
else Enum.ProductPurchaseDecision.NotProcessedYet
end
-- Đặt callback; điều này chỉ có thể được thực hiện một lần bởi một script trên máy chủ
MarketplaceService.ProcessReceipt = processReceipt

©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.