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订阅服务(一)_第1张图片

 可以分为Android层,服务器层:

Android 从零开始了解Google订阅服务(一)_第2张图片

 也可以分为google play层,developer层:

Android 从零开始了解Google订阅服务(一)_第3张图片

 开发者负责的就是右边哪一层。

那么这些元素是如何通信的?

Android 从零开始了解Google订阅服务(一)_第4张图片

我们和服务器的通信我们自己知道,谷歌商店和谷歌服务器的通信我们不需要知道。

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

可以结合图看下

Android 从零开始了解Google订阅服务(一)_第5张图片

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 = $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订阅服务器的四个元素、订阅原理,和如何在应用中发起订阅的部分代码。相信看完会对订阅流程有个完成的理解。

接下来的文章会介绍:

  • 开发者实时通知
  • 订阅升级、降级
  • 宽限期
  • 账号保留功能
  • 处理被取消的订阅
  • 订阅延迟结算

你可能感兴趣的:(android,java,google,play)