通过促销代码进行的应用内购买返回空的开发人员有效负载字符串

Posted

技术标签:

【中文标题】通过促销代码进行的应用内购买返回空的开发人员有效负载字符串【英文标题】:In-app purchases made via promo codes return empty developer payload string 【发布时间】:2016-04-30 23:37:30 【问题描述】:

我有一个发布到 Alpha 通道的应用,其中包含一个成本为 1 美元的应用内(非)托管项目。

当我正常购买时,即使用信用卡/借记卡时,Google 会返回正确的开发人员有效负载字符串,但如果我选择“兑换”促销代码并输入所述代码,Google 会返回一个空的开发人员有效负载字符串,因此'onIabPurchaseFinished()' 中的身份验证失败。

我应该提到,只有当我选择从应用的购买流程中兑换代码时才会发生这种情况,如果我先打开 Play 商店,兑换代码,然后再回来打开应用,一切都会完美无缺。

这是 Google 的错误吗?

编辑:Play 商店的事情是意料之中的,因为它无法知道您的有效负载,并且无需检查即可完成购买。

【问题讨论】:

如果我使用 Play 商店中的代码然后打开我的应用程序,我会得到一个空字符串。原因很明显,但它确实是一个大洞。 更新:Google 团队正在进行进一步调查。 @JérémyReynaud 如果代码在play store app内部使用,你的app根本不参与这个过程,所以你不会收到任何开发者payload是正常的,play store不能知道你的字符串。 @greywolf82 你是完全正确的。正如您在第一条评论中指出的那样,这是一个很大的漏洞,因为目前唯一的解决方案是避免在 getPurchases() 结果中检查开发人员有效负载,因为我们不知道购买是“正常”还是通过促销进行的? Google 可能会提供一种在开发者控制台中声明我们的开发者有效载荷的方法来解决这种情况,你不觉得吗? 关于 GitHub 上的 android-play-billing 项目已经打开了一个问题:github.com/googlesamples/android-play-billing/issues/7 【参考方案1】:

这个问题是在 google 的 android-play-billing 示例 repo 上打开的。 看起来它被忽略了很长时间,最终被this评论关闭。总之,他们有以下建议。


我们审查了我们的指南和内部 API,并且由于应用内结算 API 的所有功能(包括促销代码)不支持 developerPayload,我们将删除将其用作安全检查的建议。 em>

您可以在我们的文档中看到,在实施应用内结算 (https://developer.android.com/google/play/billing/billing_integrate.html) 页面上,我们添加了一项建议:

注意:请勿将 developerPayload 字段用于安全验证目的。完成与应用内结算相关的任务时,此字段并不总是可用。有关安全最佳实践的更多信息,请参阅应用内结算安全和设计指南。

我们的建议是使用 Play Developer API 在您自己的后端进行验证。


【讨论】:

感谢您的信息,我们必须使用“optString”方法将空字符串“”作为备用值返回:p.setPayload(data.optString("developerPayload"));跨度>

以上是关于通过促销代码进行的应用内购买返回空的开发人员有效负载字符串的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用内购买的促销代码

对应用商店的应用内购买促销有问题

应用内购买促销代码会破坏远程服务器验证?

进行应用内购买的用户的 UDID [关闭]

如何通过Apple TestFlight测试应用内购买?

我可以在 Flutter 中更改应用内购买的价格吗?