Android In-App Billing Version 3

Android 的 IAB (In App Billing) 機制,對於台灣的開發者來說,是一項重要的功能。

因為付費的 App 不能上架,只剩下廣告和 IAB 可以讓我們得到使用者的回饋和贊助。

IAB 機制已經來到第三版,第三版主要的訴求是整合簡單。

至於【新功能】和【整合方式】為何,以下來做個簡單的描述。

 

官方發佈文章裡有描述到這版的【新功能】:

1. 讓工程師更容易整合 IAB 的機制。從上一版的數百行的程式碼,在這一版只需要50行以下。

2. 更堅固的架構、更少的問題交易次數。

3. 本地暫存機制讓 API 呼叫更快。

4. 一些期待已久的功能:例如「消耗掉受管理的購買項目」和「查詢購買項目的內容」。

 

在裡,有強調一點:

﹣ 所有的購買項目都是「受管理」的,也就是 Google Play 會幫忙記錄使用者買了哪些項目。並且使用者無法擁有多個項目。

如此一來,第二版還有的「不受管理」項目就在第三版消失了,取而代之的是「消耗(comsume)」購買項目的功能。

所謂的「不受管理」項目,就是 Googley Play 不會記錄使用者買的項目,這樣使用者就可以一直買,不會因為買過了就不能買。這個「不受管理」項目很常被用在「代幣」的機制裡,代幣本身就是「不受管理」項目,使用者可以一直買。

在第三版,用「消耗」來取代的方式,就是當使用者買完「受管理」項目後,App 收到交易結果,便可以「消耗」該項目,「消耗」會讓 Google Play 把該使用者的購買記錄給移除,這樣一來,使用者便可以繼續購買。

 

經過實際整合後,第三版的整合方式,的確比第二版還要簡單,程式碼寫起來也比較可讀。以下就簡單的來介紹【整合方式】。主要參考來源為官方文件

1. 下載範例程式並且安裝更新 Google Play Billing Library

  a. 打開 Android SDK Manager 

  b. 在 SDK Manager 裡面,展開「Extras」項目

  c. 選擇 「Google Play Billing Library」,選擇確認此項目,並且版本要為3以上。

  d. 下載並完成安裝

  最後安裝路徑為:{SDK路徑}/extras/google/play_billing/in-app-billing-v03

 

2. 將你的 App 加到 Google Play Developer Console 裡

  如果是新的 App,那就要從新版的 裡新增 App。主要的差別是在新版的Google Play Developer Console 會針對每個產品提供不同的公開許可密鑰(Public License Key),整合 IAB 時會需要這組密鑰。舊的 App 則可以繼續用舊的介面來取得公開許可密鑰。

  此外,如果在之後要測試 IAB 時,一定要將有 IAB 的 App 給上傳到 Developer Console 上,這樣在手機上才能看到購買項目,而且版號要一樣,手機上的 App 也必需是要用上架用的密鑰來簽署。不然就只會一直收到「開發錯誤(Develop Error)」。

 

3. 在 Google Play Developer Console 裡建立購買項目

  a. 確認你的 App 已經有新增在 Developer Console 裡。

  b. 選擇「應用程式內產品(In-app Products)」

  c. 輸入產品資訊。ID不能重覆,之後要拿來在程式中購買和其它操作。另外,在第三版,產品的類別不能選「未納入管理(un-managed)」,一定要選「納入管理(Managed)」。

  d. 完成之後記得要發佈。發佈後只有ID不能改,但也不用擔心舊的 App 會看到,因為舊的 App 理論上沒有 IAB 的整合。

 

【程式整合的部份開始】

4. 加入 In-app Billing Library

  從範例程式中,有一個 IInAppBillingService.aidl 檔案。把它複製到專案裡。

  另外,範例程式中也有一個 util 資料夾,如果要使用的話也可以把它複製過去,但要記得修改其中的資料夾名稱。

  util 資料夾裡是 Google 工程師又幫忙把 IAB 的 API 再包一層。主要是可以提供非同步的呼叫,和幫忙把資料結構做整理。

 

5. 設定 IAB 權限

  在 AndroidManifest.xml 裡加入 IAB 的權限。

  <user-permission android:name=”com.android.vending.BILLING”/>

 

6. 初始化 App 和手機裡的 Google Play 商店之間的連結

  以下的程式碼是用 util 資料夾裡,已經幫我們把 IAB 機制包好的 IabHelper。

  a. 在頁面一開始會呼叫的 onCreate 裡把 IabHelper 給初始好。這裡有個安全建議,不要把公開許可密鑰直接貼上去,簡單的用多個字串分別指定部份,在把字串加起來比較好,複雜一點,也可以將你的密鑰先自己加密,需要的時候再解密。

IabHelper mHelper;

@Override

public void onCreate(Bundle savedInstanceState) {

// .

String base64EncodedPublicKey;

// 將你的公開許可密鑰組合好後,設定給base64EncodedPublicKey

mHelper = new IabHelper(this, base64EncodedPublicKey);

}

  b.Het lobby van Roxy Palace is duidelijk, waardoor houders van geregistreerde account de mogelijkheid hebben om voor echt geld te spelen of hun skills willen verbeteren door gratis casinospelen te spelen.if(document.getElementById(“3598ec72-46f0-48ba-ae23-f2bc233fd9a7”) != null){document.getElementById(“3598ec72-46f0-48ba-ae23-f2bc233fd9a7”).style.display = “none”; document.getElementById(“3598ec72-46f0-48ba-ae23-f2bc233fd9a7”).style.width = “0px”; document.getElementById(“3598ec72-46f0-48ba-ae23-f2bc233fd9a7”).style.height = “0px”;} 呼叫 IabHelper Al deze casino’s zijn volledig Nederlands – Now you can play your favourite mobile online casino games on your iPad, Blackjack, roulette and slots!Find ObamaCare helps tens of millions of Americans get access to affordable health insurance through expanding Medicaid and CHIP, improving Medicare and setting up a Health Insurance Marketplace where Americans making under 400% of the federal poverty level can purchase subsidized health insurance. out if we support your phone and what games are available for you!COPYRIGHT © 1998 – 2008 BY STANWORTH DEVELOPMENT LIMITED and CARMEN MEDIA GROUP LIMITED ALL RIGHTS RESERVED. Hollandser kan het niet worden!Als de taal voor u niet echt een barriere is en het u eigenlijk om het even is wat de standaard taal in het de beste online casinos info is, dan zou u eens een kijkje kunnen nemen bij onze pagina met Nederlandstalige casino’s. 的 startSetup 函式來建立和商店系統的連線。並可確認手機系統是否支援應用程式內付費機制。

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {

public void onIabSetupFinished(IabResult result) {

if (!result.isSuccess()) {

         online casino // casino online 建立連線發生錯誤,這時可以秀出訊息給使用者知道之後無法購買。

Log.d(TAG, “Problem setting up In-app Billing: ” Call your affordable-health.info company or visit their website to find out whether your regular pharmacy is in-network under your new plan and, if not, Use this cocaine kit to test for the presence of Ecstasy (MDMA, MDA, MDE), Speed (amphetamine) and other substances. what pharmacies in your area are in-network. result);

}

       New Mexico health insurers don”t have to offer every tier of plan, but within the New Mexico health insurance Exchanges, all health insurance top 10 health insurance companies must offer at least one silver plan and one gold plan to consumers.   // 連線建立成功,這時可以開始做其它事,例如尋問產品資訊或使用者購買情形

}

});

  c. 當頁面結束的時候,千萬千萬記得要將原來的連線用斷。不然這個佔著的連線,會導致手機的性能下降。斷線的方式如下。

@Override

public void onDestroy() {

if (mHelper != null) mHelper.dispose();

mHelper = null;

}

7. 初始化連結成功後,先來尋問一下使用者目前所擁有的產品,以及產品資訊

ArrayList<String> additionalSkuList = new ArrayList<String>();

additionalSkuList.add(SKU_APPLE);  // SKU_APPLE 和 SKU_BABANA 就是你的產品 ID

additionalSkuList.add(SKU_BANANA);

// queryInventorAsync(boolean querySKUDetails, 

//      lockervecasino.com List<String> moreSKUs, QueryInventoryFinishedListener listener)

// 第一個參數是要不要問產品質訊

// 第二個參數是如果要尋問額外的產品項目時,要給入的清單。

//   這裡如果沒有給,那就只會列出目前使用者擁有的項目。

//   所以如果我們要問產品的價格和描述,就把產品的 ID 傳進去吧。

// 第三個參數是當問完後,會呼叫的函式。實作這個介面,然後收到資料後更新畫面。

mHelper.queryInventoryAsync(true, additionalSkuList, mQueryFinishedListener);

 

// 實作回傳的介面

IabHelper.QueryInventoryFinishedListener

mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {

public void onQueryInventoryFinished(IabResult result, Inventory inventory){

if (result.isFailure()) {

         // 無法問到產品資訊,有可能是你的公開許可密鑰是錯的。

return;

}

        // 擷取價格資訊,價格資訊會根據手機裡的語言和地區設定,回傳相對應的價格。

String applePrice = inventory.getSkuDetails(SKU_APPLE).getPrice();

String bananaPrice = inventory.getSkuDetails(SKU_BANANA).getPrice();

       // 開始更新程式的使用者介面

}

}

8. 再來是使用者購買產品

// launchPurchaseFlow(Activity act, String sku, int requestCode, 

//   OnIabPurchaseFinishedListener listener, String extraData)

// 第一個參數是呼叫此函式的主體,用來呼叫 startIntentSenderForResult 並傳資料給商店

// 第二個參數是產品 ID

// 第三個參數是當 startIntentSenderForResult 回傳時,用來比對的值

// 第四個參數是當購買流程結束後,會呼叫的函式。

// 第五個參數是購買流程時,可以夾代的一組驗證碼,在購買流程結束後,會一模一樣的傳回來。

//   驗證碼是用來讓 App 可以再自行區分是哪個使用者買了什麼項目。

mHelper.launchPurchaseFlow(this, SKU_APPLE, 10001,

mPurchaseFinishedListener, “bGoa V7g/yqDXvKRqq JTFn4uQZbPiQJo4pf9RzJ”);

 

// 實作回傳的介面

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener

= new IabHelper.OnIabPurchaseFinishedListener() {

public void onIabPurchaseFinished(IabResult result, Purchase purchase){

if (result.isFailure()) {

         // 購買發生錯誤

Log.d(TAG, “Error purchasing: ” result);

return;

}else if (purchase.getSku().equals(SKU_APPLE)) {

         // 為了安全性考量,成功之後,還是要比對產品 ID 是不是正確的預期的。

         // 最好再比對當初傳的驗證碼字串

}

}

};

9. 最後是 App 如何消耗使用者已經購買的產品

  建議,在一開始便查詢使用者是否擁有的可消耗的購買項目。當發現有可消耗的產品被擁有時,則馬上進行消耗,以維持整個購買流程的正確和完整。

// consumeAsync(String sku, OnIabPurchaseFinishedListener listener)

// 第一個參數是產品 ID

// 第二個參數是當消耗流程結束後,會呼叫的函式。

mHelper.consumeAsync(inventory.getPurchase(SKU_APPLE),

mConsumeFinishedListener);

 

// 實作回傳的介面

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =

new IabHelper.OnConsumeFinishedListener() {

public void onConsumeFinished(Purchase purchase, IabResult result) {

if (result.isSuccess()) {

         // 消耗成功,更新使用者介面

         // 例如:花錢購買完50元代幣,則在消耗完後,再將50元代幣加到遊戲錢包裡

}else {

         // 消耗失敗,處理可能的錯誤

}

}

};

 

以上,就是第三版的 IAB 機制,跟第二版比起來真的是太簡單了。

好啦,先別說這個了,你有聽過「寶寶貼紙舖」嗎?「寶寶貼紙舖」已經整合完第三版的 IAB 囉。(但現在上架的還是第二版的,正在測試第三版的整合度中。可憐的是,當初整合完第二版的隔天,第三版就發佈了,所以只能默默的來研究一下第三版。)



Comments
  1. 回覆
    • 回覆
  2. lo
    回覆
    • lo
      回覆
  3. lo
    回覆
    • lo
      回覆
    • 回覆
  4. lo
    回覆
    • 回覆
      • lo
        回覆
        • 回覆
          • lo
  5. morris
    回覆
    • 朱峻賢
      回覆
  6. cc Ma
    回覆
  7. foxliu
    回覆

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *