GooglePlay内购In-app Billing 总结

GooglePlay内购In-app Billing 总结

GooglePlay支付的接入可以参考SDKgoogleapi的例子(sdk/google/play_billing/samples/TrivialDrive)

商品的说明:

Google Play 没有可重复购买商品这个概念,所有的“商品/充值档”用户成功购买过一次之后就不允许再次购买了。所以为了实现像应用内支付充值这种可重复购买的“商品/充值档”,Google Play 提供了一个消耗借口(ConsumingIn-app Products)。用户购买完商品后,调一下“消耗”接口,这样用户下次就可以继续购买了。

 

1. 产品分为不受管理的商品(消耗品,比如游戏中的金币)和受管理的商品(一次性购买即属于本账号,比如某些游戏需要玩家付费后才可以使用完整版本) 

2.  受管理类产品需要考虑如果玩家用同一个支付账号到别的设备完同一款游戏,这时需要考虑把那个设备也设置成已支付

 

GoolePlay说明:

1.手机连接Gooleplay,需要连接VPN,VPN最好是美国或日本的;

2.在打开GooglePlay商店之前,首先清理应用缓存,否则Google会认为是大陆地区,导致支付失败。然后打开GooglePlay商店,如果可以看到付费应用,则说明没有问题,可以正常进行支付;

3.要想付费成功,你使用的 Google Play 帐号必须绑定有海外支付能力的信用卡或者有海外支付能力的 Paypal 账户

 

三个回调:

1. IabHelper.OnIabPurchaseFinishedListener  支付完成的回,如果是受管理的商品在此回中直接可以道具用户;

2. IabHelper.OnConsumeFinishedListener  消耗完成的回不受管理的商品被成功消耗入此回,此时将不受管理的商品用户;

3. IabHelper.QueryInventoryFinishedListener  查询完成的回Restore Order候用,订单成功付款但由于种种原因(突然网、电等)收到Google支付成功的回调时,在里可以查询到此订单,此需要对订单进行处理(用户道具等)。

 

 

测试用的app一定要跟上传到Google的测试版的包名、版本code、name、签名一致,否则无法进行支付测试。

代码具体实现:

初始化IapHelper:

private static final String BASE64_PUBLIC_KEY=””;

mHelper = new IabHelper(this, BASE64_PUBLIC_KEY);

        // enable debuglogging (for a production application, you should set

        // this to false).

        mHelper.enableDebugLogging(true);

        // Start setup.This is asynchronous and the specified listener

        // will be calledonce setup completes.

        Log.d(TAG,"Starting setup.");

        mHelper.startSetup(newIabHelper.OnIabSetupFinishedListener() {

             public voidonIabSetupFinished(IabResult result) {

                 Log.d(TAG,"Setup finished.");

                 if(!result.isSuccess()) {

                     // Ohnoes, there was a problem.

                     complain("Problemsetting up in-app billing: " + result);

                     return;

                 }

                 iap_is_ok= true;

                 // Hooray,IAB is fully set up. Now, let's get an inventory of

                 // stuffwe own.

                 Log.d(TAG,"Setup successful. Querying inventory.");

                 mHelper.queryInventoryAsync(mGotInventoryListener);

             }

        });

调用查询接口:

mHelper.queryInventoryAsync(mGotInventoryListener);

调用支付接口:

mHelper.launchPurchaseFlow(TexasPoker.this, productId,

                                  RC_REQUEST,mPurchaseFinishedListener, orderId);

调用消耗接口:

mHelper.consumeAsync(mCurrentPurchase,mConsumeFinishedListener);

三个支付回调:

// Callback for when a purchase is finished

IabHelper.OnIabPurchaseFinishedListenermPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {

        public voidonIabPurchaseFinished(IabResult result, Purchase purchase) {

             Log.d(TAG,"Purchase finished: " + result + ", purchase: "

                     +purchase);

             if(result.isFailure()) {

                 // Oh noes

                 complain("Errorpurchasing: " + result);

                 return;

             }

             mCurrentPurchase= purchase;

             SysUtil.OnIabPurchaseFinished(0,purchase);

             Log.d(TAG,"Purchase successful.");

        }

    };

    // Called whenconsumption is complete

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =new IabHelper.OnConsumeFinishedListener() {

        public voidonConsumeFinished(Purchase purchase, IabResult result) {

             Log.d(TAG,"Consumption finished. Purchase: " + purchase

                     +", result: " + result);

             // We knowthis is the "gas" sku because it's the only one we

             // consume,

             // so we don'tcheck which sku was consumed. If you have more than

             // one

             // sku, youprobably should check...

             if(result.isSuccess()) {

                 //successfully consumed, so we apply the effects of the item in

                 // our

                 // gameworld's logic, which in our case means filling the gas

                 // tank abit

                 Log.d(TAG,"Consumption finished. Success!");

                 //showMessage("支付成功","成功购买" + nPurchaseNum + "万能豆!");

//               SysUtil.OnIabConsumeFinished(0,nPurchaseNum);

                 SysUtil.OnPayCallback(tradeNo);

                 mCurrentPurchase= null;

                 nPurchaseNum= 0;

                 tradeNo ="";

             } else {

                 complain("Errorwhile consuming: " + result);

             }

        }

    };

// Listener that's called when we finish querying the items weown

IabHelper.QueryInventoryFinishedListener mGotInventoryListener =new IabHelper.QueryInventoryFinishedListener() {

        public voidonQueryInventoryFinished(IabResult result,

                 Inventoryinventory) {

             Log.d(TAG,"Query inventory finished.");

             if(result.isFailure()) {

                 complain("Failedto query inventory: " + result);

                 return;

             } 

             Log.d(TAG,"Query inventory was successful.");

             List<Purchase>listPurchase = inventory.getAllPurchases();

             // 如果有多个未消耗的商品,每次消耗第一个

             if(listPurchase.size() > 0) { 

                 Purchasepurchase = listPurchase.get(0);

                 mCurrentPurchase= purchase;

                 SysUtil.OnIabPurchaseFinished(0,purchase);

             }

        }

    };

在Unity中使用Google Play In-app Billing API允许开发者向用户销售虚拟商品或服务,包括非消耗品、消耗品和服务等。以下是基本的步骤: 1. **添加Google Play服务库**:在Unity中,去Assets->Import Package->Google Services,选择Google Play Services版本并导入。确保Unity支持的最低API级别兼容Google Play服务。 2. **初始化IABHelper**:创建一个`IabHelper`实例,传入上下文和需要的商品类型的字符串(如`IabHelper.SkuType.AndroidMarket`代表付费内容): ```csharp using GooglePlayServices.Iap; ... IabHelper iabHelper = new IabHelper(Context, "com.example.your_game_publisher_android_market_id"); ``` 记得替换`your_game_publisher_android_market_id`为实际的包名。 3. **授权和库存查询**: - 获取用户授权:`iabHelper.StartConnection()`。 - 查询商品库存:`iabHelper.QueryInventoryAsync()`方法,获取用户已买的商品信息。 4. **买操作**: - `Purchase`结构体包含了用户买的信息,如果用户买成功,可以使用`iabHelper.ConsumeAsync()`来消耗物品(如有必要)。 ```csharp var purchaseResult = iabHelper.PurchaseAsync(productId); purchaseResult.OnSuccess += OnPurchaseSuccessful; ``` 5. **回调处理**:定义回调函数来处理物流程的结果,比如`OnPurchaseSuccessful`用于处理成功的买。 6. **完成交易后关闭连接**:当用户买结束后,记得关闭连接:`iabHelper.Disconnect()`。 7. **测试和发布**:在Unity编辑器中使用模拟器测试买过程,然后在Google Play Console管理应用内的产品,发布到生产环境。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值