zoukankan      html  css  js  c++  java
  • 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版本,要求签名和包名要与正式包的一样

    然后添加测试账号,测试账号要绑定信用卡,开发者账户>账户明细>许可测试,这个地方也要添加测试账号,这样就不会扣钱啦。。。

  • 相关阅读:
    Spring个人冲刺阶段总结
    开学测试代码
    《人月神话》读后感(三)
    《人月神话》读后感(二)
    《人月神话》读后感(一)
    记账本小程序7天开发记录(第七天)
    记账本小程序7天开发记录(第六天)
    记账本小程序7天开发记录(第五天)
    记账本小程序7天开发记录(第四天)
    记账本小程序7天开发记录(第三天)
  • 原文地址:https://www.cnblogs.com/hippos/p/6826932.html
Copyright © 2011-2022 走看看