google內購In-App Billing


開發環境eclipse,下載內購需要的文件sdkManager,windows>android SDK manager>Extra..

將下載文件中的

拷到src下面,代碼里要用的下面文件

初始化

//產品ID列表
public static String[] productID_Array = {"60crystal", "300crystal", "980crystal", "1980crystal", "3280crystal", "6480crystal", "3000crystalmonth"};
//購買列表
public static Vector<Purchase> inventory_list = new Vector<Purchase>();

        String base64EncodedPublicKey = "";
        mHelper = new IabHelper(this, base64EncodedPublicKey);
        mHelper.enableDebugLogging(false);
        //執行服務綁定
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() 
        {
            public void onIabSetupFinished(IabResult result) 
            {
                if (!result.isSuccess()) {
                    return;
                }
                //產品id列表
                List<String> productList = new ArrayList<String>();
                for(int i = 0; i < productID_Array.length; i++)
                {
                    productList.add(productID_Array[i]);    
                } 
                //記錄初始化是否成功的狀態
                googleplay_iap = true;
                //檢索產品詳細信息
                mHelper.queryInventoryAsync(true, productList, mGotInventoryListener);                
            }
        });

base64EncodedPublicKey是googleplay后台的發布產品的時候生成提供的,最好放在服務端

//檢索購買信息回調
    static IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {            
            if (result.isFailure()) {
                Log.i("購買信息回調:","失敗");
                return;
            }
            Log.i("", "檢索購買信息且回調成功.");
            for(int i = 0; i < productID_Array.length; i++)
            {
                //返回應用內商品的商品詳情
                SkuDetails data=inventory.getSkuDetails(productID_Array[i]);
                if(data != null)
                {
                    //將放到列表中 1(未用到price,好像沒用)
                    detail_list.addElement(data);
                }
                
                //返回給定產品的購買信息,如果沒有購買,則返回null。
                final Purchase premiumPurchase = inventory.getPurchase(productID_Array[i]);
                if(premiumPurchase != null)
                {
                    //將產品購買信息放到列表中 1
                    Log.i("說明還有未消耗的產品","++++");
                    inventory_list.addElement(premiumPurchase);
                }     
            }

            if(inventory_list.size() > 0)
            {
                Log.i("進入處理消耗","++++");
                //繼續請求消耗
                ConsumeOrder(inventory_list.elementAt(0).getSku());
            }
        }
    };    
    
    
    // 充值請求
    public static void doCharge(final String data)
    {
        JSONObject joRes;
        try {
            joRes = new JSONObject(data);
            extraData = joRes.optString("orderId");
            payIndex = Integer.parseInt(joRes.optString("index"));
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        if (!googleplay_iap) {
            return;
        }

        payProductID = productID_Array[payIndex-1]; // 當前索引對應的訂單id
        for (int i = 0; i < inventory_list.size(); i++) {
            if (payProductID.equals(inventory_list.elementAt(i).getSku())) {
                Log.i(TAG, "訂單已擁有++");
                return;
            }
        }
        
        if (mHelper.mAsyncInProgress) {
            mHelper.flagEndAsync();
        }
        mainThreadHandler.post(new Runnable() {
            public void run() {
                mHelper.launchPurchaseFlow(instance, payProductID, RC_REQUEST,
                        mPurchaseFinishedListener, extraData);
            }
        });

    }
            
    // google 購買回調
    static IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            if (result.isFailure()) {
                Log.i("", "支付回調失敗++");
                return;
            }
            Log.i("", "支付回調成功++");
            final String curPid = purchase.getSku();
            try {
                JSONObject json = new JSONObject();
                json.put("ggOrderId", purchase.getOrderId());
                json.put("myOrderId", purchase.getDeveloperPayload());
                json.put("signture", purchase.getSignature());
                json.put("signtureJson", purchase.getOriginalJson());
                
                Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString(
                        "platformGoogleRequestItem", json.toString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            
            inventory_list.addElement(purchase); // 4
            instance.runOnGLThread(new Runnable() {
                public void run() {                    
                    ConsumeOrder(curPid);
                }
            });
        }
    };
                


    // 消耗
    public static void ConsumeOrder(String consumeProductID) {
        if (!googleplay_iap) {
            return;
        }
        if (consumeProductID != "") {
            for (purchaseIndex = 0; purchaseIndex < inventory_list.size(); purchaseIndex++) // 5
            {
                if (consumeProductID.equals(inventory_list.elementAt(purchaseIndex).getSku())) {
                    mainThreadHandler.post(new Runnable() {
                        public void run() {
                            // 向google發送消費請求
                            Log.i("", "向google發送消費請求。。");
                            mHelper.consumeAsync(inventory_list.elementAt(purchaseIndex),mConsumeFinishedListener);
                        }
                    });
                    break;
                }
            }
        }
    }
     
    // 消耗回調
    static IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            
            //從訂單列表中取消消耗過的訂單
            for (int i = 0; i < inventory_list.size(); i++) {
                if (purchase.getSku().equals(inventory_list.elementAt(i).getSku())) {
                    inventory_list.remove(i);
                    Log.i("", "從訂單列表中移除消耗過的訂單。。");
                    break;
                }
            }

            instance.runOnGLThread(new Runnable() {
                public void run() {
                    // 7如果有未消耗訂單繼續請求消耗
                    if (inventory_list.size() > 0) {
                        // 繼續請求消耗
                        ConsumeOrder(inventory_list.elementAt(0).getSku());    
                    }
                }
            });
        }
    };

 

platformGoogleRequestItem是客戶端函數,需要請求本地服務器發送游戲貨幣

再說測試,測試可以出個測試包上傳到googleplay后台的alpha版本或者beta版本,要求簽名和包名要與正式包的一樣

然后添加測試賬號,測試賬號要綁定信用卡,開發者賬戶>賬戶明細>許可測試,這個地方也要添加測試賬號,這樣就不會扣錢啦。。。

 


免責聲明!

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



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