相较于订阅商品,一次性购买商品的生命周期更为简单,但您的后端仍然需要能够妥善处理多种状态和转换事件。
新的一次性商品购买交易
用户完成结算流程后,您的应用可以通过以下任一方式查看新购买交易的相关信息:
- 设置
Real-time developer notifications
并启用Get all notifications for subscriptions and one-time products
以接收关于购买交易状态的更新信息。 - 实现
BillingClient
中的PurchasesUpdatedListener
界面,以自动接收购买交易更新。 - 调用
BillingClient.queryPurchasesAsync()
方法。
收到新购买交易后,请使用 getPurchaseState
方法或 purchases.products.get in Play Developer API
确定新购买交易的付款状态。
实时开发者通知
当用户购买或取消购买一次性商品时,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
状态的一次性商品购买交易发生退款,您也会通过 Voided Purchases API 获知。
在后端处理一次性商品购买交易
无论您是通过 ONE_TIME_PRODUCT_PURCHASED
RTDN 检测新的购买交易,通过 PurchasesUpdatedListener
获知应用内购买交易,还是在应用内以 onResume()
方法手动提取购买交易,您都必须处理新的购买交易。我们建议您在后端处理购买交易,以提高安全性。
如要处理新的一次性购买交易,请按以下步骤操作:
- 查询
purchases.products.get
端点,以获取最新的一次性商品购买交易状态。如需为购买交易调用此方法,您需要从应用或ONE_TIME_PRODUCT_PURCHASED
RTDN 中获取相应的purchaseToken
。 - 调用
getPurchaseState()
,并确保购买交易状态为PURCHASED
。 - 验证购买交易。
- 授予用户对相应内容的访问权限。如要确认与购买交易相关联的用户账号,您可以使用
purchases.products.get
中的obfuscatedExternalAccountId
字段(如果在交易时已使用setObfuscatedAccountId()
设置该账号)。- 对于非消耗型商品购买交易,请调用
purchases.products.acknowledge
方法来确认内容已传送给用户。请确保购买交易尚未确认,方法是查看acknowledgementState
字段。 - 如果商品是消耗型商品,请调用
purchases.products.consume
方法将商品标记为已消耗,以便用户在消耗掉商品后可以再次购买该商品。此方法也能确认购买交易。
- 对于非消耗型商品购买交易,请调用
Play 结算库中还提供了购买交易确认和消耗方法,可让您通过应用处理购买交易,但如果您可以在后端进行处理,我们建议您采用这种更安全的实现方法。