I'm developing an app using Unity (for Android and iOS). I'm using the SOOMLA plugin to allow users to purchase Gems (virtual currency) with In App Purchase.
Users and Gems and all other game logic go through my server on Azure.
I want the following procedure to take place as a single transaction in some way:
- User buys Gems with IAP
- App notifies server
- Server validates the purchase and updates data
But if the internet connection breaks down between step 1 and step 2 - the user payed for Gems that he did not receive (not good!)
So my current approach is this:
- User initiates a purchase
- App notifies the server
- Server blindly updates data accordingly
- User buys Gems with IAP
- If the purchase is cancelled, notify server to undo it
That way, the user is guaranteed to get his purchased Gems, but I am not guaranteed to get paid (not great...)
Note: I don't want to manage user Gems in the store itself. I want everything on my own server. So the SOOMLA's balance is meaningless to me. I don't care for it.
I was thinking maybe the app can store the purchase data in persistent storage until it manages to notify the server about it, and then delete it. But I was also thinking that this might be a bad solution. Hence this question.
I imagine the best solution as something that will properly handle this scenario:
- User buys Gems with IAP
- IAP succeeds
- Internet breaks down
- My own server isn't notified
- User uninstalls app from his device
User may then install the app on other devices:
- Either he was charged and he got the gems by some magic
- Or he was refunded automatically, since the gems were not received
So far it seems like this is impossible by any means, which makes me disappointed with the technology of IAP's. Hoping for answers that will prove me wrong.
Seems like all I'd ever need is the ability get a user's purchase history from my server, with a secured request to Google Play or Apple Store. But that's just not part of the framework.
So what are others doing? What is the best approach?