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.2 确认购买必须针对状态为成功的购买

    确认购买交易这个概念是在 Google 结算库 3.0 版本开始才有的,2.0及之前的版本是没有这个概念的。如果成功的购买交易在三天内未确认,用户会自动收到退款,并且 Google Play 会撤消该购买交易

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

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

2.3 处理待处理的购买交易

    处理的购买交易即状态为 Purchase.PurchaseState.PENDING 的购买交易。这种交易是因为用户在发起购买到购买交易付款方式得到处理期间,经过了一个或者多个额外的步骤。在这个过程中,Google在成功扣款前,这笔购买交易将会处于待处理状态,您的应用不应该对这类型的交易进行处理。

    那么大家肯定很困惑为什么会有这个状态的购买交易。在你初始化内购库的过程中,调用了 enablePendingPurchases() 接口启用了改功能。因为 Google 结算库 3.0 开始支持现金结算,也就是用户可以拿现金或者信用卡到第三方进行支付,Google 从第三方进行扣款(第三方可以是便利店,比如我们熟知的全家、Seven Eleven 等等)。在 Google 未返回成功状态之前,这笔购买交易都是出于待处理的状态,直到 Google 成功从第三方扣款并返回成功标识之前,查询将返回待处理状态。

注意:只有出于 PURCHASED 状态的购买交易才能确认,当购买交易处于 PENDING 状态时,不能确认。当购买状态从 PENDING 转换为 PURCHASED 时,确认倒计时三天期限才会开始。如果将非 PURCHASED 状态的购买交易进行确认,这笔购买交易在后续查询将会永远为非 PURCHASED 状态,导致掉单将不可避免。

  • Google结算使用第三方支付的流程

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

2.4 处理透传字段

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

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

三、编后语

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部