我正处于完成我的第一个应用程序的边缘,剩下的最后一件事就是实现IAP计费,这就是为什么我目前正在阅读相关主题(包括加密,混淆和东西等安全问题).
我的应用程序是免费版本,能够通过IAP升级到完整版本,因此只有一个托管购买项目"溢价".我有几个问题:
在Google IAP API示例(trivialdrivesample)中,总是在MainActivity中检查IAP以查看用户是否购买了高级版本,通过
mHelper.queryInventoryAsync(mGotInventoryListener);
我的第一个问题:这是否意味着用户始终需要在应用启动时拥有互联网/数据连接,才能切换到高级版本?如果用户没有互联网连接怎么办?他会选择我猜的精简版,我觉得这很烦人.
所以我想到了如何在SharedPrefs或app数据库中本地保存isPremium状态.现在,我知道你无法阻止黑客对应用程序进行逆向工程,无论如何,即便如此,因为我没有服务器来进行服务器端验证.
然而,一个人根本无法在某处保存"isPremium"标志,因为这太容易被发现.
所以我在考虑这样的事情:
- 用户购买Premium
- 应用程序获取IMEI/Device-ID,XOR使用硬编码的String键对其进行编码,并将其保存在应用程序数据库中.
现在,当用户再次启动应用程序时:
- App从数据库中获取编码的String,对其进行解码并检查decodeString == IMEI.如果是 - >溢价
- 如果不是,则将调用正常的queryInventoryAsync以查看用户是否购买了premium.
您如何看待这种方法?我知道这不是超级固定,但对我而言,更重要的是用户不会烦恼(比如强制性的互联网连接),而不是应用程序将无法解决(无论如何这是不可能的).你有其他一些提示吗?
另一件事,我目前还不知道,是当用户卸载/重新安装应用程序时如何恢复事务状态.我知道API有一些机制,并且我的数据库可以通过应用程序导出和导入(因此编码的isPremium标志也可以导出/导入).好吧,我猜这将是另一个问题,当时机成熟时;-)
对这种方法的任何想法和评论都是受欢迎的,您认为这是一个很好的解决方案吗?或者我错过了什么/朝着错误的方向前进?
我面临的问题完全相同
它并不总是发生.您需要将手机切换到飞行模式,或关闭wifi,等待几个小时,只会出现问题.将显示以下错误消息.
无法查询iventory:IabResult:刷新iventory时出错(查询商品价格).(回复:6:错误)
作者建议使用
List<String> skulist = new ArrayList<String>();
skulist.add("my_sku_name1");
skulist.add("my_sku_name2");
mHelper.queryInventoryAsync(true, skulist, mGotInventoryListener);
Run Code Online (Sandbox Code Playgroud)
解决问题.
但是,它对我不起作用.同样的问题仍然存在.
有关此问题的任何解决方法吗?谢谢.
我有一个免费下载Android应用程序,它附带应用程序内购买项目(非消耗品)
最近,我发现几个黑市都带有我的Android应用程序,所有应用内购买项目都可以自由访问.
我在想,这些饼干是怎么做到的?这就是我在我身边所做的.
onCreate会触发updateIsPremium.代码如下
private void updateIsPremium() {
if (mHelper != null) {
return;
}
/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
* (that you got from the Google Play developer console). This is not your
* developer public key, it's the *app-specific* public key.
*
* Instead of just storing the entire literal string here embedded in the
* program, construct the key at runtime from pieces or
* use bit manipulation …Run Code Online (Sandbox Code Playgroud)