目錄
一、官方檔案
二、訂閱流程簡單介紹
三、應用發起訂閱
四、總結
一、官方檔案
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訂閱服務器的四個元素、訂閱原理,和如何在應用中發起訂閱的部分代碼,相信看完會對訂閱流程有個完成的理解,
接下來的文章會介紹:
- 開發者實時通知
- 訂閱升級、降級
- 寬限期
- 賬號保留功能
- 處理被取消的訂閱
- 訂閱延遲結算
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/303076.html
標籤:其他
