android|Android 从零开始了解Google订阅服务(一)
目录
一、官方文档
二、订阅流程简单介绍
【android|Android 从零开始了解Google订阅服务(一)】三、应用发起订阅
四、总结
一、官方文档 Google Play 结算系统概览
文章图片
https://developer.android.google.cn/google/play/billing
如果看玩上面官方文档介绍,还是蒙蒙的,可以继续看下视频介绍
Google订阅流程
文章图片
https://medium.com/androiddevelopers/subscriptions-101-for-android-apps-b7005a7e93a6如果你看仔细看完上面两个链接的内容,就不用继续往下看了。如果因为某些原无法观看,可以继续往下看。
二、订阅流程简单介绍 参与订阅的元素主要有四个:谷歌商店服务器,你的服务器,你手机上的谷歌商店,你的app
文章图片
可以分为Android层,服务器层:
文章图片
也可以分为google play层,developer层:
文章图片
开发者负责的就是右边哪一层。
那么这些元素是如何通信的?
文章图片
我们和服务器的通信我们自己知道,谷歌商店和谷歌服务器的通信我们不需要知道。
app和谷歌商店的通信就是谷歌提供的依赖库了:
def billing_version = "4.0.0"
implementation "com.android.billingclient:billing:$billing_version"
implementation "com.android.billingclient:billing-ktx:$billing_version"
我用的时候是版本是4.0.0,通过这个依赖库我们可以调用PAI完成一些列购物操作。
然后你的服务器与谷歌服务器的通信是通过Google Play Deveploer API 和Google Clound Pub/Sub,这一部分是交给服务器端完成的。
三、应用发起订阅 我们从应用发起订阅的流程主要是以下四个:
- 调用startConnection()连接谷歌商店
- 连接成功后调用queryPurchase查询当前订阅信息
- 模拟用户订阅,调用launchBillingFlow()发起订阅请求
- 在onPurchasesUpdated()回调中获取请求结果,成功后可以获得purchase token和order id
文章图片
purchase token(购买证明)代表着用户对你的应用提供的商品或服务所拥有的生效权利
order id(订单ID)则是用户与Google之间的交易收据
然后,我们应用会把token传给服务器,服务器会拿着purchase token去跟谷歌服务器做校验,校验结果可能成功,也可能失败,(成功则服务器会保留当前purchase token),然后通知我们应用订阅成功或者失败。
看下订阅代码:
//1.连接谷歌商店
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(p0: BillingResult) {
Log.i(TAG, "onBillingSetupFinished: code= ${p0.responseCode}")
Log.i(TAG, "onBillingSetupFinished: message = ${p0.debugMessage}")
if (p0.responseCode == BillingResponseCode.OK) {//连接成功
querySkuDetails()
} else {
disConnect()
}
}override fun onBillingServiceDisconnected() {
Log.i(TAG, "onBillingServiceDisconnected: ")
disConnect()
}
})//2.查询订阅商品详情
private fun querySkuDetails() {
val skuList = ArrayList()
skuList.add("sub_001")
skuList.add("sub_002")
val params = SkuDetailsParams.newBuilder()
//注意这里是SkuType.SUBS,表示查询订阅,SkuType.INAPP是应用内商品的查询
.setType(SkuType.SUBS)
.setSkusList(skuList)
.build()
billingClient.querySkuDetailsAsync(params) { p0, p1 ->
Log.i(TAG, "querySkuDetails2: code = ${p0.responseCode}")
Log.i(TAG, "querySkuDetails2: msg = ${p0.debugMessage}")
Log.i(TAG, "querySkuDetails2: data = https://www.it610.com/article/$p1")if (p0.responseCode == BillingResponseCode.OK) {
if (p1 != null && p1.size > 0) {
Log.i(TAG, "querySkuDetails: $p1")
skuDetails = p1[0]
showGoods()
} else {
toast("查无商品信息")
}
} else {
toast("查询商品失败")
}}
}//3.发起订阅
private fun launchBillingFlow(skuDetails: SkuDetails) {
val flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build()
var responseCode = billingClient.launchBillingFlow(this, flowParams).responseCode;
Log.i(TAG, "launchBillingFlow: responseCode = $responseCode")
}//4.监听购买回调
//Google Play 会调用 onPurchasesUpdated(),以将购买操作的结果传送给实现 //PurchasesUpdatedListener 接口的监听器
private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, mutableList ->
Log.i(TAG, "onPurchasesUpdated, code = ${billingResult.responseCode}")
Log.i(TAG, "onPurchasesUpdated, msg = ${billingResult.debugMessage}")
Log.i(TAG, "onPurchasesUpdated, data = https://www.it610.com/article/$mutableList")
when (billingResult.responseCode) {
BillingResponseCode.OK -> {
if (mutableList != null) {
//获取purchase token和order id
val purchaseToken = mutableList[0].purchaseToken
val orderId = mutableList[0].orderId
Log.i(TAG, "oldPurchaseToken : $oldPurchaseToken")
} else {
toast("xxxxx")
}
}
else -> {
toast("xxx")
}
}
}
四、总结 介绍了google订阅服务器的四个元素、订阅原理,和如何在应用中发起订阅的部分代码。相信看完会对订阅流程有个完成的理解。
接下来的文章会介绍:
- 开发者实时通知
- 订阅升级、降级
- 宽限期
- 账号保留功能
- 处理被取消的订阅
- 订阅延迟结算
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- android第三方框架(五)ButterKnife
- 一个人的碎碎念
- 我从来不做坏事
- Android中的AES加密-下
- 从蓦然回首到花开在眼前,都是为了更好的明天。
- 带有Hilt的Android上的依赖注入
- 西湖游
- 改变自己,先从自我反思开始
- leetcode|leetcode 92. 反转链表 II