1. 程式人生 > >Google支付(In-app Billing)接入

Google支付(In-app Billing)接入

應用內結算簡介

一、概述

使用應用內結算(In-app Billing)時,我們的應用通過相應的API來訪問In-app Billing服務。應用不直接與Google Play伺服器通訊,而是通過程序間通訊(IPC)向Google Play傳送結算請求並接收Google Play返回的響應。

In-app Billing在使用之前需要注意以下幾點:

  • 只能用來銷售數字內容,不能銷售實體商品
  • 應用一旦被購買,無法進行退款服務 Google
  • Play不提供內容交付,開發者需要自行交付在應用內購買的數字內容
  • 一個應用不能購買另一個應用釋出的商品

目前使用的In-app Billing是第3版,需要執行在Android2.2或更高版本,而且要求裝置安裝了最新版本的Google Play商店。第三版支援兩種商品:託管的應用內商品(Managed product)和訂閱(Subscription)。

託管的應用商品:由Google Play跟蹤和管理其所有權資訊的商品,託管的商品在被購買後,必須先向Google Play傳送消耗請求進行消耗,然後才能供使用者再次購買。 訂閱:允許開發者通過按月或按年結算的方式在應用內向使用者銷售內容、服務或功能,訂閱無法消耗。

二、Google Play購買流程

購買開始時,應用需要針對相應的應用內商品傳送結算請求。然後,Google Play 會處理此次交易的所有結帳詳情,包括請求和驗證付款方式以及處理財務交易。  當結帳流程完成後,Google Play 會嚮應用傳送購買詳情,例如訂單號、訂單日期和時間以及所付價格。應用不需要處理任何財務交易,這些事宜完全Google Play負責。

具體流程如下所示: 這裡寫圖片描述

  1. 應用向Google Play傳送isBillingSupported 請求,確定當前使用的應用內結算 API 目標版本是否受支援;
  2. 啟動或使用者登入時,向Google Play進行查詢,確定使用者擁有哪些商品,傳送getPurchases 請求;
  3. 通知使用者商品是否可供購買,傳送getSkuDetails 請求;
  4. 提示使用者購買,傳送getBuyIntent 請求。

三、消耗託管的應用內商品

應用內商品一經售出,就會被視為“被擁有”。處於“被擁有”狀態的應用內商品無法再通過 Google Play 購買。必須對“被擁有”的應用內商品傳送消耗請求,然後 Google Play 才能再次將其設成可購買狀態。消耗應用內商品會將商品切換回“未被擁有”狀態並刪除之前的購買資料。  通過傳送consumePurchase 提出消耗請求。

接入之前的準備

一、在 Google Play Developer Console 建立應用

  1. 註冊一個開發者賬號,按提示繫結信用卡並支付25美金;
  2. 建立一個新的app,填寫應用名稱; 這裡寫圖片描述
  3. 點選上圖中的Prepare Store Listing,按照提示填寫app的基本資訊,資訊一定要填寫完整,否則無法正常釋出應用;
  4. 在Services & APIs中,找到license key記錄下來。

二、新增In-app Billing庫檔案(以Android Studio為例)

  1. 在yourSDKpath/extras/google/market_billing/中找到檔案IInAppBillingService.aidl,在src/main中建立資料夾aidl,然後建立package‘com.android.vending.billing’ 如圖所示 這裡寫圖片描述
  2. 點選執行rebuild,在下圖所示位置看到IInAppBillingService.java檔案,即為匯入成功 這裡寫圖片描述
  3. 將market_billing/samples/TrivialDrive 中util包整個複製到專案中。

三、宣告許可權

在AndroidManifest.xml中宣告許可權:

<uses-permission android:name="com.android.vending.BILLING" />
  • 1

四、初始化與Google Play的連線

1、初始化IabHelper

IabHelper mHelper;

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    String base64EncodedPublicKey;

    // compute your public key and store it in base64EncodedPublicKey
    mHelper = new IabHelper(this, base64EncodedPublicKey);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2、呼叫startSetup方法

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
    if (!result.isSuccess()) {
        Log.e(TAG, "Problem setting up In-app Billing: " + result);
    }

    if (mHelper == null) {
        return;
    }
}
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3、在Activity的onDestory()中解綁

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mHelper != null) {
        mHelper.dispose();
    }
    mHelper = null;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

建立應用內購買的商品

一、上傳APK併發布

進入APK面板,上傳一個帶有簽名的APK檔案,檔案可以上傳到PRODUCTION、BETA TESTING、ALPHA TESTING中任意一箇中,三者區別見附錄1。下面的流程以BETA測試為例。

  1. 進入BETA TESTING頁面,上傳帶有簽名的APK檔案;
  2. 進入Content Rating頁面,填寫內容分級調查問卷,填完進行評估,根據結果接受評估或者重新填寫;
  3. 進入Pricing&Distribution頁面,選擇應用是付費還是免費,之後選擇產品要釋出的國家和地區;
  4. 確保如圖所示四個內容都顯示為綠色對勾,即可釋出應用; 這裡寫圖片描述
  5. 點選Publish app釋出,如果按鈕顯示為灰色,可以點選按鈕上方的Why can’t I publish?檢視還需要新增的內容,應用釋出之後需要等候幾個小時。在任一頁面可以檢視App的釋出狀態,如左圖所示為正在釋出,右圖顯示已經發布成功。 這裡寫圖片描述 這裡寫圖片描述

二、選擇測試方法(BETA測試為例)

待APP釋出完成之後,選擇一個測試方法,測試方法有三種(詳見附錄),此處以封閉式Beta測試為例。

  1. 登入Google Play開發者控制檯
  2. 選擇相應應用,點選左側選單中的APK
  3. 選擇Beta測試,進入“封閉式測試“
  4. 建立列表或選擇已有列表
  5. 將Opt-in URL中連結傳送給測試人員
  6. 測試人員需要點選測試連線並選擇加入測試

注意:測試時可以選擇測試賬號是否需要真實支付。比如應用在進行大範圍測試時,需要使用者可以進行真實的付款操作,而內部測試人員可以進行支付測試,但無需真實付款。可以將內部測試的賬號配置到Google Play後臺。  配置如下:

這裡寫圖片描述

將賬號填入下圖

這裡寫圖片描述

三、建立商品

  1. 點選左側選單中“In-app Products”,選擇”Add new Product“
  2. In-app Billing第3版支援型別為’Managed product’和’Subscription’的商品
  3. 配置product ID時要保證product ID是唯一的,product ID也叫做SKU,product ID在查詢商品和購買商品時需要用到
  4. 帶商品資訊填寫完成,將其狀態置為active

客戶端相關內容實現

客戶端實現具體內容詳見官方Demo,此處只簡單舉例說明(示例程式碼不全,參照Demo)。

一、查詢商品詳情

通過建立商品時新增的product ID,可以在客戶端查詢商品的詳情,呼叫queryInventoryAsync(boolean, List, QueryInventoryFinishedListener)

  • boolean:是否返回商品詳情(此處應設定為true)
  • List:要查詢的product IDs(SKUs)
  • QueryInventoryFinishedListener:監聽查詢結果

如果查詢成功,返回結果封裝在Inventory 物件中。

程式碼示例:

List<String> productNameList = new ArrayList<>();
productNameList.add(PRODUCT_ONE);
productNameList.add(PRODUCT_TWO);
mHelper.queryInventoryAsync(true, productNameList, new IabHelper.QueryInventoryFinishedListener() {
    @Override
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
        String price = inventory.getSkuDetails(PRODUCT_ONE).getPrice();
    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二、購買託管的商品

購買商品時也需要product ID,呼叫launchPurchaseFlow(Activity, String, int, OnIabPurchaseFinishedListener, String)

  • Activity:呼叫launchPurchaseFlow的activity
  • String:product ID,確保是ID而不是商品名稱
  • Int:request code值,可以是任何正整數,Google Play會將該值隨購買的回覆一起返回給Activity的onActivityResult
  • OnIabPurchaseFinishedListener:購買請求完成的監聽器
  • String:字串標記,惟一的標示購買請求,可以為空。如果你指定一個字串值,谷歌將返回此字串以及購買響應。在實際專案中最好由伺服器隨機生成一個字串使用

如果購買成功,返回結果封裝在Purchase 物件裡。  型別為‘Managed product’的商品可以重複購買,但再次購買之前一定要先向Google Play傳送商品消耗的請求,否則無法購買。

程式碼示例:

mHelper.launchPurchaseFlow(this, productId, REQUEST_CODE, new IabHelper.OnIabPurchaseFinishedListener() {
            @Override
            public void onIabPurchaseFinished(IabResult result, Purchase info) {

            }
        }, "XXXXXXX");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三、購買訂閱內容

在購買訂閱內容時,呼叫的方法與購買託管的商品不一樣,強行呼叫同一個方法,會在確認購買時接收到Google Play返回的錯誤資訊。  呼叫launchSubscriptionPurchaseFlow(Activity, String, int,OnIabPurchaseFinishedListener, String), 引數解釋參照2中內容。

程式碼示例:

mHelper.launchSubscriptionPurchaseFlow(this, productId, REQUEST_CODE, new IabHelper.OnIabPurchaseFinishedListener() {
    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase info) {

}
}, "purchase subscription");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

四、查詢已購買商品

查詢使用者已經購買的商品,呼叫queryInventoryAsync(QueryInventoryFinishedListener)  注意:查詢已購買商品時,查詢到的是當前登入到Google Play上的使用者已購買到的商品。

程式碼例項:

mHelper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() {
    @Override
    public void onQueryInventoryFinished(IabResult result, Inventory inv) {

    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

五、消耗託管的商品

一旦一個商品被購買,它將被認為是“被擁有”狀態,處於該狀態下的商品無法被同一使用者再次購買。因此需要傳送根據需求向Google Play傳送消耗請求,呼叫consumeAsync(Purchase, OnConsumeFinishedListener)

  • Purchase:要消耗的商品
  • OnConsumeFinishedListener:消耗完成之後的監聽

程式碼示例:

mHelper.consumeAsync(purchase, new IabHelper.OnConsumeFinishedListener() {
        @Override
        public void onConsumeFinished(Purchase purchase, IabResult result) {

        }
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

測試注意事項

由於配置比較複雜,在專案測試的時候,如果遇到“應用無法購買”的問題,請檢查以下幾點是否完成:

  • 確保上傳了帶有簽名的APK檔案;
  • 確保裝置上安裝了帶有簽名的APK,而不是除錯版;
  • 確保在測試中添加了測試人員;
  • 確保裝置登入的賬號屬於測試賬號;
  • 確保測試賬號激活了測試連結(最容易忽略);
  • 確保裝置上的應用版本號和版本名稱與Google開發者後臺上傳的APK一致;
  • 確保商品狀態為Active。

附錄:Alpha/Beta 版測試

Google為開發者提供了Alpha和Beta兩個版本進行測試,開發者不必有正式版APK就可以釋出Alpha/Beta應用。Alpha/Beta測試不會影響到線上正式釋出的應用,因為只有測試組的使用者才會收到Alpha/Beta版本的更新。如果沒有正式版的應用,那麼只有測試組的使用者才可以找到並下載應用。

一、Alpha/Beta版本

使用Alpha/Beta測試時,需要保證測試版APK的版本號高於正式版APK的版本號。  注意:

  1. Alpha版APK需要具有高於Beta 版 APK的版本號才能供Alpha版測試人員使用;
  2. 如果上傳的Beta版APK高於Alpha版,則Alpha版將會自動停用;
  3. 如果上傳的正式版APK高於Alpha/Beta版,則Alpha/Beta版將會自動停用;
  4. Alpha使用者可以測試Alpha、Beta和正式版,Beta使用者可以測試Beta和正式版。

二、不同的測試方法(以Beta為例)

1、封閉式Beta版測試

使用封閉式Beta測試,可以按電子郵件建立Beta測試人員列表,測試使用者必須擁有Google賬號(@gmail.com)或Google Apps賬戶才能加入測試。  列表建立完成之後,需要將Opt-in URL中連結傳送測試人員,待測試人員使用測試賬號訪問該連結啟用測試賬號,才可以正常測試。Opt-in URL只有在應用狀態為“已釋出”時才會顯示。

2、開放式Beta版測試

無需指定電子郵件地址或建立 Google網上論壇或 Google+社群。適用於大範圍測試。與封閉式測試相同,將釋出之後的連結傳送給測試人員,待啟用之後即可開始測試。

3、使用Google網上論壇或Google+社群執行封閉式Beta版測試

通過新增Google網上論壇電子郵件地址或Google+社群網址進行連結分享。測試人員必須加入新增的Google網上論壇或Google+社群才可以加入Beta測試,測試之前也需要啟用測試賬號。