Consumable In App Purchases on Android

panagiotis m merakosp at gmail.com
Wed Aug 9 15:44:59 EDT 2023


Hello Dan,

Thanks for the update.

RE 1, I *think* yes, but I would suggest you double check this anyway.

RE 2, I would suggest not using mobilePurchaseGet(). This function is from
the older API for in-app purchases, and we have kept it for backwards
compatibility. I suggest using mobileStoreProductProperty (productID,
propertyName) instead. In fact, using mobileStoreProductProperty
(productID, "purchaseToken") is what you need in this use-case.

RE the lessons, yes, they could have been better. I'll add this to my
(long!) todo list :)

Kind regards,
Panos
--



On Wed, 9 Aug 2023 at 22:29, Dan Friedman via use-livecode <
use-livecode at lists.runrev.com> wrote:

> Panos and others…
>
> First, thank you for your assistance and advise with this.   Panos’
> suggestions were spot on!    Restoring the purchases, then calling
> mobileStoreConsumePurchase worked for consumption.   And, adding a
> “complete” case to purchaseStateUpdate and handeling the
> mobilePurchaseGet() as well as the mobileStoreConsumePurchase worked
> beautifully.   A couple of follow up questions…
>
> 1 - Does the “complete” case get returned with the Apple Store as well?
> 2 – Is there a way to get the purchase token from mobilePurchaseGet() on
> Android?   The “transactionIdentifier” returns the order number, not the
> purchase token.  The purchase token is needed to verify the purchase server
> side.
>
> Lastly, it would be terrific if the lesson on the LC website was updated
> to these options/methods.   It might save the next guy some grief.
>
> -Dan
>
>
> From: use-livecode <use-livecode-bounces at lists.runrev.com> on behalf of
> panagiotis m via use-livecode <use-livecode at lists.runrev.com>
> Date: Wednesday, August 9, 2023 at 7:51 AM
> To: How to use LiveCode <use-livecode at lists.runrev.com>
> Cc: panagiotis m <merakosp at gmail.com>
> Subject: Re: Consumable In App Purchases on Android
> Hello all,
>
> Also, it might be worth trying this as well - add a new button with this
> code:
>
> on mouseUp
>    mobileStoreEnablePurchaseUpdates
>    mobileStoreRestorePurchases
> end mouseUp
>
> Then press the button, and *then* call mobileStoreConsumePurchase
> pProductID .
> Hopefully now it should be properly consumed, and you should be able to buy
> it (and consume it) again.
>
> Cheers,
> Panos
> --
>
> On Wed, 9 Aug 2023 at 11:37, panagiotis m <merakosp at gmail.com> wrote:
>
> > 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
> ><
> https://lessons.livecode.com/m/4069/l/184481-how-do-i-implement-in-app-purchases-in-livecode-google-play-store%3e
> >
> >> 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
> >>
> >
> _______________________________________________
> 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
> _______________________________________________
> 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