Google结算库集成避坑指南

一、前言

    Google结算库是Google官方提供的Google 支付库,在这之前,需要集成Google内购功能,都是使用 AIDL 的方式调用Google Play,AIDL 方式的调用存在许多问题,容易出现闪退,且此种方式已经长期没有更新。另外,Google也提出废弃 AIDL 方式集成,并给出了必须更新的时间节点(从 2021 年 8 月 2 日起,所有新应用都必须使用结算库版本 3 或更高版本。截至 2021 年 11 月 1 日,对现有应用的所有更新都必须使用结算库版本 3 或更新版本。)。无论你是直接集成新的 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 会撤消该购买交易

    另外,如果你的商品是消耗型商品,在进行消耗操作时,会自动进行确认。虽然如此,为了避免掉单现象,还是需要在获取到购买订单信息是,若购买订单状态为 Purchase.PurchaseState.PURCHASED 时,先进行确认。

注意事项:确认购买交易时,必须先检查购买交易的状态,只有购买成功(PURCHASED)的状态才能进行确认。

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结算使用第三方支付的流程
Created with Raphaël 2.3.0 开始支付 选择支付方式(第三方付款) 用户提供订单编号给第三方 用户完成第三方支付 第三方支付完成 Google扣款成功 支付完成 订单待处理 yes no

说明:第三方支付完成后,客户端都会收到通知,针对客户端来说,这个支付流程已经完成(但是这笔购买交易并未完成)。

2.5 处理透传字段

    在使用 AIDL 方式的内购中,开发者可以通过 developerPayload 字段传入,这个字段内容还算比较宽裕,能存储512个字符,开发者可以在里面存放订单的额外数据信息,方便后续订单校验时使用。但是使用 Google 结算库 之后,并没有这个字段。直到结算库 3.0 版本开始,才可以通过 BillingFlowParams.Builder.setObfuscatedAccountId()BillingFlowParams.Builder.setObfuscatedProfileId() 这两个接口设置订单额外数据,而且这两个字段存储的数据不能超过64个字符。因此,使用 Google 结算库时,还应该合理使用这两个字段。

建议:可以在 BillingFlowParams.Builder.setObfuscatedAccountId() 传入应用的用户id, BillingFlowParams.Builder.setObfuscatedProfileId() 传入应用的订单id,这样在支付成功后获取到的购买交易信息中,这两个信息就可以对应到相应的订单。

三、编后语

    Google结算库作为官方的库,会越来越稳定,并且 AIDL 方式的内购结算实现已经给了必须更新的时间点,因此,接入或者更新迫在眉睫。但是在接入或者更新过程中必须要注意这些坑,仔细阅读官方接入文档。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值