我正在使用 Unity 开发一个应用程序(适用于 Android 和 iOS)。我正在使用 SOOMLA 插件来允许用户通过 In App Purchase 购买 Gems(虚拟货币)。
用户和宝石以及所有其他游戏逻辑都通过我在 Azure 上的服务器。
我希望以某种方式将以下过程作为单个事务进行:
- 用户通过 IAP 购买宝石
- 应用程序通知服务器
- 服务器验证购买并更新数据
但是,如果互联网连接在第 1 步和第 2 步之间中断 - 用户支付了他没有收到的宝石(不好!)
所以我目前的做法是这样的:
- 用户发起购买
- 应用通知服务器
- 服务器相应地盲目更新数据
- 用户通过 IAP 购买宝石
- 如果购买被取消,通知服务器撤消
这样,用户可以保证得到他购买的宝石,但我不能保证得到报酬(不是很好......)
注意: 我不想在商店本身管理用户 Gems。我希望一切都在我自己的服务器上。所以 SOOMLA 的平衡对我来说毫无意义。我不在乎。
我在想也许该应用程序可以将购买数据存储在持久存储中,直到它设法通知服务器,然后将其删除。但我也认为这可能是一个糟糕的解决方案。因此这个问题。
我认为最好的解决方案可以正确处理这种情况:
- 用户通过 IAP 购买宝石
- IAP 成功
- 互联网崩溃了
- 我自己的服务器没有收到通知
- 用户从他的设备上卸载应用程序
然后用户可以在其他设备上安装该应用程序:
- 要么他被指控,要么他通过某种魔法得到了宝石
- 或者他被自动退款,因为没有收到宝石
到目前为止,这似乎无论如何都是不可能的,这让我对 IAP 的技术感到失望。希望能证明我错的答案。
似乎我所需要的只是能够从我的服务器获取用户的购买历史记录,并通过对 Google Play 或 Apple Store 的安全请求。但这不是框架的一部分。
那么其他人在做什么呢?最好的方法是什么?