谷歌内购服务配置教程与避雷指南

最近客串了一把 android 开发,对接谷歌的内购商品,这个过程真的是特别不顺,各种意想不到的坑,一踩一个; 接下来记录一下谷歌内购服务的完整配置流程,以及在最后测试阶段可能遇到的各种问题;在正式开始之前,请确定以下基本条件
  1. 正确上网
  2. 准备 gmail 邮箱
  3. 准备 google play 账号(地区不要选择中国大陆,因为不支持购买)
  4. 授权开启商家账号
  5. 准备测试机(谷歌服务四件套得有)

1. 内购服务前置授权配置

进入链接,开启 api accesshttps://play.google.com/apps/publish/#ApiAccessPlace
谷歌内购服务配置教程与避雷指南
接着点击上面的创建服务账号
谷歌内购服务配置教程与避雷指南
接下来再新的窗口页,点击创建服务账号
谷歌内购服务配置教程与避雷指南
创建服务账号有三步,第一步如下,填写标记的两项
谷歌内购服务配置教程与避雷指南
第二步设置账号权限,下面勾选结算功能,为了简单也可以直接选择 owner,对所有的权限都有
谷歌内购服务配置教程与避雷指南
第三步,服务账号授权,注意账号就是我们第一步生成的,输入 bill 会出现一个候选框,选中即可
谷歌内购服务配置教程与避雷指南
上面完成之后,会多一个服务账号,接下来创建密钥, json/p12 按需选择
谷歌内购服务配置教程与避雷指南
比如我选择了 p12 之后,再进入详情,可以看到如下基本信息,在后续内购订单的确认中,服务端会用到这个电子邮件地址 + 上面下载的 p12 文件 (请注意,本文的所有配置只是为了演示,弄完之后就删除了,所以不要用这些信息来搞事情哦)
谷歌内购服务配置教程与避雷指南
上面服务账号配置完毕之后,回到前面的页面,点击完成
谷歌内购服务配置教程与避雷指南
点击完成之后,会自动刷新,出现下面这一行,点击授予访问权,在弹出中选中需要授权的应用
谷歌内购服务配置教程与避雷指南
在下面的演示中,给的是管理员权限,并选中了 app
谷歌内购服务配置教程与避雷指南
如果我们的内购商品是订阅类型,即支持自动续订,那么我们还需要额外的消息推送配置,比如自动续订之后,回调一下服务器,告诉续订成功,接下来进入相关配置 下面的操作来自于文档:https://cloud.google.com/pubsub/docs/quickstart-console 我们在快速入门中,点击设置项目,选中google play android developer
谷歌内购服务配置教程与避雷指南
接下来进入 Pub/Sub 主题页,即https://console.cloud.google.com/cloudpubsub/topicList来创建主题
谷歌内购服务配置教程与避雷指南
创建完毕之后,会自动进入主题详情页,拉到最下面,创建订阅
谷歌内购服务配置教程与避雷指南
在订阅中,填写必要信息,比如订阅 id,我这里选择的是推送方式,因此需要填写接收推送的 url
谷歌内购服务配置教程与避雷指南
topic 创建完毕之后,需要授予权限
谷歌内购服务配置教程与避雷指南
谷歌内购服务配置教程与避雷指南
选择添加成员,google-play-developer-notifications@system.gserviceaccount.com,角色为Pub/Sub Publisher
谷歌内购服务配置教程与避雷指南
保存之后,进入主题,点击刚才创建的 billing,进入详情,找到下面红框的内容,复制到粘贴板
谷歌内购服务配置教程与避雷指南
接下来进入 google play console,找到对应的项目,进入服务和 API
谷歌内购服务配置教程与避雷指南
将我们前面的内容,复制到输入框,点击保存,也可以发送测试通知,看一下配置的 url 是否能收到内容
谷歌内购服务配置教程与避雷指南
在上图中,上面的终端显示的就是 google 的回调,因为我是随便配置的一个 url,所以不会正常返回 200 状态,所以会重试(关于这个消息的重试机制,推荐选择阶梯重试方式,避免立即重试) 以上所有的配置,请注意这些都是谷歌内购商品的前提操作,这些搞完之后,还有一些操作等待着你

2. 商品配置

这里应该是最简单,坑最少的地方了
接下来进入 google play console https://play.google.com/apps/publish,进行内购商品配置
谷歌内购服务配置教程与避雷指南
请注意,应用内商品需要商家账号,开通流程没什么可说的,这里注意一下,受管理的商品和订阅是两种类型
  • 受管理的商品:即消费型商品,一次一次的买
  • 订阅商品:支持续订,举例如视频的月卡,开通之后,下个月自动扣钱续订(可以有效地赚钱)
创建收管理的商品,比较简单,唯一需要注意的是商品 ID,不能与之前的有冲突,而且某个商品即便删除了,其商品 id 也是依然不能再用的;其次就是需要将状态改为有效
谷歌内购服务配置教程与避雷指南
订阅商品创建姿势和上面基本一致,会多一个结算周期;请注意,订阅商品创建之后不能删除(至少我没有找到删除的地方)
谷歌内购服务配置教程与避雷指南

3. 代码集成

接下来就是 android 端集成对应的代码,按照文档一步一步来,官方文档在接入代码这里,写得比较清晰,主要的问题会在后面的测试环节

4. 测试

下面介绍下我们在测试这里踩过的坑

a. 首次提内测包需要过审

在测试之前,先要发包到 alpha 或者 beta 环境
  • 注意:正式包 + 正式签名 + 版本号
首次发包需要审核,即便发的是内测包也需要审核(请注意预留足够的时间)

b. 签名问题

请注意,用于测试购买的包,有以下几点非常重要
  • 测试的 apk 包名,要求与上面提包的包名要求一致
  • 测试的 apk 签名,要求与上面提包的前面一样
  • 测试的 apk 版本号,要求大于 or 等于上面提包的版本号

c. 测试机

测试机上,google 的基础服务要有
  • Google 框架服务
  • 谷歌账号管理
  • Google Play 服务
  • Google Play 商店

c. Google Play In-app Billing API version is less than 3

上面这个错误有很大的迷惑性,直接升级billingclient版本是并没有什么用的,出现这个问题,95%的可能性是因为你的 google 账号的地区是中国,而中国地区的账号是不支持购买的 要避免这个问题,就是换个地区不是中国的账号;或者切换一下账号位置(但是这个切换的条件,没有那么容易)

d. Fatal error during the API action

在于谷歌服务建立连接之后,查询 Sku 列表的时候,可能报这个问题,返回状态码为 6 出现这个问题,一般是两个原因
  • google play 商店能否正常打开
  • 手机是否翻墙(简单来讲,就是测试机的网络归属,不要是大陆)

e. SkuType.INAPP 与 SkuType.SUBS

请注意,在查询 Sku 信息时,传入的 producetId 与 SkuType 请对应起来,对应错了就查不到对应的 sku 信息
  • 消耗性商品,查询 sku 时,选择SkuType.INAPP
  • 订阅性商品,查询 sku 时,选择SkuType.SUBS

f. 商品确认

对于订阅性商品,用户购买了,也付了钱,但是这笔订单并不能表示完成了,这个时候需要确认 对于订阅型商品,下面的billingClient.acknowledgePurchase这一步必不可少
谷歌内购服务配置教程与避雷指南
对于一次性商品,则是billingClient.consumeAsync,注意他们的区别,不要混用
谷歌内购服务配置教程与避雷指南
关于上面两个确认的截图中,Listener 内部的实现非必要,一般来讲校验是否购买成功这件事情,推荐放在服务器端来做一个校验,如果完全信赖客户端的返回结果,会遇到什么问题各位小伙伴应该也能想到

g. 无法购买您要买的商品

请确保 google 账号在测试名单中
谷歌内购服务配置教程与避雷指南

e. 此版本的应用未配置为通过 google play 结算

首先确保,当前测试的包与提交到谷歌控制台的包签名 + 包名 + 版本一致 如果上面没有问题,可以尝试如下操作
  • 设置->账号详情->许可测试
  • 添加测试账号
谷歌内购服务配置教程与避雷指南