Google play billing(Google play 內支付)


准備工作

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.");
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM