我正在使用Unity(适用于Android和iOS)开发应用程序.我正在使用SOOMLA插件允许用户通过In App Purchase购买Gems(虚拟货币).
用户和Gems以及所有其他游戏逻辑都通过Azure上的服务器.
我希望以下过程以某种方式作为单个事务发生:
但是如果互联网连接在步骤1和步骤2之间发生故障 - 用户付钱给他没有收到的宝石(不好!)
所以我目前的做法是这样的:
这样,用户可以保证购买他购买的宝石,但我不能保证得到报酬(不是很好......)
注意: 我不想在商店本身管理用户Gems.我希望我自己的服务器上的一切.所以SOOMLA的平衡对我来说毫无意义.我不在乎.
我想也许应用程序可以将购买数据存储在持久存储中,直到它设法通知服务器有关它,然后删除它.但我也认为这可能是一个糟糕的解决方案.因此这个问题.
我认为最好的解决方案可以正确处理这种情况:
然后,用户可以在其他设备上安装该应用:
到目前为止,似乎无论如何这都是不可能的,这让我对IAP的技术感到失望.希望找到能证明我错误的答案.
似乎我所需要的只是能够从我的服务器获取用户的购买历史记录,并向Google Play或Apple Store提供安全请求.但这不是框架的一部分.
那么其他人在做什么?什么是最好的方法?
我现在真的搞砸了理解需求的概念和原因,甚至不知道如何通过编码来实现.
所以,我用团结制作手机游戏,c#.使用php,mysql进行高分,并在应用程序购买项目信息中存储用户.
我一周前在google play上发布了我的游戏,我的谷歌钱包显示没有人,直到现在购买该游戏中的任何项目.
但是,当我检查我的游戏服务器(mysql数据库)时,一些用户有大量应该购买的项目.
这意味着一些用户使用黑客工具并绕过谷歌游戏检查过程并欺骗我的游戏并进行假购买.
所以我没有实现developerPayload,也没有验证google play购买收据.
所以现在我删除了我的数据库中的整个恶意用户的项目(这将设置0到该用户的客户端项目),并且想要实现google play购买收据的服务器端验证.
我通过谷歌搜索搜索了许多帖子,但从头到尾没有完美的解决方案.
无论如何,我到目前为止实现了这样的.
首先,在用户结束谷歌结账过程(无论这是真的还是假的)之后,我的Unity客户端的OnPurchaseSucceded函数被调用,在那里我实现了开始在我的服务器上传递我的PHP脚本.
private void OnPurchaseSucceded(Purchase purchase)
{
/*
// Optional verification of the payload. Can be moved to a custom server
if (!VerifyDeveloperPayload(purchase.DeveloperPayload)) {
return;
}*/
StartCoroutine(VerifyReceiptCo(purchase));
}
IEnumerator VerifyReceiptCo(Purchase purchase)
{
WWWForm hsFm = new WWWForm();
hsFm.AddField("data", purchase.OriginalJson);
hsFm.AddField("signature", purchase.Signature);
WWW hs = new WWW(verifyURL, hsFm);
yield return hs;
Debug.Log("verify result is " + hs.text);
// if result is true(validated), give item to user.
}
Run Code Online (Sandbox Code Playgroud)
在这里问题,
1. [我在代码上方做得对吗?对于"数据"字段,我使用了buy.OriginalJson,但这是对的吗?如果没有,我该怎么用?] …