Android In-App Purchase 离线检查买家
Posted
技术标签:
【中文标题】Android In-App Purchase 离线检查买家【英文标题】:Android In-App Purchase check buyer offline 【发布时间】:2014-02-12 04:22:34 【问题描述】:当用户想要购买商品时,我已经在我的应用程序中使用计费服务实现了应用内购买(托管),即使用户已经购买了该商品,他也会提出需要互联网的购买请求。因此,为了方便用户,我这样做是如果用户购买了该项目,那么一个值将保存在共享首选项中。并且当用户单击该特定项目时,第一次它将检查共享首选项。用户是否购买了商品的价值,如果没有,则进行购买请求,否则显示他/她的商品。 我的问题是这是安全的方式吗?还是我必须做点别的?
【问题讨论】:
【参考方案1】:这不安全。我不鼓励您以这种方式实施此类检查。您应该采用标准方法并使用getPurchases() 方法。您可以随时(甚至离线)调用此方法,如果用户购买了商品,将从该方法返回。这是一个示例代码:
IInAppBillingService service; // initialize it first
Bundle response = service.getPurchases(3, "you app package", "inapp", null);
int responseCode = response.getInt(KEY_RESPONSE_CODE);
if (responseCode == RESPONSE_OK)
ArrayList<String> purchases = response.getStringArrayList(KEY_INAPP_PURCHASE_ITEM_LIST);
...
当然,您需要验证购买是否使用正确的证书签名并且购买状态未被取消。但这比将数据存储在共享属性中要安全得多。这种方法的另一个优点是,在用户重新安装应用后,所有购买也将自动在那里可用。
【讨论】:
“你可以随时调用这个方法(甚至离线)”---它怎么会起作用? 你能解释一下这些常量是什么吗?如果您不定义它们,而它们只是在 IDE 中显示为红色错误,则没有多大帮助。 好吧,我想通了。我弄清楚了为什么将这些变量放入字符串中并不能直接起作用(并将 RESPONSE_OK 替换为零)。您需要取下它前面的KEY_。因此,它应该是 RESPONSE_CODE 和 INAPP_PURCHASE_ITEM_LIST。不知道为什么你有 KEY_ ,除非那些是你自己定义的 String 变量,具有我刚才提到的值,这让每个人都感到困惑。【参考方案2】:此技术的完整示例在 TrivialDrive 示例应用程序中,它对我有用,但我正在考虑离线案例。 Google Play 应用缓存购买并离线响应 getPurchases(3, "pkg", "inapp", null) 但这是无限工作还是此缓存有类似超时的情况...
【讨论】:
我尝试使用 ionic2 inapp 插件。它可以离线工作,但是当我重新启动设备时,它会出现连接错误!这意味着缓存有一些限制!以上是关于Android In-App Purchase 离线检查买家的主要内容,如果未能解决你的问题,请参考以下文章
About In-App Purchase - 关于应用程序内购买
iOS 14 In-App Purchase 请求登录/验证两次
我被迫使用Apple In-App Purchase API
iOS的in-app purchase C#服务器二次验证实现