准備工作
1. 通過Android SDK Manager下載extras中的Google Play services和Google Play Billing Library兩個包。


2. 把下載的.aidl文件加入到你的工程中:在你的工程里建一個如下的包名com.android.vending.billing,再把這個aidl文件拷貝到里面,最后刷新一下你的工程就可以了,如果工程沒有生成相關代碼,可以執行下android update命令,update下你的工程。

3. 在你工程的AndroidMainfest.xml里添加權限:
<uses-permission android:name="com.android.vending.BILLING" />
完成這些后,你的工程就有Google billing了,在你的程序打包簽名后,Google Play后台也會認可你的程序了,能夠允許你在后台添加內購商品了。在正式接入支付代碼前,你可以先把這個apk上傳到Google Play后台,這個APK就相當於你要發布的APK了,當然你不會真的發布它,這里要說的就是,這個上傳的APK是需要簽名的,而且包名以及簽名要與你以后上傳的正式APK保持一致。
4. beta版APK上傳后你就可以設置應用內商品了。此外我們將得到一個PublicKey,用於支付驗證。
5. 在google后台加入測試號,並登錄選擇使用網址確認。

6. 准備一個VPN賬號、Google商店賬號、一台帶有Google Play的手機(“我用的是天天模擬器”)
7. 在手機上連接VPN並登錄google商店,然后把你的賬號綁定信用卡。若在推薦應用中看到了付費項目,並能搜到自己的應用(只有測試號才能搜到),就可以開始后續工作了。要是不行,則需要清除下google商店的國內訪問緩存,重啟手機。用模擬器的可以清下dns緩存。
開發工作
1. 新建一個包,把之前下載的代碼拷貝到工程中。

2. 初始化
labHelper這個是支付的關鍵代碼,其中已經把設置billing,商品查詢,商品購買,商品回調,商品驗證以及回調方法都寫好了。(“具體使用都在samples中”)
private void initGooglePlay()
{
mHelper = new IabHelper(mActivity, mPublicKey);
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if (!result.isSuccess()) {
Log.d(TAG, "Setup failed."+ result.toString());
return;
}
if (mHelper == null) return;
Log.d(TAG, "Setup successful. Querying inventory.");
//初始化成功則檢測目前擁有的商品,即已購買但未消耗的商品。google的商品如果設置的是可重復商品,當你在成功購買這個商品后是需要主動消耗的,只有消耗成功后才可以再次購買。
mHelper.queryInventoryAsync(mGotInventoryListener); }
});
}
3. 檢測商品
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
Log.d(TAG, "Query inventory finished.");
if (mHelper == null) return;
if (result.isFailure()) {
//表示沒有未消耗的商品
return;
}
//到此表示有未消耗的商品,我們可遍歷所有添加的商品,找到對應商品並消耗掉。
//skuName為我們之前創建的商品的金Key
Purchase gasPurchase = inventory.getPurchase(skuName); if(gasPurchase != null){
//如果邏輯是到賬后消耗掉對應商品,則說明玩家對應商品沒到賬,應補發。
//消耗掉對應商品。
mHelper.consumeAsync(gasPurchase, mConsumeFinishedListener);
}
}
};
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result);
// if we were disposed of in the meantime, quit.
if (mHelper == null) return;
// We know this is the "gas" sku because it's the only one we consume,
// so we don't check which sku was consumed. If you have more than one
// sku, you probably should check...
if (result.isSuccess()) {
Log.d(TAG, "Consumption successful. Provisioning.");
}
else {
//complain("Error while consuming: " + result);
}
Log.d(TAG, "End consumption flow.");
}
};
4.購買商品
public void buy(String orderId, )
{
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
//這里product就是我們要購買的對應商品的金Key
mHelper.launchPurchaseFlow(mActivity, Product, RC_REQUEST,
mPurchaseFinishedListener, orderId);
}
});
}
// Callback for when a purchase is finished
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
// if we were disposed of in the meantime, quit.
if (mHelper == null) return;
if (result.isFailure()) {
return;
}
String signNature = purchase.getSignature();
String purchaseInfo = purchase.getPurchaseInfo();
//把signNature, purchaseInfo發到服務端做驗證。getPurchaseInfo函數本沒有,自己到Purchase.java中添加並返回mOriginalJson就好。
SDKHelper.googlePlayCheckOrder(signNature, purchaseInfo);
//確認到賬后消耗掉對應商品,此處直接處理了。
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
}
};
想PurchseListener被調用到,需要重寫onActivityResult方法,該方法會在支付結束,你的程序重新回到前台的時候調用。
這里調用了 IabHelper 里的 handleActivityResult 方法,然后此方法會調用 PurchseListener。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
if (mHelper == null) return;
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
