在我的 Android 应用中查询应用内购买
Query InApp purchases within my Android app
我有一个 Android 应用,用户可以在其中购买 1 个应用内产品来解锁某些功能。
我已在以下位置广泛阅读了该指南:https://developer.android.com/google/play/billing/billing_library_overview#java
我了解,为了让用户购买 inapp 产品,我必须:
- 使用
querySkuDetailsAsync()
调用检索可用 SKU 列表(在本例中,我唯一的 1 个应用内产品)。这只是为了仔细检查用户的设备是否能够管理应用内产品。
- 如果 SKU 出现在上一次调用的结果中,则显示“购买”按钮(这意味着用户设备中的本地 Google Play 实例可以处理应用内产品)。
- 调用
launchBillingFlow()
传递我的应用程序产品的 SKU,以启动 Google 支付流程(Google UI,弹出窗口询问卡的详细信息等。 )
- 收听回调
onPurchasesUpdated()
以获取 return 代码(基本上是付款被拒绝、付款成功或付款取消)并采取相应行动。如果付款成功,请继续在本地(使用 Play 开发者的 RSA public 密钥的本地副本)或使用相同密钥在我的安全服务器上远程验证购买令牌签名。
- 解锁我的应用程序的付费功能
这就是事情变得混乱的地方。从 Google 文档的角度来看,工作已经完成,他们向您解释了如何 retrieve/purchase/and 验证用户付款。但是,没有任何地方解释如何在应用程序启动期间记住付款并解锁付费功能。
文档指出:
To retrieve information about purchases that a user makes from your
app, call the queryPurchases()
所以看起来应用程序不需要记住任何东西,只需在启动时调用 queryPurchases()
并检查 SKU 是否存在(用户已经支付)或不存在(用户还没有'我没有购买该应用程序的付费版本)。
所以我的应用程序就是这样做的,在启动时调用 queryPurchases()
并检查 SKU 是否存在。
这种方法非常有效,即使应用程序离线启动时也是如此。然而,一些用户抱怨有时应用程序无法在付费模式下启动,因为(我调试了代码)当设备离线时函数 queryPurchases()
失败(有时)。会不会是 queryPurchases()
正在调用本地 Google Play 缓存,这可能会由于某种原因而无法跟踪之前的购买记录? (缓存清除等...)
在应用程序启动时记住用户购买并启用付费功能的合适方法是什么?
它多久发生一次?我的看法是 Google Play 客户端负责缓存,因此如果您仅依赖此服务,则没有直接的方法来处理它。如果用户重新安装或更改他们的设备,这可能会造成麻烦。
另一种方法是构建您自己的后端,如果您想要发展您的应用程序,这将是必要的。
您可以使用 onPurchasesUpdated
的结果保留您自己的 "cache"(SharedPreferences 或数据库)并使用 queryPurchaseHistoryAsync
。当应用程序首次启动时,如果您的缓存告诉用户购买了产品并同时调用 queryPurchaseHistoryAsync
以获取用户为每个 SKU 进行的最新购买,则您可以显示付费内容,当 onPurchaseHistoryResponse
如果购买过期,您可以更新缓存并隐藏付费内容。
另请考虑,出于安全考虑,建议您在后端进行购买验证。
如果您不想管理自己的服务器,可能值得使用像 RevenueCat 这样的工具,它提供 purchase/subscription 后端即服务。
我有一个 Android 应用,用户可以在其中购买 1 个应用内产品来解锁某些功能。
我已在以下位置广泛阅读了该指南:https://developer.android.com/google/play/billing/billing_library_overview#java
我了解,为了让用户购买 inapp 产品,我必须:
- 使用
querySkuDetailsAsync()
调用检索可用 SKU 列表(在本例中,我唯一的 1 个应用内产品)。这只是为了仔细检查用户的设备是否能够管理应用内产品。 - 如果 SKU 出现在上一次调用的结果中,则显示“购买”按钮(这意味着用户设备中的本地 Google Play 实例可以处理应用内产品)。
- 调用
launchBillingFlow()
传递我的应用程序产品的 SKU,以启动 Google 支付流程(Google UI,弹出窗口询问卡的详细信息等。 ) - 收听回调
onPurchasesUpdated()
以获取 return 代码(基本上是付款被拒绝、付款成功或付款取消)并采取相应行动。如果付款成功,请继续在本地(使用 Play 开发者的 RSA public 密钥的本地副本)或使用相同密钥在我的安全服务器上远程验证购买令牌签名。 - 解锁我的应用程序的付费功能
这就是事情变得混乱的地方。从 Google 文档的角度来看,工作已经完成,他们向您解释了如何 retrieve/purchase/and 验证用户付款。但是,没有任何地方解释如何在应用程序启动期间记住付款并解锁付费功能。
文档指出:
To retrieve information about purchases that a user makes from your app, call the queryPurchases()
所以看起来应用程序不需要记住任何东西,只需在启动时调用 queryPurchases()
并检查 SKU 是否存在(用户已经支付)或不存在(用户还没有'我没有购买该应用程序的付费版本)。
所以我的应用程序就是这样做的,在启动时调用 queryPurchases()
并检查 SKU 是否存在。
这种方法非常有效,即使应用程序离线启动时也是如此。然而,一些用户抱怨有时应用程序无法在付费模式下启动,因为(我调试了代码)当设备离线时函数 queryPurchases()
失败(有时)。会不会是 queryPurchases()
正在调用本地 Google Play 缓存,这可能会由于某种原因而无法跟踪之前的购买记录? (缓存清除等...)
在应用程序启动时记住用户购买并启用付费功能的合适方法是什么?
它多久发生一次?我的看法是 Google Play 客户端负责缓存,因此如果您仅依赖此服务,则没有直接的方法来处理它。如果用户重新安装或更改他们的设备,这可能会造成麻烦。
另一种方法是构建您自己的后端,如果您想要发展您的应用程序,这将是必要的。
您可以使用 onPurchasesUpdated
的结果保留您自己的 "cache"(SharedPreferences 或数据库)并使用 queryPurchaseHistoryAsync
。当应用程序首次启动时,如果您的缓存告诉用户购买了产品并同时调用 queryPurchaseHistoryAsync
以获取用户为每个 SKU 进行的最新购买,则您可以显示付费内容,当 onPurchaseHistoryResponse
如果购买过期,您可以更新缓存并隐藏付费内容。
另请考虑,出于安全考虑,建议您在后端进行购买验证。
如果您不想管理自己的服务器,可能值得使用像 RevenueCat 这样的工具,它提供 purchase/subscription 后端即服务。