I've tried everything I could think of, but the function won't fire when I buy the dev product. sometimes after I rejoin the place, it recognises that I bought the item, but I'd like it to recognise instantly.
the place with the script in question is here
and here is the script in question, all variable references are to existing items
if game.ServerScriptService:FindFirstChild("VaporPurchaseHandler") ~= nil then
script.Parent = game.ServerScriptService
else
script:Destroy()
end
-- debugging code added by ihaveamac
enable_debug_print = true
function print_d(m)
if enable_debug_print then
print("<debug> "..m)
end
end
print_d("DEBUG MODE ACTIVE")
local MarketplaceService = game:GetService("MarketplaceService")
local PurchaseHistory = game:GetService("DataStoreService"):GetDataStore("PurchaseHistory")
local data = game:GetService("DataStoreService"):GetDataStore("VaporData")
print_d("psready")
MarketplaceService.ProcessReceipt = function(receiptInfo)
print_d("purchased")
local playerProductKey = receiptInfo.PlayerId .. ":" .. receiptInfo.PurchaseId
if PurchaseHistory:GetAsync(playerProductKey) then
return Enum.ProductPurchaseDecision.PurchaseGranted
end
print_d("RUNNING: for i, player in ipairs(game.Players:GetPlayers()) do")
for i, player in ipairs(game.Players:GetPlayers()) do
print_d("RUNNING: if player.userId == receiptInfo.PlayerId then")
if player.userId == receiptInfo.PlayerId then
print_d("condition successful")
local vapor = player.PlayerGui:FindFirstChild("Vapor")
local props = vapor.Properties
local GameId = props.ProductId.Value
local suffix = props.DataSuffix.Value
local main = vapor.Window
if receiptInfo.ProductId == GameId then
print(player.Name)
print(main.Name)
main.Buy.Visible = false
main.Load.Visible = true
print_d("gameIdAffirmative")
if main.Buy:FindFirstChild("Gift") ~= nil and main.Buy:FindFirstChild("Gift").isGift.Value == true then
print_d("isGift")
local text = string.lower(main.Buy:FindFirstChild("Gift").GiftBox.Text)
local giftlist = data:GetAsync("giftlist"..suffix)
if giftlist ~= nil then
local gifted = false
for i = 1,#giftlist do
if giftlist[i] == text then
print_d("already gifted to "..text)
gifted = true
end
end
if gifted == false then
print_d("gifted")
table.insert(giftlist,text)
data:SetAsync_d("giftlist"..suffix,giftlist)
main.Load.Text.Text = "Gift Sent.."
end
end
wait(1)
main.Load.Text.Text = "Processing.."
main.Load.Visible = false
main:FindFirstChild("Buy").Visible = true
elseif main.Buy:FindFirstChild("Gift").isGift.Value == false then
print_d("notgift")
data:SetAsync(player.userId..suffix,true)
main.Load.Text.Text = "Purchase Complete.."
wait(1)
main.Load.Text.Text = "Processing.."
wait(1)
main.Load.Visible = false
main.Buy.Visible = true
main.Visible = false
vapor.Back.Visible = false
print_d("buydone")
else print_d("notgift, and not notgift")
end
end
else
print_d("condition failed")
end
print_d("if statement completed")
end
PurchaseHistory:SetAsync(playerProductKey, true)
print_d("purchasefinish")
return Enum.ProductPurchaseDecision.PurchaseGranted
end
print_d("purchase handler is ready")

8 comments
Just a tip for testing this: make this a named function, and have ProcessReceipt call that function, passing in the receipt itself as an argument. This lets you create a "spoof" receipt that bypasses actually purchasing anything to check your code.
Just skimming this I don't see anything wrong. You used ProcessReceipt as a callback and not an event, which is correct. My only guess is that the datastore stuff is causing it the break without properly erroring.
That was my first guess, but if it were the data stores, the function should have at least run up to the point where datastores were used, currently it doesn't run at all between lines 23, and 100
I've had this problem too. Especially when I have multiple products. I'm not sure why it doesn't work right :/
Is this in a Server Script?
yes.
Could this be roblox sided, not you?
yes.