目录
一、官方文档
二、订阅流程简单介绍
三、应用发起订阅
四、总结
一、官方文档
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<String>()
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 = $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 = $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订阅服务器的四个元素、订阅原理,和如何在应用中发起订阅的部分代码。相信看完会对订阅流程有个完成的理解。
接下来的文章会介绍:
- 开发者实时通知
- 订阅升级、降级
- 宽限期
- 账号保留功能
- 处理被取消的订阅
- 订阅延迟结算