開發環境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版本,要求簽名和包名要與正式包的一樣
然后添加測試賬號,測試賬號要綁定信用卡,開發者賬戶>賬戶明細>許可測試,這個地方也要添加測試賬號,這樣就不會扣錢啦。。。