一次性购买生命周期

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

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

新的一次性产品购买

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

收到新购买后,使用 getPurchaseState 方法或 Play Developer 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 方法获取最新的购买状态,然后相应地更新您的后端,包括用户权益。

如果在 Purchased 状态的一次性产品购买获得退款,您也会通过 作废购买 API 得知。

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

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

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

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

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