1. 程式人生 > >實現In-app Billing (IAB Version 3)

實現In-app Billing (IAB Version 3)

(未完成,可能存在誤解的地方)
詳細文件參考: https://developer.android.com/google/play/billing/billing_integrate.html#billing-add-aidl
        如果在Google Play釋出應用,不能使用第三方充值渠道,只能使用Google的In-app Billing, V3版本的介面是google釋出的最新充值介面,支援以服務的形式非同步的與Google Play進行互動,更加安全可靠,減少交易中的不確定因素造成的損失。 但是暫時只支援 In-app Products,不支援訂閱。
       基本步驟如下:
將 IInAppBillingService.aidl檔案拷貝到src資料夾下,正常的話會在gen目錄下生成對應的.java檔案
在AndroidManifest.xml 檔案中新增如下許可權 
<uses-permission android:name="com.android.vending.BILLING" />
建立一個 ServiceConnection  並將其與  IInAppBillingService繫結。這個是最核心的功能,用於與Google Play進行通訊。詳細程式碼參考IabHelper.java 核心程式碼如下:
IInAppBillingService mService;


ServiceConnection mServiceConn = new ServiceConnection() {
   @Override
   public void onServiceDisconnected(ComponentName name) {
       mService = null;
   }


   @Override
   public void onServiceConnected(ComponentName name, 
      IBinder service) {
       mService = IInAppBillingService.Stub.asInterface(service);
   }
};
@Override
public void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);        
    bindService(new 
        Intent("com.android.vending.billing.InAppBillingService.BIND"),
                mServiceConn, Context.BIND_AUTO_CREATE);
@Override
public void onDestroy() {
    super.onDestroy();
    if (mServiceConn != null) {
        unbindService(mServiceConn);
    }
}


一旦成功與Google Play建立連線,就可以使用上面建立的service與其進行通訊。比如獲取商品資訊,釋出購買請求等等。獲取商品資訊的程式碼示例(注意,不要在主執行緒呼叫此程式碼,涉及網路請求可能會阻塞主執行緒,應該另開一個執行緒呼叫):
ArrayList skuList = new ArrayList();
skuList.add("premiumUpgrade");
skuList.add("gas");
Bundle querySkus = new Bundle();
querySkus.putStringArrayList(“ITEM_ID_LIST”, skuList);


Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
int response = skuDetails.getInt("RESPONSE_CODE");
if (response == 0) {
   ArrayList responseList 
      = skuDetails.getStringArrayList("DETAILS_LIST");
   
   for (String thisResponse : responseList) {
      JSONObject object = new JSONObject(thisResponse);
      String sku = object.getString("productId");
      String price = object.getString("price");
      if (sku.equals("premiumUpgrade")) mPremiumUpgradePrice = price;
      else if (sku.equals("gas")) mGasPrice = price;
   }
}


申請購買商品:
// 購買程式碼
Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(),
   sku, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
startIntentSenderForResult(pendingIntent.getIntentSender(),
   1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
   Integer.valueOf(0));


// 結果返回
Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == 1001) {    
      int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
      String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
      String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
        
      if (resultCode == RESULT_OK) {
         try {
            JSONObject jo = new JSONObject(purchaseData);
            String sku = jo.getString("productId");
            alert("You have bought the " + sku + ". Excellent choice, 
               adventurer!");
          }
          catch (JSONException e) {
             alert("Failed to parse purchase data.");
             e.printStackTrace();
          }
      }
   }
}


// 返回結果示例
'{ 
   "orderId":"12999763169054705758.1371079406387615", 
   "packageName":"com.example.app",
   "productId":"exampleSku",
   "purchaseTime":1345678900000,
   "purchaseState":0,
   "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
   "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }'
設定物品已消耗(預設情況下,物品一旦被購買就屬於使用者,不允許再次被購買,如果是消耗型商品,比如貨幣或者裝備,就需要向Google Play傳送資訊通知該物品已被消耗。注意,這個步驟要在真正提供商品之前進行,之後正確的獲取到返回值才提供商品給玩家。)
int response = mService.consumePurchase(3, getPackageName(), token);
Handle In-app Billing responses from Google Play.

相關推薦

實現In-app Billing (IAB Version 3)

(未完成,可能存在誤解的地方) 詳細文件參考: https://developer.android.com/google/play/billing/billing_integrate.html#billing-add-aidl         如果在Google Play釋

折磨人的iab測試(in-app-billing) (二) 消費類

列出查詢資料, 事實上, 這些是後續遇到的consume消費型別時查到的, 但是現在我還是沒搞定消費型別的處理, 確實前半部分按照non-consume來處理, 流程一樣, 但是我沒有加上consumeSync, 導致沒有完成這次消費, 導致了之後一堆的麻煩事, 這個c

Google Play In app Billing

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Google支付(In-app Billing)接入

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

Google Play支付接入(in-app Billing)

Google Play in-app Billing的接入過程需要閱讀接入文件。官方的接入文件地址為: (1)Google Play開發者控制檯 Google Play開發者控制檯是管理應用,配置商品和釋出的後臺。參考地址為: Google Play的幫助文件地

Android支付接入(七):Google In-app-Billing

When you make an In-app Billing request with this product ID, Google Play responds as though the purchase was refunded. Refunds cannot be initiated through

Google Play In-app Billing 踩過的那些坑

最近在做的一款遊戲針對海外發行,要上 Google Play,所以支付這塊兒要接入 Google Play 。因為我們是免費 App + 應用內支付,所以 Google Play 這塊兒只接入 In-app 型別的支付方式,接下來我準備吐槽了。大環境國內做 Google Pl

Android: In-app-billing 付費機制Google示例

原文地址:http://neurosoft.blogspot.tw/2013/07/android-in-app-billing-google.html <uses-permissionandroid:name="com.android.vending.BILLI

in-app-billing for google play (google應用內付費 v3)

詳細文件參考: https://developer.android.com/google/play/billing/billing_integrate.html#billing-add-aidl         Google的In-app Billing, V3版本的介面是

建立 In-app Billing 商品

在你釋出 In-app Billing 應用前,你需要在 Google Play 開發者控制檯 定義可供購買的數字商品列表。 在 Google Play 設定你的 In-app 商品 在開發者控制檯,你可以定義內購商品的商品資訊並把這些商品和你應用關聯起來。 在商品列表裡新增新的內購商品: 為你的 In-a

GooglePlay內購In-app Billing 總結~

startSetup 的操作是檢查是否有許可權和連線到Google Billing service是否成功;這裡回撥的操作是如果成功,呼叫queryInventoryAsync檢視產品id是否可以使用; 查詢完成後會呼叫IabHelper.QueryInventoryFinishedListener 這

Google Pay調研 In-app Billing

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

準備好你的 In-app Billing 應用程式

準備好你的內購應用 在開始使用 In-app Billing 服務之前,你需要先把包含 In-app Billing Version 3 API 的庫新增到你的Android工程中。你還需要設定你的應用和Google Play通訊需要的許可權。另外,你還需要在你的應用和G

筆記:Google Play應用內購買結算(In-app Billing)的接入

Google Play應用內購買結算(In-app Billing) 最近公司有需求在Google渠道上加入Google支付 ,所以照著Google官方文件,寫了一個Dome,同時也寫這篇部落格記錄一下希望可以幫到有需要的人。 注意:In-app Billing Ve

Google Play In-app Billing

edit blank 通知 .py support develop androi 粗體 希望 0, 概述 應用程序內部付費機制(Google Play In-app Billing, 以下簡稱應用內支付)是Google Play的一項服務,這種服務為應用內購買提供支付

Python version 3.3 required, which was not found in the registry

() fix core can war 安裝 錯誤 -c gpa python registry函數語法 在windows下安裝numpy的時候, 出現了"Python version 3.3 required, which was not found in the re

in-app purchase 開發的的3個坑 Error Domain=SKErrorDomain Code=0 "無法連接到 iTunes Store

不能 使用 view build 獲取 p s blog 一點 圖片 首先,完整的代碼我這裏就不提供了,這裏提供一個下載鏈接 http://code.cocoachina.com/view/130335 有個這個code,你調試也不能通過,原因主要有三個

Advanced client stubbing in the AWS SDK for Ruby Version 3

The AWS SDK for Ruby provides a robust set of features for stubbing your clients, to make unit tests easier and less fragile. Many of you have use

Python version 3.6 required, which was not found in the registry錯誤解決

問題 def eat war use soft 分享 key path 問題: 安裝pywin32出現Python version 3.6 required, which was not found in the registry錯誤解決 解決: 建立一個文件 reg

[Nuget] - "Runtime error: Could not load file or assembly 'System.Web.WebPages.Razor, Version=3.0.0.0'" 問題之解決

未能加載文件 nuget man 5.0 install ges 成功 could not .com 環境 項目中使用了 System.Web.WebPages.Razor, Version=3.0.0.0,Nuget 還原缺失包後自動更新至 Version=3.2.5.0