一次性购买生命周期

一次性购买产品的生命周期比订阅产品简单,但您的后端仍需要能够正确处理多个状态和转换事件。

图 1 一次性购买的生命周期状态和转换事件。

新的一次性产品购买

用户完成计费流程后,您的应用可以通过以下几种方式之一查看有关新购买的信息

收到新购买后,使用 getPurchaseState 方法或 Play 开发者 API 中的 purchases.products.get 来确定新购买的付款状态。

实时开发者通知

当用户购买或取消一次性产品的购买时,Google Play 会发送 OneTimeProductNotification 消息。要更新您的后端购买状态,请使用 OneTimeProductNotification 对象中提供的购买令牌来调用 purchases.products.get 方法。此方法根据购买令牌提供最新的购买和消费状态。

您应该在安全的后台处理与交易相关的 RTDN。

处理已完成的交易

当用户完成一次性产品购买时,Google Play 会发送类型为 ONE_TIME_PRODUCT_PURCHASEDOneTimeProductNotification 消息。当您收到此 RTDN 时,请按照 在您的后端处理一次性产品购买 中的说明处理购买。

处理已取消的交易

如果已配置为接收实时开发者通知,则当一次性产品购买被取消时,Google Play 会发送类型为 ONE_TIME_PRODUCT_CANCELEDOneTimeProductNotification 消息。例如,如果用户未在规定时间内完成付款,或者购买被开发者或客户请求撤销,则可能会发生这种情况。当您的后端服务器收到此通知时,请调用 purchases.products.get 方法以获取最新的购买状态,然后相应地更新您的后端,包括用户权限。

如果处于 已购买状态的一次性产品购买获得退款,您还将通过 已作废的购买 API 获知。

在您的后端处理一次性产品购买

无论您是通过 ONE_TIME_PRODUCT_PURCHASED RTDN 检测到新购买,还是通过 PurchasesUpdatedListener 或在应用的 onResume() 方法中 手动获取购买 在应用内获知,您都必须处理新购买。我们建议您在后端处理购买处理,以提高安全性。

请按照以下步骤处理新的一次性购买

  1. 查询purchases.products.get端点以获取最新的单次购买产品状态。要为购买调用此方法,您需要相应的purchaseToken,该令牌可以从您的应用或ONE_TIME_PRODUCT_PURCHASED RTDN 中获取。
  2. 调用getPurchaseState()并确保购买状态为PURCHASED
  3. 验证购买.
  4. 授予用户访问内容的权限。与购买关联的用户帐户可以通过obfuscatedExternalAccountId字段(来自purchases.products.get)进行识别,如果在进行购买时使用setObfuscatedAccountId()设置了此字段。
    1. 对于非消耗性产品的购买,请通过调用purchases.products.acknowledge方法确认内容已交付。请确保通过检查acknowledgementState字段来确认购买尚未被确认。
    2. 如果产品是消耗性的,请通过调用purchases.products.consume方法将商品标记为已消耗,以便用户在消耗商品后可以再次购买。此方法还会确认购买。

Play Billing 库中也提供了购买确认和消耗方法,允许您从应用中处理购买,但我们建议您在有后端的情况下在后端处理,以获得更安全的实现。