一次性购买生命周期

相较于订阅商品,一次性购买商品的生命周期更为简单,但您的后端仍然需要能够妥善处理多种状态和转换事件。

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

新的一次性商品购买交易

用户完成结算流程后,您的应用可以通过以下任一方式查看新购买交易的相关信息:

收到新购买交易后,请使用 getPurchaseState 方法或 purchases.products.get in Play Developer API 确定新购买交易的付款状态。

实时开发者通知

当用户购买或取消购买一次性商品时,Google Play 会发送 OneTimeProductNotification 消息。如需更新后端购买交易状态,请使用 OneTimeProductNotification 对象中提供的购买令牌调用 purchases.products.get 方法。此方法可提供指定购买令牌的最新购买和消费状态。

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

处理已完成的交易

当用户完成一次性商品购买交易时,Google Play 会发送一条类型为 ONE_TIME_PRODUCT_PURCHASEDOneTimeProductNotification 消息。收到此 RTDN 后,请按照在后端处理一次性商品购买交易中所述的方式处理购买交易。

处理已取消的交易

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

如果处于 Purchased 状态的一次性商品购买交易发生退款,您也会通过 Voided Purchases API 获知。

在后端处理一次性商品购买交易

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

如要处理新的一次性购买交易,请按以下步骤操作:

  1. 查询 purchases.products.get 端点,以获取最新的一次性商品购买交易状态。如需为购买交易调用此方法,您需要从应用或 ONE_TIME_PRODUCT_PURCHASED RTDN 中获取相应的 purchaseToken
  2. 调用 getPurchaseState(),并确保购买交易状态为 PURCHASED
  3. 验证购买交易
  4. 授予用户对相应内容的访问权限。如要确认与购买交易相关联的用户账号,您可以使用 purchases.products.get 中的 obfuscatedExternalAccountId 字段(如果在交易时已使用 setObfuscatedAccountId() 设置该账号)。
    1. 对于非消耗型商品购买交易,请调用 purchases.products.acknowledge 方法来确认内容已传送给用户。请确保购买交易尚未确认,方法是查看 acknowledgementState 字段。
    2. 如果商品是消耗型商品,请调用 purchases.products.consume 方法将商品标记为已消耗,以便用户在消耗掉商品后可以再次购买该商品。此方法也能确认购买交易。

Play 结算库中还提供了购买交易确认和消耗方法,可让您通过应用处理购买交易,但如果您可以在后端进行处理,我们建议您采用这种更安全的实现方法。