日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

 

 

作者 / Caren Chang, Android Engineer

google Play Billing 系列內(nèi)容是專門為中文開發(fā)者開辟的系列分享,著重講解中國(guó)開發(fā)者對(duì) Play Billing 最容易感到疑惑的地方。如果您有任何問題,也歡迎在留言區(qū)提出,我們會(huì)收集大家的反饋并在后續(xù)文章中做出解答。

 

銷售數(shù)字內(nèi)容是許多 Android 應(yīng)用的主要營(yíng)收渠道。具體形式包括銷售應(yīng)用內(nèi)的特定商品 (如游戲金幣) 以及訂閱計(jì)劃 (比如允許用戶在限定時(shí)間內(nèi)訪問高級(jí)功能)。Google Play Billing 作為一個(gè)數(shù)字內(nèi)容銷售的工具和服務(wù)的集合,可以幫助開發(fā)者在 Android 應(yīng)用中銷售線上商品。

 

本文將從基礎(chǔ)知識(shí)開始,帶大家逐步深入,詳細(xì)了解 Google Play Billing 3,及其用例和最佳實(shí)踐。

 

首先,我們來熟悉一下 Google Play Billing 的一些關(guān)鍵組件。

  • Google Play 管理中心 (Google Play Console) - Google Play 管理中心既是 Android 應(yīng)用發(fā)布平臺(tái),也可以用于設(shè)置應(yīng)用中銷售的各種內(nèi)容。在 Play 管理中心可以配置待出售的商品,包括價(jià)格點(diǎn),以及針對(duì)每個(gè)產(chǎn)品進(jìn)行高級(jí)配置,如提供訂閱的免費(fèi)試用期;
  • Google Play Billing Library - 這是您集成到 Android 應(yīng)用中的開發(fā)庫(kù)。使用此庫(kù)連接 Google Play 就可以執(zhí)行各種與銷售相關(guān)的任務(wù),例如在用戶購(gòu)買商品時(shí)處理購(gòu)買流程;
  • Google Play Developer API - 一組 REST API,可用于與 Google Play 通信。使用這些 API 可以查詢和管理應(yīng)用銷售的商品。這些 API 還可以驗(yàn)證用戶的購(gòu)買中是否存在欺詐行為,或者檢查訂閱是否仍處于有效狀態(tài)。
Google Play 管理中心
https://developer.android.google.cn/distribute/console
Google Play Billing Library
https://developer.android.google.cn/google/play/billing/billing_library_overview
Google Play Developer API
https://developers.google.cn/android-publisher

 

了解了 Google Play Billing 的關(guān)鍵組件之后,我們將從頭介紹如何設(shè)置環(huán)境并開始在 Android 應(yīng)用中銷售商品。

1. 設(shè)置 Android 應(yīng)用使用 Google Play Billing 開發(fā)庫(kù)

第一步,也是最重要的一步,是設(shè)置 Android 應(yīng)用以使用 Google Play Billing 開發(fā)庫(kù)。

向 App/build.gradle 文件中添加以下依賴關(guān)系,在應(yīng)用中實(shí)現(xiàn) Google Play Billing:

implementation ‘com.android.billingclient:billing:3.0.0’

添加庫(kù)依賴關(guān)系后,為應(yīng)用構(gòu)建一個(gè)發(fā)布版 APK,并將其上傳到 Google Play 管理中心。

 

2. 添加應(yīng)用內(nèi)產(chǎn)品

 

上傳 APK 后,可以使用 Google Play 管理中心開始添加要在應(yīng)用中銷售的應(yīng)用內(nèi)產(chǎn)品。在 "商店發(fā)布 (Store Presence)" 下,有一個(gè)設(shè)置應(yīng)用內(nèi)產(chǎn)品的部分。在這里可以設(shè)置兩種類型的商品:

  • 托管產(chǎn)品 (或一次性購(gòu)買)
  • 訂閱

創(chuàng)建新的托管產(chǎn)品和訂閱時(shí),需要輸入商品的產(chǎn)品 ID (Product ID) 或 SKU。這個(gè)產(chǎn)品 ID 后續(xù)將在應(yīng)用代碼中使用,我們稍后會(huì)講到。在創(chuàng)建托管產(chǎn)品之前,應(yīng)慎重規(guī)劃產(chǎn)品 ID。產(chǎn)品 ID 在應(yīng)用中必須唯一,并且在創(chuàng)建后無法更改或重復(fù)使用。

簡(jiǎn)單 3 步配置 Google Play Billing

 

為了使測(cè)試更快、更簡(jiǎn)單,您可以將您的 Google 帳號(hào)添加到 Google Play 開發(fā)者帳號(hào)的 "許可測(cè)試 (License Testing)" 中。這樣,只要軟件包名稱與 Play Store 中的 APK 匹配,就可以使用調(diào)試版本和調(diào)試簽名進(jìn)行測(cè)試。

將 Google 帳號(hào)添加到 Google Play 開發(fā)者帳號(hào)的 "許可測(cè)試 (License Testing)"  中
https://developer.android.google.cn/google/play/billing/billing_testing#testing-purchases

 

3. 檢查設(shè)置是否成功

在 Play 管理中心中設(shè)置好產(chǎn)品后,您可以在應(yīng)用中查詢產(chǎn)品的詳細(xì)信息來檢查設(shè)置是否成功。

 

lateinit private var billingClient: BillingClient
override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   // Set up the billing client
   billingClient = BillingClient
      .newBuilder(this)
      .enablePendingPurchases()
      .setListener(this)
      .build()
   billingClient.startConnection(object : BillingClientStateListener {
      override fun onBillingSetupFinished(billingResult: BillingResult) {
         if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
            Log.i(TAG, "Billing client successfully set up")
            queryOneTimeProducts()
         }
      }
      
      override fun onBillingServiceDisconnected() {
         Log.i(TAG, "Billing service disconnected")
      }
   })
}
private fun queryOneTimeProducts() {
   val skuListToQuery = ArrayList<String>()
   skuListToQuery.add("coins_5")
   // ‘coins_5’ is the product ID that was set in the Play Console.
   // Here is where we can add more product IDs to query for based on
   // what was set up in the Play Console.
   val params = SkuDetailsParams.newBuilder()
   params
      .setSkusList(skuListToQuery)
      .setType(BillingClient.SkuType.INAPP)
   // SkuType.INAPP refers to 'managed products' or one time purchases.
   // To query for subscription products, you would use SkuType.SUBS.
   billingClient.querySkuDetailsAsync(
      params.build(),
      object : SkuDetailsResponseListener {
         override fun onSkuDetailsResponse(
            result: BillingResult?,
            skuDetails: MutableList<SkuDetails>?
         ) {
            Log.i(TAG, "onSkuDetailsResponse ${result?.responseCode}")
            if (skuDetails != null) {
               for (skuDetail in skuDetails) {
                  Log.i(TAG, skuDetail.toString())
               }
            } else {
               Log.i(TAG, "No skus found from query")
            }
         }
      })
}

 

如果一切順利,您將會(huì)看到剛剛添加進(jìn) Play 管理中心的產(chǎn)品的詳細(xì)信息!

 

4. 接入 Google Play Billing 開發(fā)庫(kù)

下一步,便是如何在您的 Android 應(yīng)用中接入 Google Play Billing 開發(fā)庫(kù)。

本文將以一次性購(gòu)買的生命周期為例,即在應(yīng)用中銷售數(shù)字商品及授予用戶的過程。如果您在應(yīng)用中提供了訂閱功能,您也可以閱讀往期文章《訂閱取消后的那些事兒——恢復(fù)訂閱和重新訂閱》了解更復(fù)雜生命周期的訂閱流程。

 

一次性產(chǎn)品可以是消耗品,也可以是非消耗品。消耗品意味著用戶可以再次購(gòu)買。例如,如果您的游戲允許用戶購(gòu)買金幣,您可以將金幣做成消耗品,讓用戶可以多次購(gòu)買。非消耗品意味著用戶只能購(gòu)買一次,典型示例是包含額外應(yīng)用內(nèi)功能的升級(jí)包。

 

在 Google Play 管理中心配置應(yīng)用內(nèi)產(chǎn)品后,其銷售過程如下:

簡(jiǎn)單 3 步配置 Google Play Billing

 

讓我們逐步分析這一過程。

1. 設(shè)置 BillingClient - BillingClient 類讓您的應(yīng)用可以與 Play Billing Library 進(jìn)行通信。您的應(yīng)用需要做的第一件事是調(diào)用 startConnection() 與 Google Play 建立連接。

startConnection()
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClient#startconnection


在實(shí)際環(huán)境中連接是有可能中斷的,所以您的應(yīng)用還必須重寫 onBillingServiceDisconnected() 回調(diào)來處理重新連接,確保應(yīng)用在發(fā)出任何進(jìn)一步請(qǐng)求之前已與 Google Play 連接。

onBillingServiceDisconnected()
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClientStateListener#onBillingServiceDisconnected()

 

onBillingServiceDisconnected()
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClientStateListener#onBillingServiceDisconnected()

 

2. 獲取用戶的既有購(gòu)買記錄 - 成功設(shè)置 BillingClient 后,您的應(yīng)用現(xiàn)在可以調(diào)用queryPurchases() 來查詢用戶先前的購(gòu)買記錄。

/**
 * Query Google Play Billing for existing purchases.
 *
 * New purchases will be provided to PurchasesUpdatedListener.
 */
fun queryPurchases() {
    if (!billingClient.isReady) {
        Log.e(TAG, "queryPurchases: BillingClient is not ready")
    }    // Query for existing in app products that have been purchased. This does NOT include subscriptions.
    val result = billingClient.queryPurchases(BillingClient.SkuType.INAPP)
    if (result.purchasesList == null) {
        Log.i(TAG, "No existing in app purchases found.")
    } else {
        Log.i(TAG, "Existing purchases: ${result.purchasesList}")
    }
}

 

3. 呈現(xiàn)待售產(chǎn)品 - 在本文的前半部分我們談到了如何在 Google Play 管理中心中設(shè)置產(chǎn)品以及如何在應(yīng)用中查詢這些產(chǎn)品。在調(diào)用 querySkuDetailsAsync() 獲取每個(gè)產(chǎn)品的 SkuDetails 后,即可使用這些信息設(shè)置對(duì)應(yīng)的界面。

private fun queryOneTimeProducts() {
    val skuListToQuery = ArrayList<String>()
    // sku refers to the product ID that was set in the Play Console
    skuListToQuery.add("small_pineapple_seed")
    val params = SkuDetailsParams.newBuilder()
    params
        .setSkusList(skuListToQuery)
        .setType(BillingClient.SkuType.INAPP)
    // SkuType.INAPP refers to 'managed products' or one time purchases
    // To query for subscription products, you would use SkuType.SUBS
    billingClient.querySkuDetailsAsync(
        params.build(),
        object : SkuDetailsResponseListener {
            override fun onSkuDetailsResponse(
                result: BillingResult,
                skuDetails: MutableList<SkuDetails>?
            ) {
                if (skuDetails != null) {
                    // Store sku and skuDetail to be used later
                } else {
                    Log.i(TAG, "No sku found from query")
                }
            }
        })
}

 

querySkuDetailsAsync()
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClient#queryskudetailsasync
SkuDetails
https://developer.android.google.cn/reference/com/android/billingclient/api/SkuDetails

 

4. 啟動(dòng)購(gòu)買流程 - 當(dāng)用戶點(diǎn)擊產(chǎn)品進(jìn)行購(gòu)買時(shí),您的應(yīng)用需要帶上產(chǎn)品 SkuDetails 來調(diào)用launchBillingFlow(),從而向用戶展示 Google Play 購(gòu)買界面 (如下圖所示)。

簡(jiǎn)單 3 步配置 Google Play Billing

 

fun launchPurchaseFlow(skuDetails: SkuDetails) {
    val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)        .build()    val responseCode = billingClient.launchBillingFlow(this, flowParams)
    Log.i(TAG, "launchPurchaseFlow result ${responseCode}")
}
launchBillingFlow()
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClient#launchbillingflow

 

5. 處理購(gòu)買結(jié)果 - 在用戶退出 Google Play 購(gòu)買界面時(shí) (點(diǎn)擊 "購(gòu)買" 按鈕完成購(gòu)買,或者點(diǎn)擊 "返回" 按鈕取消購(gòu)買),onPurchaseUpdated() 回調(diào)會(huì)將購(gòu)買流程的結(jié)果發(fā)送回您的應(yīng)用。然后,根據(jù) BillingResult.responseCode 即可確定用戶是否成功購(gòu)買產(chǎn)品。如果 responseCode == OK,則表示購(gòu)買已成功完成。

 

  • onPurchaseUpdated()
https://developer.android.google.cn/reference/com/android/billingclient/api/PurchasesUpdatedListener#onPurchasesUpdated(com.android.billingclient.api.BillingResult,%20JAVA.util.List%3Ccom.android.billingclient.api.Purchase%3E)
  • BillingResult.responseCode
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClient.BillingResponseCode

 

onPurchaseUpdated() 會(huì)傳回一個(gè) Purchase 對(duì)象列表,其中包括用戶通過應(yīng)用進(jìn)行的所有購(gòu)買。每個(gè) Purchase 對(duì)象都包含 sku、purchaseToken 和 isAcknowledged 以及其他很多字段。使用這些字段,您可以確定每個(gè) Purchase 對(duì)象是需要處理的新購(gòu)買還是不需要進(jìn)一步處理的既有購(gòu)買。

// Google Play calls this method to propogate the result of the purchase flow
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase?>?) {    if (billingResult.responseCode == OK && purchases != null) {
        for (purchase in purchases) {
            handlePurchase(purchase)        }    } else if (billingResult.responseCode == USER_CANCELED) {
        Log.i(TAG, "User cancelled purchase flow.")
    } else {
        Log.i(TAG, "onPurchaseUpdated error: ${billingResult?.responseCode}")
    }}

 

  • Purchase
https://developer.android.google.cn/reference/com/android/billingclient/api/Purchase

 

6. 驗(yàn)證和確認(rèn)購(gòu)買 - 使用 Play Billing Library 3.0 時(shí),您的應(yīng)用需要確認(rèn)購(gòu)買成功才能完成購(gòu)買流程。如果您的應(yīng)用未在 72 小時(shí)內(nèi)確認(rèn)購(gòu)買,則用戶會(huì)自動(dòng)收到退款,并且 Google Play 會(huì)撤消該購(gòu)買交易

 

如果您的應(yīng)用包含驗(yàn)證服務(wù)器組件,您應(yīng)在驗(yàn)證成功后再確認(rèn)購(gòu)買。我們強(qiáng)烈推薦開發(fā)者對(duì)所有的應(yīng)用內(nèi)購(gòu)買進(jìn)行驗(yàn)證。請(qǐng)查看本指南了解有關(guān)打擊欺詐性購(gòu)買的更多信息。

 

指南: 打擊欺詐和濫用行為
https://developer.android.google.cn/google/play/billing/security#verify

 

在對(duì)購(gòu)買進(jìn)行驗(yàn)證之后,您還需要對(duì)其進(jìn)行確認(rèn)。

  • 非消耗品必須通過調(diào)用 acknowledgePurchase() 進(jìn)行確認(rèn);
  • 消耗品必須通過調(diào)用 consumeAsync() 來標(biāo)記為 "已消耗 (consumed)",使得用戶可以再次購(gòu)買。調(diào)用 consumeAsync() 還會(huì)將購(gòu)買設(shè)置為已確認(rèn),因此只要調(diào)用了consumeAsync(),就無需再對(duì)消耗品調(diào)用 acknowledgePurchase()。
fun handlePurchase(purchase: Purchase) {
    // If your app has a server component, first verify the purchase by checking that the
    // purchaseToken hasn't already been used.
    // If purchase was a consumable product (a product you want the user to be able to buy again)
    handleConsumableProduct(purchase)
    // If purchase was non-consumable product
    handleNonConsumableProduct(purchase)
}
fun handleConsumableProduct(purchase: Purchase) {
    val consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build()
    billingClient.consumeAsync(consumeParams, { billingResult, purchaseToken ->
        if (billingResult.responseCode == BillingResponse.OK) {
            // Handle the success of the consume operation.
        }
    })
}
fun handleNonConsumableProduct(purchase: Purchase) {
    if (purchase.purchaseState == PURCHASED) {
        if (!purchase.isAcknowledged) {
            val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                .setPurchaseToken(purchase.purchaseToken)
            billingClient.acknowledgePurchase(acknowledgePurchaseParams.build())
        }
    }
}

 

acknowledgePurchase()
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClient#acknowledgepurchase
consumeAsync()
https://developer.android.google.cn/reference/com/android/billingclient/api/BillingClient#consumeasync

 

7. 授予用戶產(chǎn)品 - 完成上述步驟后,您的應(yīng)用就可以向用戶授予他們購(gòu)買的應(yīng)用內(nèi)產(chǎn)品了!

如果您想查看 Google Play Billing 開發(fā)庫(kù)的資源,可以在此處訪問官方文檔。我們還提供了一些示例,演示了實(shí)現(xiàn) Billing 庫(kù)的最佳實(shí)踐。本文中的代碼示例可以在 GitHub 上獲取。

 

官方文檔: Google Play Billing 服務(wù)概覽https://developer.android.google.cn/google/play/billing/billing_overview
Play Billing 開發(fā)庫(kù)示例
https://github.com/android/play-billing-samples
本文中的代碼示例
http://github.com/calren

 

如果您的應(yīng)用目前尚未使用 Play Billing Library 3,務(wù)必查看我們的遷移指南,將您的應(yīng)用遷移到最新的 Play Billing Library。

從 AIDL 遷移到 Google Play Billing 開發(fā)庫(kù)的遷移指南
https://developer.android.google.cn/google/play/billing/migrate

 

簡(jiǎn)單 3 步配置 Google Play Billing

 

 

文章轉(zhuǎn)載自:谷歌開發(fā)者公眾號(hào)原創(chuàng)文章

分享到:
標(biāo)簽:Google Play Billing
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定