<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@artankor</title><generator>teletype.in</generator><description><![CDATA[@artankor]]></description><link>https://teletype.in/@artankor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=artankor</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/artankor?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/artankor?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 20 Jun 2026 12:57:42 GMT</pubDate><lastBuildDate>Sat, 20 Jun 2026 12:57:42 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@artankor/gn_EFUAVLfa</guid><link>https://teletype.in/@artankor/gn_EFUAVLfa?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=artankor</link><comments>https://teletype.in/@artankor/gn_EFUAVLfa?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=artankor#comments</comments><dc:creator>artankor</dc:creator><title>Robjtgjjg</title><pubDate>Sat, 20 Jun 2026 09:45:23 GMT</pubDate><description><![CDATA[<img src="https://devforum.roblox.com/secure-uploads/uploads/original/5X/7/4/7/1/74711e8833623dd7b77ff0feacf4c0fa430647d0.jpeg"></img>image]]></description><content:encoded><![CDATA[
  <figure id="UFmI" class="m_custom">
    <img src="https://devforum.roblox.com/secure-uploads/uploads/original/5X/7/4/7/1/74711e8833623dd7b77ff0feacf4c0fa430647d0.jpeg" width="690" />
  </figure>
  <p id="Q4n9">image</p>
  <p id="HHdU">Уязвимости PromptProductFinished можно исправить, используя <a href="https://create.roblox.com/docs/production/monetization/developer-products#handling-purchases" target="_blank">ProcessReceipt</a>. Мой пример обработки UGC-игр, которые позволяют покупать бесплатные UGC за Robux с помощью dev-продукта:<br />(Пожалуйста, используйте только processreceipt, я тогда был не очень хорошим программистом, ха-ха)</p>
  <pre id="RumU">local DEV_PRODUCT_ID =tonumber(game:GetService(&quot;ReplicatedStorage&quot;):WaitForChild(&quot;DEVPRODUCTID&quot;).Value)
local productIdUGC = game:GetService(&quot;ReplicatedStorage&quot;):WaitForChild(&quot;UGCID&quot;).Value

local MarketplaceService = game:GetService(&quot;MarketplaceService&quot;)
local Players = game:GetService(&quot;Players&quot;)
local bought = {}

local function processReceipt(receiptInfo)
    local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
    print(player.Name .. &quot; - dev product id&quot;, receiptInfo.ProductId)

    local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
    if not player then
        return Enum.ProductPurchaseDecision.NotProcessedYet
    end

    if receiptInfo.ProductId == DEV_PRODUCT_ID then
        bought[receiptInfo.PlayerId] = DEV_PRODUCT_ID
        return Enum.ProductPurchaseDecision.PurchaseGranted
    end

    return Enum.ProductPurchaseDecision.NotProcessedYet
end

MarketplaceService.ProcessReceipt = processReceipt
local success, result = pcall(function()
    MarketplaceService.ProcessReceipt = processReceipt
end)

if not success then
    warn(&quot;processreceipt:&quot;, result)
end


MarketplaceService.PromptProductPurchaseFinished:Connect(function(player, productId, wasPurchased)
    if tonumber(productId) == DEV_PRODUCT_ID and wasPurchased == true and bought[player] == DEV_PRODUCT_ID then
      pcall(function()  MarketplaceService:PromptPurchase(game.Players:GetPlayerByUserId(player), productIdUGC)
end)
        bought[player] = nil
    end
end)</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@artankor/FXlAWVHrTTM</guid><link>https://teletype.in/@artankor/FXlAWVHrTTM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=artankor</link><comments>https://teletype.in/@artankor/FXlAWVHrTTM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=artankor#comments</comments><dc:creator>artankor</dc:creator><title>Robloxghghhgyy</title><pubDate>Sat, 20 Jun 2026 09:41:55 GMT</pubDate><description><![CDATA[<img src="https://devforum.roblox.com/secure-uploads/uploads/original/5X/7/4/7/1/74711e8833623dd7b77ff0feacf4c0fa430647d0.jpeg"></img>image]]></description><content:encoded><![CDATA[
  <figure id="eIFq" class="m_custom">
    <img src="https://devforum.roblox.com/secure-uploads/uploads/original/5X/7/4/7/1/74711e8833623dd7b77ff0feacf4c0fa430647d0.jpeg" width="690" />
  </figure>
  <p id="XnXR">image</p>
  <p id="wXHA"></p>
  <pre id="mf7s">local DEV_PRODUCT_ID =tonumber(game:GetService(&quot;ReplicatedStorage&quot;):WaitForChild(&quot;DEVPRODUCTID&quot;).Value)
local productIdUGC = game:GetService(&quot;ReplicatedStorage&quot;):WaitForChild(&quot;UGCID&quot;).Value

local MarketplaceService = game:GetService(&quot;MarketplaceService&quot;)
local Players = game:GetService(&quot;Players&quot;)
local bought = {}

local function processReceipt(receiptInfo)
    local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
    print(player.Name .. &quot; - dev product id&quot;, receiptInfo.ProductId)

    local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
    if not player then
        return Enum.ProductPurchaseDecision.NotProcessedYet
    end

    if receiptInfo.ProductId == DEV_PRODUCT_ID then
        bought[receiptInfo.PlayerId] = DEV_PRODUCT_ID
        return Enum.ProductPurchaseDecision.PurchaseGranted
    end

    return Enum.ProductPurchaseDecision.NotProcessedYet
end

MarketplaceService.ProcessReceipt = processReceipt
local success, result = pcall(function()
    MarketplaceService.ProcessReceipt = processReceipt
end)

if not success then
    warn(&quot;processreceipt:&quot;, result)
end


MarketplaceService.PromptProductPurchaseFinished:Connect(function(player, productId, wasPurchased)
    if tonumber(productId) == DEV_PRODUCT_ID and wasPurchased == true and bought[player] == DEV_PRODUCT_ID then
      pcall(function()  MarketplaceService:PromptPurchase(game.Players:GetPlayerByUserId(player), productIdUGC)
end)
        bought[player] = nil
    end
end)</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@artankor/en7XDerl3yz</guid><link>https://teletype.in/@artankor/en7XDerl3yz?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=artankor</link><comments>https://teletype.in/@artankor/en7XDerl3yz?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=artankor#comments</comments><dc:creator>artankor</dc:creator><title>image  Уязвимости PromptProductFinished можно исправить, используя ProcessReceipt. Мой пример обработки UGC-игр, которые позволяют покупать бесплатные UGC за Robux с помощью dev-продукта: (Пожалуйста, используйте только processreceipt, я тогда был не очен</title><pubDate>Sat, 20 Jun 2026 09:08:24 GMT</pubDate><description><![CDATA[<img src="https://devforum.roblox.com/secure-uploads/uploads/original/5X/7/4/7/1/74711e8833623dd7b77ff0feacf4c0fa430647d0.jpeg"></img>image]]></description><content:encoded><![CDATA[
  <figure id="qx94" class="m_custom">
    <img src="https://devforum.roblox.com/secure-uploads/uploads/original/5X/7/4/7/1/74711e8833623dd7b77ff0feacf4c0fa430647d0.jpeg" width="690" />
  </figure>
  <p id="HVBk">image</p>
  <p id="XuBV">Уязвимости PromptProductFinished можно исправить, используя <a href="https://create.roblox.com/docs/production/monetization/developer-products#handling-purchases" target="_blank">ProcessReceipt</a>. Мой пример обработки UGC-игр, которые позволяют покупать бесплатные UGC за Robux с помощью dev-продукта:<br />(Пожалуйста, используйте только processreceipt, я тогда был не очень хорошим программистом, ха-ха)</p>
  <pre id="3RjB">local DEV_PRODUCT_ID =tonumber(game:GetService(&quot;ReplicatedStorage&quot;):WaitForChild(&quot;DEVPRODUCTID&quot;).Value)
local productIdUGC = game:GetService(&quot;ReplicatedStorage&quot;):WaitForChild(&quot;UGCID&quot;).Value

local MarketplaceService = game:GetService(&quot;MarketplaceService&quot;)
local Players = game:GetService(&quot;Players&quot;)
local bought = {}

local function processReceipt(receiptInfo)
    local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
    print(player.Name .. &quot; - dev product id&quot;, receiptInfo.ProductId)

    local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
    if not player then
        return Enum.ProductPurchaseDecision.NotProcessedYet
    end

    if receiptInfo.ProductId == DEV_PRODUCT_ID then
        bought[receiptInfo.PlayerId] = DEV_PRODUCT_ID
        return Enum.ProductPurchaseDecision.PurchaseGranted
    end

    return Enum.ProductPurchaseDecision.NotProcessedYet
end

MarketplaceService.ProcessReceipt = processReceipt
local success, result = pcall(function()
    MarketplaceService.ProcessReceipt = processReceipt
end)

if not success then
    warn(&quot;processreceipt:&quot;, result)
end


MarketplaceService.PromptProductPurchaseFinished:Connect(function(player, productId, wasPurchased)
    if tonumber(productId) == DEV_PRODUCT_ID and wasPurchased == true and bought[player] == DEV_PRODUCT_ID then
      pcall(function()  MarketplaceService:PromptPurchase(game.Players:GetPlayerByUserId(player), productIdUGC)
end)
        bought[player] = nil
    end
end)</pre>

]]></content:encoded></item></channel></rss>