一次性购买生命周期

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

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

新的一次性商品购买交易

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

收到新的购买交易后,请使用 getPurchaseState 方法或 purchases.productsv2.getproductpurchasev2 in Play Developer API

确定新购买交易的付款状态。

实时开发者通知

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

当预订商品完成配送且其购买状态更改为 PURCHASED 时,系统会向您的客户端发送 RTDN。收到 RTDN 后,请按照在后端处理一次性商品购买交易中所述的方式处理预订购买交易。

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

处理已完成的交易

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

处理已取消的交易

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

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

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

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

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

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

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