一次性购买产品的生命周期比订阅产品简单,但仍有几种状态和转换事件需要您的后端能够正确处理。
新的一次性产品购买
用户完成结算流程后,您的应用可以通过以下任一方式查看新购买的相关信息
- 设置
Real-time developer notifications
并启用Get all notifications for subscriptions and one-time products
,以接收购买状态的更新。 - 实现
BillingClient
的PurchasesUpdatedListener
接口,以自动接收购买更新。 - 调用
BillingClient.queryPurchasesAsync()
方法。
收到新购买后,使用 getPurchaseState
方法或 Play Developer API 中的 purchases.products.get
来确定新购买的付款状态。
实时开发者通知
当用户购买或取消购买一次性产品时,Google Play 会发送 OneTimeProductNotification
消息。要更新您的后端购买状态,请使用 OneTimeProductNotification
对象中提供的购买令牌调用 purchases.products.get
方法。此方法会根据购买令牌提供最新的购买和消耗状态。
您应该在安全的后端处理与交易相关的 RTDN。
处理已完成的交易
当用户完成一次性产品购买时,Google Play 会发送类型为 ONE_TIME_PRODUCT_PURCHASED
的 OneTimeProductNotification
消息。收到此 RTDN 后,按照在后端处理一次性产品购买中描述的方式处理购买。
处理已取消的交易
如果您配置了接收实时开发者通知,当一次性产品购买被取消时,Google Play 会发送类型为 ONE_TIME_PRODUCT_CANCELED
的 OneTimeProductNotification
消息。例如,如果用户未在规定时间内完成付款,或者购买被开发者或客户请求撤销,则可能会发生这种情况。当您的后端服务器收到此通知时,请调用 purchases.products.get
方法获取最新的购买状态,然后相应地更新您的后端,包括用户权益。
如果在 Purchased
状态的一次性产品购买获得退款,您也会通过 作废购买 API 得知。
在后端处理一次性产品购买
无论您是通过 ONE_TIME_PRODUCT_PURCHASED
RTDN 检测到新购买,还是通过应用的 onResume()
方法中的 PurchasesUpdatedListener
或手动获取购买在应用内得知,您都必须处理新购买。为了提高安全性,我们建议您在后端处理购买。
按照以下步骤处理新的一次性购买
- 查询
purchases.products.get
端点以获取最新的一次性产品购买状态。要为此购买调用此方法,您需要应用中或ONE_TIME_PRODUCT_PURCHASED
RTDN 中对应的purchaseToken
。 - 调用
getPurchaseState()
并确保购买状态为PURCHASED
。 - 验证购买.
- 授予用户对内容的访问权限。如果购买时使用
setObfuscatedAccountId()
设置了用户帐号,则可以使用purchases.products.get
中的obfuscatedExternalAccountId
字段识别与该购买相关联的用户帐号。- 对于非消耗性产品购买,请调用
purchases.products.acknowledge
方法来确认内容交付。通过检查acknowledgementState
字段,确保购买之前未被确认。 - 如果产品是消耗性的,请通过调用
purchases.products.consume
方法将商品标记为已消耗,以便用户在消耗后可以再次购买。此方法也会确认购买。
- 对于非消耗性产品购买,请调用
Play 结算库中也提供了购买确认和消耗方法,允许您在应用中处理购买,但如果您有后端,我们建议您在后端处理购买,以获得更安全的实现。