最近客串了一把android开发,对接谷歌的内购商品,这个过程真的是特别不顺,各种意想不到的坑,一踩一个;
接下来记录一下谷歌内购服务的完整配置流程,以及在最后测试阶段可能遇到的各种问题;在正式开始之前,请确定以下基本条件
- 科学上网
- 准备gmail邮箱
- 准备google play账号(地区不要选择中国大陆,因为不支持购买)
- 授权开启商家账号
- 准备测试机(谷歌服务四件套得有)
1. 内购服务前置授权配置
进入链接,开启api accesshttps://play.google.com/apps/publish/#ApiAccessPlace
接着点击上面的创建服务账号
接下来再新的窗口页,点击创建服务账号
创建服务账号有三步,第一步如下,填写标记的两项
第二步设置账号权限,下面勾选结算功能,请注意一下用户权限,选错的话,服务器后续的校验可能会403报错哦
第三步,服务账号授权,注意账号就是我们第一步生成的,输入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端集成对应的代码,按照文档一步一步来,官方文档在接入代码这里,写得比较清晰,主要的问题会在后面的测试环节
- 中文接入文档: https://developer.android.com/google/play/billing/billing_library_overview?hl=zh-cn#Connect
- 英文接入文档: https://developer.android.com/google/play/billing/integrate
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结算
首先确保,当前测试的包与提交到谷歌控制台的包签名 + 包名 + 版本一致
如果上面没有问题,可以尝试如下操作
- 设置->账号详情->许可测试
- 添加测试账号
IV. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog