1. 程式人生 > >Android Eclipse實現Google Pay內支付

Android Eclipse實現Google Pay內支付

現在越來越多的人都開始接觸了海外的支付方式,而google的官方支付作為一大支付方式,並且對接過程中遇到的坑較多,而我們又有可能用到,所以今天在這裡寫一下之前對接google的一些自我理解。希望可以幫助到大家:

先貼一份我對接Google支付的流程圖:(根據實際操作來進行流程修改)

這裡寫圖片描述

google支付demo效果圖:
這裡寫圖片描述

其實google的內支付很簡單,只是對於手機的要求比較特殊,需要手機有google框架和服務,這個在網上一搜一大把的。這裡就不說了啊。我接下來就開始直接進行專案的配置:

重點內容

  1. 新增Google pay開發包。
    通過Android SDK Manager下載
    這裡寫圖片描述

2.下載好之後找到eclipse的路徑,然後點選sdk->extras->google->play_billing,這裡就是剛才下載好的檔案目錄了。
這裡寫圖片描述

3.在專案src目錄下建立包名com.android.vending.billing,包名必須這樣寫。將IInAppBillingService.aidl檔案拷貝放入這個包名內,放入之後專案的gen目錄會自動生成相同包名的支付檔案;
這裡寫圖片描述

4.將sdk->extras->google->play_billing->samples->TrivialDrive下的工程內util包的檔案拷貝進你的專案內,如下圖(注意包名):
這裡寫圖片描述

5.支付的檔案和所用的工具類到這裡就匯入完成了,但是還有最重要的一個操作就是在AndroidManifest.xml檔案裡配置google支付的所需許可權:

<!-- google pay 必需許可權 -->
<uses-permission android:name="com.android.vending.BILLING" />
下來就是加入支付程式碼了。

6.加入google支付程式碼。第一步初始化:

/**
 * 自定義初始化方法
 */
protected void GooglePayInit() {
    //與Google的服務連線,並傳入金鑰驗證
//appkey為google開發者後臺稽核過後的publickey mHelper = new IabHelper(MainActivity.this, appkey); mHelper.enableDebugLogging(true); //初始化 mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { //失敗 if (!result.isSuccess()) { System.out.println("-------------------" + "初始化失敗"); return; } System.out.println("------------------------------" + "初始化成功"); if (mHelper == null) return; //初始化成功 //查詢可購買的商品,並實現查詢方法的回撥 mHelper.queryInventoryAsync(mGotInventoryListener); } }); }
初始化的程式碼很簡單,只需要傳入appkey進行驗證即可。

7.當初始化成功之後,需要進行查詢操作,實現查詢方法並處理回撥內容:

/**
     * 查詢商品的回撥
     */
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

            //非空
            if (mHelper == null) return;

            //庫存商品查詢成功
            if(result.isSuccess()){
                //輸出日誌,便於跟蹤程式碼
                System.out.println("--------------查詢成功");
                //庫存商品查詢成功後,進行與當前sku的匹配,確保當前傳入的sku在庫存中是否存在
                Purchase premiumPurchase = inventory.getPurchase("" + sku);
                //匹配到庫存中有當前的sku,說明查詢到了需要消耗的商品,執行消耗操作
                if(premiumPurchase != null){
                    System.out.println("--------------查詢需要消耗的商品之後執行消耗操作");
                    //google商品消耗方法,並實現消耗回撥
                    mHelper.consumeAsync(inventory.getPurchase("" + sku), mConsumeFinishedListener);
                //沒有查詢到要消耗的商品(可能已經消耗成功,或者該商品沒有購買過)
                }else {
                    //那就直接執行購買操作
                    Googlepay();
                }

            }
            //select失敗
            if(result.isFailure()){
                System.out.println("--------------查詢失敗");
            }
        }
    };
註釋已經很清楚了,這裡就不過多的解釋了。。。

8.查詢成功之後,判斷是否需要消耗,如果不需要消耗操作,直接發起購買,請看9。如果需要消耗,就實現消耗操作:

/**
     * 消耗回撥
     */
    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            //非空
            if (mHelper == null) return;

            //消耗成功方法
            if (result.isSuccess()) {
                //當消耗成功後,purchase為消耗成功的物件,判斷purchase的sku是否和當前的sku相同,確保消耗的商品正確
                //其實這行程式碼也是一句廢話,個人覺得還是比較一下比較好
                if (purchase.getSku().equals("" + sku)) {
                    System.out.println("------------消耗成功");
                    //因為google明確要求,需要先消耗後購買管理商品,所以當消耗成功後,發起購買
                    //購買方法
                    Googlepay();
                }
            }else {
                System.out.println("------------消耗失敗");
            }
        }
    };
注:根據個人的業務流程進行消耗。。。

9.當前如果不需要消耗,發起購買操作,並實現購買操作回撥方法:

/**
     * 自定義購買方法
     */
    protected void Googlepay() {

        //sku  當前商品的內購ID

        //inapp  因為google支付和iOS支付一樣,都是屬於應用內支付,所以這裡要傳inapp

        //RC_REQUEST  這個是作為支付請求程式碼傳

        //mPurchaseFinishedListener  購買回調

        //payload作為透傳引數,我這裡傳的是訂單號。
        //因為訂單號不能唯一,所以使用當前時間生成訂單號
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String payload = "m" + sdf.format(new Date());

        /**
         * 支付方法
         */
        mHelper.launchPurchaseFlow(MainActivity.this, sku, "inapp", RC_REQUEST, mPurchaseFinishedListener, payload);
    }
注:RC_REQUEST作為google官方支付請求程式碼:
   //支付請求程式碼
   static final int RC_REQUEST = 10001;

10.執行購買方法後,需要實現購買的回撥:

/**
* 購買回調
*/
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
      public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        //返回購買回調結果
        Log.d("TAG", "-----購買回調:" + result);
        //返回購買成功的商品
        Log.d("TAG", "-----購買回調:" + purchase);
        //非空
        if (mHelper == null) return;
        //失敗方法
          if(!result.isSuccess()){
            System.out.println("---------------購買失敗");
          }else {
            System.out.println("---------------購買成功");
            //支付成功之後如果需要重複購買的話,需要進行消耗商品
            //(這裡的消耗和查詢的消耗是一樣的方法,之所以呼叫兩次消耗方法,是因為害怕如果因為網路延遲在在某一步沒有消耗,所以做的一個加固消耗操作)
            if(purchase.getSku().equals("" + sku)){
                System.out.println("-------------支付成功之後如果需要重複購買的話,需要進行消耗商品");
                //執行下號方法
                mHelper.consumeAsync(purchase, mConsumeFinishedListener);       
            }   

    }
      }
  };
注:到這裡為止,所有的流程就已經結束了。如果配置OK的話,這時候的google介面就已經可以調出來了。

當然還要注意一些手機和google後臺配置方面的問題:

1.首先,測試用到的手機必須要有google服務和google框架;
2.測試所用的賬號需要繫結海外的信用卡,比如visa卡等等;
3.以上兩點具備之後,使用測試賬號登入google play商店,所看到的介面應該包含免費應用和付費應用兩種,才可以進行google支付的測試(IP問題);
4.應用提審到google後臺beta後,需要成為測試人員後,通過測試人員連結下載安裝包進行測試。
5.當支付介面提示“此版本的應用未配置為通過google play結算”,說明當前所用賬號非測試人員賬號;
6.當支付介面提示“您已擁有此商品”時,說明所購買的商品沒有被消耗成功。

當然了,當天時地利人和都佔據之後,並且對程式碼已經理解透徹,你就會覺得google支付是那麼的so easy!!!

好了,到這裡就結束啦,祝願大家都能工作順利,開開心心!

因為demo的apk因為CSDN稽核沒有通過,所以這裡就不附上apk了。。。

希望文章對大家有所幫助,歡迎留言哦!