一、前言
Google结算库是Google官方提供的Google 支付库,在这之前,需要集成Google内购功能,都是使用 AIDL 的方式调用Google Play,AIDL 方式的调用存在许多问题,容易出现闪退,且此种方式已经长期没有更新。另外,Google也提出废弃 AIDL 方式集成,并给出了必须更新的时间节点(从 2021 年 8 月 2 日起,所有新应用都必须使用结算库版本 3 或更高版本。截至 2021 年 11 月 1 日,对现有应用的所有更新都必须使用结算库版本 3 或更新版本。(2025年3月3 日更新更新,各位开发者严格按照Google官方文档要求,尽量将Google内购库升级到最新版本,避免不必要的政策麻烦。))。无论你是直接集成新的 Google 结算库,还是从原来 AIDL 方式升级,其中的某些坑,必须注意。
关于Google 结算库的更多详情,请参考:Google Play结算系统
二、踩过的那些坑
2.1 处理购买交易时必须先检查购买状态
大多数情况下,会在 PurchasesUpdatedListener
监听中回调购买结果(onPurchasesUpdated()
回调方法返回),在少数情况下需要在 BillingClient.queryPurchases()
查询购买交易。但是无论何种方式获取到的购买交易,在处理时必须通过 Purchase.getPurchaseState()
获取这笔购买交易当前的状态,才能进行下一步处理。更多细节和案例请阅读下面章节。
2.2 确认购买必须针对状态为成功的购买
2.3 确认购买操作只针对非消耗型商品
2.4 处理待处理的购买交易
2.2 确认购买必须针对状态为成功的购买
确认购买交易这个概念是在 Google 结算库 3.0 版本开始才有的,2.0及之前的版本是没有这个概念的。如果成功的购买交易在三天内未确认,用户会自动收到退款,并且 Google Play 会撤消该购买交易。
2025年3月3 日更新:
注意事项:在较早的版本,确认购买操作可以针对消耗型商品,但是在较新版本的内购库中,确认操作只针对非消耗型商品,这个在跟新内购库的版本时,需要特备注意。对于消耗型的商品,无需手动确认,因为在订单校验完成发货后需要消耗商品,消耗操作就会自动确认。
2.3 确认购买操作只针对非消耗型商品
2024年1月12日更新
在Google的官方文档中,现将商品分为消耗型和非消耗型,确认购买的操作只针对非消耗型商品即可,所谓的非消耗型商品,就是用户购买之后将一直持有,无需再次购买(例如:付费使用的应用激活码),为了防止用户再次购买,将不会进行消耗(这样用户就无法再次购买此商品)。但是Google针对没有消耗的订单,会在3个工作日之后自动退款,因此,针对非消耗型的订单,必须在购买成功后,对购买进行确认。而对于消耗型商品,消耗操作,就相当于确认了购买。
注意事项:Google支付在部分地区会支持第三方支付(例如payPal),针对这写第三方支付,确认操作需要向第三方确认,因此确认操作结果可能不会回调,笔者用v6.0.1版本的内购库遇到这种情况,笔者认为这是内购库的BUG,不应当没有结果回调(哪怕回调个确认失败或者状态未知)。因此针对非消耗型的商品,要加大重试的频率,提升用户体验。如果用于游戏,购买的商品都是消耗型的,就无需添加确认购买的逻辑,发货成功之后,走消耗流程即可。
2.4 处理待处理的购买交易
处理的购买交易即状态为 Purchase.PurchaseState.PENDING
的购买交易。这种交易是因为用户在发起购买到购买交易付款方式得到处理期间,经过了一个或者多个额外的步骤。在这个过程中,Google在成功扣款前,这笔购买交易将会处于待处理状态,您的应用不应该对这类型的交易进行处理。
那么大家肯定很困惑为什么会有这个状态的购买交易。在你初始化内购库的过程中,调用了 enablePendingPurchases()
接口启用了改功能。因为 Google 结算库 3.0 开始支持现金结算,也就是用户可以拿现金或者信用卡到第三方进行支付,Google 从第三方进行扣款(第三方可以是便利店,比如我们熟知的全家、Seven Eleven 等等)。在 Google 未返回成功状态之前,这笔购买交易都是出于待处理的状态,直到 Google 成功从第三方扣款并返回成功标识之前,查询将返回待处理状态。
注意:只有出于
PURCHASED
状态的购买交易才能确认,当购买交易处于PENDING
状态时,不能确认。当购买状态从PENDING
转换为PURCHASED
时,确认倒计时三天期限才会开始。如果将非PURCHASED
状态的购买交易进行确认,这笔购买交易在后续查询将会永远为非PURCHASED
状态,导致掉单将不可避免。
- Google结算使用第三方支付的流程
说明:第三方支付完成后,客户端都会收到通知,针对客户端来说,这个支付流程已经完成(但是这笔购买交易并未完成)。
2.5 处理透传字段
在使用 AIDL 方式的内购中,开发者可以通过 developerPayload
字段传入,这个字段内容还算比较宽裕,能存储512个字符,开发者可以在里面存放订单的额外数据信息,方便后续订单校验时使用。但是使用 Google 结算库 之后,并没有这个字段。直到结算库 3.0 版本开始,才可以通过 BillingFlowParams.Builder.setObfuscatedAccountId()
和 BillingFlowParams.Builder.setObfuscatedProfileId()
这两个接口设置订单额外数据,而且这两个字段存储的数据不能超过64个字符。因此,使用 Google 结算库时,还应该合理使用这两个字段。
建议:可以在
BillingFlowParams.Builder.setObfuscatedAccountId()
传入应用的用户id,BillingFlowParams.Builder.setObfuscatedProfileId()
传入应用的订单id,这样在支付成功后获取到的购买交易信息中,这两个信息就可以对应到相应的订单。
2.6 推荐购买功能的巨坑
2025年3月3 日更新
在2024年底,Google出了一个推荐购买的功能,Google Play开发者后台配置商品后,在用户完成一笔购买之后,Google Play弹出推荐购买的商品(Google有弹出策略),玩家可快速购买该商品。这个功能美约其名是提高购买量,但是目前存在一个致命的缺点,就是推荐购买的订单,并不会将用户自发购买订单传入的透传字段继续传递到推荐购买的订单,也就是推荐购买的订单不包含任何透传标识,如果你够买的商品需要根据透传字段识别购买者,那么这些订单将会无法发货。
三、编后语
Google结算库作为官方的库,会越来越稳定,并且 AIDL 方式的内购结算实现已经给了必须更新的时间点,因此,接入或者更新迫在眉睫。但是在接入或者更新过程中必须要注意这些坑,仔细阅读官方接入文档。