Consumable In App Purchases on Android
panagiotis m
merakosp at gmail.com
Wed Aug 9 04:37:42 EDT 2023
Hello Dan,
The call to mobileStoreConfirmPurchase pProductID causes the
purchaseStateUpdate message to be sent again with status=complete.
So I would not suggest putting the call to mobileStoreConsumePurchase
pProductID just after mobileStoreConfirmPurchase.
You could either put it in a separate button and see if it works, otherwise
add a [case "complete"] in the purchaseStateUpdate msg and there consume
the product and disable purchase updates, i.e.:
on purchaseStateUpdate pPurchaseID, pProductID, pState
switch pState
case "paymentReceived"
answer "Payment received!"
offerPurchasedProduct pProductID
mobileStoreConfirmPurchase pProductID
break
case "error"
answer "Error occured during purchase handling:" & return & return
& mobileStorePurchaseError(pPurchaseID)
mobileStoreDisablePurchaseUpdates
break
case "invalidSKU"
answer "Invalid SKU."
mobileStoreDisablePurchaseUpdates
break
case "alreadyEntitled"
answer "Already Owned."
mobileStoreDisablePurchaseUpdates
break
case "restored"
put "Restored: " & pProductID & cr after field "restored"
offerPurchasedProduct pProductID
mobileStoreConfirmPurchase pProductID
break
case "cancelled"
answer "Purchase Cancelled:" && pProductID
mobileStoreDisablePurchaseUpdates
break
case "complete"
answer "Purchase Complete:" && pProductID
mobileStoreConsumePurchase pProductID // <-- ADD THIS HERE
mobileStoreDisablePurchaseUpdates
break
end switch
end purchaseStateUpdate
Hope this helps.
Kind regards,
Panos
--
On Tue, 8 Aug 2023 at 22:52, Dan Friedman via use-livecode <
use-livecode at lists.runrev.com> wrote:
> Andrew,
>
> Thank you for the input. The code snippet you said you are using has
> mobileStoreConsumePurchase IMMEDIATELY following mobileStoreMakePurchase.
> Is that what you are doing? The LC example show that
> mobileStoreMakePurchase should be handled in the purchaseStateUpdate
> message after the purchase is paymentReceived”
>
> If that’s true, then I feel like I’m doing exactly what you are
> suggesting. The purchase is fine, but the consumption if not working for
> me. Here’s what I’m doing:
>
> on startInAppPurchase numCredits
> //setup purchase id
> if numCredits = 1 then
> put 1001 into productID
> put "$0.99" into productAmount
> else if numCredits = 2 then
> put 1002 into productID
> put "$1.99" into productAmount
> else if numCredits = 3 then
> put 1003 into productID
> put "$2.99" into productAmount
> else if numCredits = 11 then
> put 1011 into productID
> put "$9.99" into productAmount
> end if
>
> //confirm with user
> if numCredits = 1 then
> put "Are you sure you want to purchase 1 credit for" && productAmount
> & "?" into pString
> else
> put "Are you sure you want to purchase" && numCredits && "credits for"
> && productAmount & "?" into pString
> end if
> if myAnswer(pString,"Cancel|Buy Now","Purchase Confirmation","|appBlue")
> = "Cancel" then //my custom answer dialog
> exit startInAppPurchase
> end if
>
> //initiate the purchase
> mobileStoreEnablePurchaseUpdates
> mobileStoreSetProductType productID,"inapp"
> mobileStoreMakePurchase productID,"1","testPayload - Android Only"
> end startInAppPurchase
>
> on purchaseStateUpdate pPurchaseID,pProductID,pState
> global user
>
> switch pState
> case "paymentReceived"
> put mobilePurchaseGet(pPurchaseID,"receipt") into rawReciptData
>
> //tell our server is was sucessful and log users credits to database
> if isIPhone() then
> if db_validateAppleReceipt(rawReciptData) then
> add (pProductID-1000) to user["credits"]
> end if
> else
> //will add Android database call when ready
> end if
>
> mobileStoreConfirmPurchase pProductID //Inform the store that the
> purchase identifier productID was successfully delivered
> if isAndroid() then
> mobileStoreConsumePurchase pProductID. // <--- DOES NOT SEEM TO
> CONSUME THE PRODUCT !!
> end if
>
> mobileStoreDisablePurchaseUpdates
> loadMeUp //refresh our display
> break
> case "error"
> answer "Error occured during purchase handling:" & return & return &
> mobileStorePurchaseError(pPurchaseID)
> mobileStoreDisablePurchaseUpdates
> break
> case "invalidSKU"
> answer "Invalid SKU."
> mobileStoreDisablePurchaseUpdates
> break
> case "alreadyEntitled"
> answer "Already Owned."
> mobileStoreDisablePurchaseUpdates
> break
> case "restored"
> answer "restored"
> offerPurchasedProduct pProductID
> mobileStoreConfirmPurchase pProductID
> mobileStoreDisablePurchaseUpdates
>
> loadMeUp //refresh our display
> break
> case "canceled"
> case "cancelled"
> answer "Purchase Cancelled:" && pProductID
> mobileStoreDisablePurchaseUpdates
> break
> end switch
> end purchaseStateUpdate
>
>
>
> Do you see anything wonky in my code?
>
> --Dan
>
> From: use-livecode <use-livecode-bounces at lists.runrev.com> on behalf of
> Andrew at MidWest Coast Media via use-livecode <
> use-livecode at lists.runrev.com>
> Date: Tuesday, August 8, 2023 at 10:57 AM
> To: use-livecode at lists.runrev.com <use-livecode at lists.runrev.com>
> Cc: Andrew at MidWest Coast Media <andrew at midwestcoastmedia.com>
> Subject: Re: Consumable In App Purchases on Android
> If I’m consuming instantly, this is the code working in my Android/iOS
> project with comment lines explaining the values being passed in the
> Android build (note that the product ID values are more specific for
> Android than iOS):
>
> if tPlatform = "android" then
> put "com.midwestcoastmedia.dj3pm." into tProductIDbase
> else if tPlatform = "iPhone" then
> put EMPTY into tProductIDbase
> end if
> put tProductIDbase & pWhichProduct into tProductID
>
> mobileStoreEnablePurchaseUpdates
> ## mobileStoreSetProductType "com.midwestcoastmedia.dj3pm.tip01",
> "inapp"
> mobileStoreSetProductType tProductID, "inapp"
> ## mobileStoreMakePurchase "com.midwestcoastmedia.dj3pm.tip01", "1",
> "Thanks for the buck!"
> mobileStoreMakePurchase tProductID, "1", tMessage
> ## mobileStoreConsumePurchase "com.midwestcoastmedia.dj3pm.tip01"
> mobileStoreConsumePurchase tProductID
> put the result into tCatch
>
> BUT you’ll also need to implement the on purchaseStateUpdate handler to
> completely execute the purchase cycle. The lesson is sometimes hard to
> follow when Android changes their branding/naming but
> https://lessons.livecode.com/m/4069/l/184481-how-do-i-implement-in-app-purchases-in-livecode-google-play-store
> <
> https://lessons.livecode.com/m/4069/l/184481-how-do-i-implement-in-app-purchases-in-livecode-google-play-store>
> has a good example of this.
>
> —Andrew Bell
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
More information about the use-livecode
mailing list