Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

In-app Billing API

利用 In-app Billing Version 3 API,您可以更轻松地将应用内购买结算功能集成到自己的应用中。 此版本中的功能包括改进的同步购买流程、让您能够轻松跟踪消耗型商品所有权的 API,以及本地缓存应用内购买数据。

商品类型

您可以使用 Google Play Developer Console 定义商品,包括商品类型、SKU、价格、说明,等等。 如需了解详细信息,请参阅管理应用内购买结算。 Version 3 API 支持托管的应用内商品和订阅。

托管的应用内商品

托管的应用内商品是指由 Google Play 跟踪和管理其所有权信息的商品。 当用户购买托管的应用内商品时,Google Play 会针对每位用户存储各个商品的购买信息。 这让您可以日后随时在 Google Play 中查询,恢复特定用户购买的商品的状态。 即使用户卸载应用或更换设备,这类信息也会永久保存在 Google Play 服务器上。

如果您使用的是 Version 3 API,还可以在应用内消耗托管的商品。 通常情况下,您可以对那些可供多次购买的商品(例如游戏中使用的货币、燃料或魔法药)实现消耗。 托管的商品在被购买后,必须先向 Google Play 发送消耗请求进行消耗,然后才能供用户再次购买。 如需了解有关应用内商品消耗的更多信息,请参阅消耗商品

订阅

订阅是应用内购买结算中提供的一种商品类型,利用订阅,您可以通过自己的应用出售内容、服务或功能,并按年或按月定期向用户收费。 您可以从任意类型的应用或游戏出售对几乎任意类型数字内容的订阅。 要了解订阅的工作原理,请参阅应用内购买结算订阅

利用 Version 3 API,您可以使用与应用内商品相同的购买流程购买订阅和检索订阅购买信息。 有关代码示例,请参阅实现订阅

重要说明:与应用内商品不同,订阅无法消耗。

购买商品

图 1. 购买请求的基本顺序。

Version 3 API 中的典型购买流程如下所示:

  1. 您的应用向 Google Play 发送 isBillingSupported 请求,以确定您当前使用的 In-app Billing API 目标版本是否受支持。
  2. 当您的应用启动或用户登录时,最好向 Google Play 进行查询,确定该用户拥有哪些商品。 要查询用户的应用内购买,请发送 getPurchases 请求。 如果请求成功,Google Play 会返回一个 Bundle,其中包含所购商品的商品 ID 列表、各项购买详情的列表以及购买签名的列表。
  3. 通常情况下,您需要将可供购买的商品通知用户。 要查询您在 Google Play 中定义的应用内商品的详细信息,应用可以发送 getSkuDetails 请求。 您必须在查询请求中指定商品 ID 列表。如果该请求成功,Google Play 会返回一个包含产品详情(包括商品的价格、标题、说明和购买类型)的 Bundle
  4. 如果用户还未拥有某种应用内商品,您可以提示购买。 为了发起购买请求,您的应用会发送 getBuyIntent 请求,指定要购买商品的商品 ID 以及其他参数。 当您在 Developer Console 中创建新的应用内商品时,应记录其商品 ID。
    1. Google Play 返回的 Bundle 中包含 PendingIntent,您的应用可用它来启动购买结账 UI。
    2. 您的应用通过调用 startIntentSenderForResult 方法启动待定 Intent。
    3. 结账流程结束后(即用户成功购买商品或取消购买),Google Play 会向您的 onActivityResult 方法发送响应 IntentonActivityResult 的结果代码中有一个代码将用于表明购买是成功还是已取消。 响应 Intent 中包含所购商品的相关信息,包括 Google Play 为了对此次购买交易进行唯一标识而生成的 purchaseToken 字符串。 Intent 中还包含使用您的开发者私钥签署的购买签名。

要详细了解 Version 3 API 的调用和服务器响应,请参阅应用内购买结算参考

消耗应用内商品

您可以使用消耗机制跟踪用户对应用内商品的所有权。

在版本 3 中,所有应用内商品均是托管的。这意味着用户对所购全部应用内商品的所有权均由 Google Play 进行维护,您的应用可以在需要时查询用户的购买信息。 当用户成功购买应用内商品后,此次购买就会记录在 Google Play 中。 应用内商品一经购买,就会被视为“被拥有”。 状态为“被拥有”的应用内商品无法再通过 Google Play 购买。 您必须对“被拥有”的应用内商品发送消耗请求,然后 Google Play 才能允许再次购买。 消耗应用内商品会将商品切换回“未被拥有”状态,并舍弃之前的购买数据。

图 2. 消耗请求的基本顺序。

为了检索用户所拥有的商品列表,您的应用会向 Google Play 发送 getPurchases 调用。 您的应用可以通过发送 consumePurchase 调用发起消耗请求。 在请求参数中,您必须指定应用内商品的唯一 purchaseToken 字符串,此字符串在商品售出时由 Google Play 指定。 Google Play 会返回一个状态代码,指明此次消耗是否已成功记录。

非消耗型和消耗型应用内商品

您需要决定是要将您的应用内商品作为非消耗型商品还是消耗型商品进行处理。

非消耗型商品
通常情况下,对于在应用内购买一次就能永久使用的应用内商品,您无需实现消耗。 这些商品在购买后将永久与用户的 Google 帐户相关联。 高级版升级和关卡包就属于非消耗型应用内商品。
消耗型商品
相反,对于可多次购买的商品,您可以实现消耗。 通常情况下,这类商品提供某些临时效果。 例如,用户在游戏中的角色可以从自己的库存中获得生命值或额外的金币。 在您的应用中分配所购商品的收益或效果称为配置应用内商品。 您负责控制和跟踪如何向用户配置应用内商品。

重要说明:您必须先向 Google Play 发送消耗请求,在收到表明此次消耗已成功记录的响应之后,才能在应用中配置消耗型应用内商品。

在应用中管理消耗型商品购买

下面是购买消耗型应用内商品的基本流程:

  1. 调用 getBuyIntent 启动购买流程。
  2. 从 Google Play 接收表明购买是否成功完成的响应 Bundle
  3. 如果购买成功,则通过调用 consumePurchase 消耗购买。
  4. 从 Google Play 接收表明消耗是否成功完成的响应代码。
  5. 如果消耗成功,则在您的应用中配置商品。

之后,当用户启动或登录到您的应用时,您应检查该用户是否拥有任何尚未消耗的消耗型应用内商品;如果有,请务必消耗并配置这些商品。 如果您在应用中实现消耗型应用内商品,则可以采用下面推荐的应用启动流程:

  1. 发送 getPurchases 请求,查询此用户拥有的应用内商品。
  2. 如果有任何消耗型应用内商品,请通过调用 consumePurchase 消耗这些商品。 必须执行这步操作,因为应用虽然可能已完成此消耗型商品的购买订单,但在其发送消耗请求之前仍有可能已停止运行或断开连接。
  3. 从 Google Play 接收表明消耗是否成功完成的响应代码。
  4. 如果消耗成功,则在您的应用中配置商品。

本地缓存

目前,由于 Google Play 客户端在设备上本地缓存应用内购买结算信息,您可以使用 Version 3 API 更频繁地查询此类信息,例如通过调用 getPurchases 进行查询。 与旧版本的 API 不同,Version 3 API 的很多调用都是在缓存中进行查找,而不用通过网络连接到 Google Play,这样就显著加快了 API 的响应速度。