Google in app billing 应用内支付

    xiaoxiao2021-03-26  6

    一 简介

    Google in app billing 是google play 商店的应用内支付,他是一种应用内的虚拟的道具支付服务,支持应用内支付(inapp)和订阅(subs)两种模式; 在中国,如果你的应用要集成这个服务,需要注意有三点:

    in app billing不支持中国服务,不能绑定国内的信用卡(借记卡)in app的受管理商品中的本地价格不支持人民币支付金额中会收取30%的手续费

    当然的这些都是可以解决的,因为google play的应用内支付是国外的用户的一个主流消费模式.还是很多应用需要踩着坑去集成,比如说:

    卖虚拟道具的国际版应用 卖关卡版本的付费应用等等.

    本文主要是对version 3版本的in-app支付集成和介绍.


    二 实现步骤

    注: 前提已经在Google play 开发者平台完成注册开发者账号和绑定应用 地址: http://play.google.com/apps/publish/

    1 : 服务集成

    请参考官网详细示例(不需要翻墙)

    下面是对上面的链接地址步骤简单的介绍:

    打开SDK Manager ,在Extras的文件夹下面下载Google play billing library

    然后可以在本地的SDK的play_billing目录下发现如下文件列表:

    samples 是官方的一个demo,修改包名可以直接集成到自己项目 IInAppBillingService.aidl是我们需要集成在项目中的AIDL文件


    集成步骤很简单,本人是直接修改了官网的samples,然后打成了jar包[点击Jar包下载],当然大家也可以自己封装使用 最终我集成的项目中也只要包含这两个文件即可,当然Manifest中的相关权限是不能忘记的


    2 : 支付流程

    注: 最详细官网的支付流程(不需要翻墙)

    下面是基本序列图:

    注: 这个序列图主要是针对非消耗性的管理商品 ,购买一次即为被拥有状态,无法再次购买.

    从上图可以看出,App自己的后台不参与Google in app的支付处理,直接由客户端和Google Play完成;而其中的两次与客户端对接的作用是:

    一: 我们把Google Play中的key没有直接明文写在App客户端,而是通过自己的后台拉去,是为了安全考虑 二: 购买完成后的订单信息上传给自己的服务器,既可以保存订单记录,又可以对用户购买商品的信息进行管理


    非消耗性商品

    获取key值,根据key值初始化工具类

    private void initBilling() { //需要传入的key值 String base64EncodedPublicKey = "你的google play key "; mHelper = new IabHelper(this, base64EncodedPublicKey.trim()); //开启调试 mHelper.enableDebugLogging(true); startUp(); }

    key值在Google控制台的如下位置;


    检测连接服务,与Google Play进行连接

    private void startUp() { if (null == mHelper) return; //检测连接服务 mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult iabResult) { if (null == iabResult) return; if (!iabResult.isSuccess()) { isInitSuccess = false; L.e(TAG, "onIabSetupFinished:初始化失败,请重试 " + iabResult); return; } isInitSuccess = true; } }); }

    注: 查询list中指定的商品,如果不指定则查询默认的所以商品信息,这里指定 SKU_POPCOIN,和SKU_POPCOIN1两个商品.

    List<String> additionalSkuList = new ArrayList<>(); additionalSkuList.add(SKU_POPCOIN); additionalSkuList.add(SKU_POPCOIN1); mHelper.flagEndAsync(); mHelper.queryInventoryAsync(true, additionalSkuList, mGotInventoryListener);

    购买指定ID购买商品,这里购买ID为SKU_POPCOIN商品

    if(mHelper == null) return; mHelper.flagEndAsync(); mHelper.launchPurchaseFlow(this, SKU_POPCOIN, BILL_REQUEST_CODE, mPurchaseFinishedListener, WDApp.getInstance().getLoginUserId());

    处理返回的结果

    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == BILL_REQUEST_CODE) { if (mHelper == null) return; if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { //在这里可以把订单信息传给自己的服务器 L.e(TAG, "onActivityResult: " + resultCode); super.onActivityResult(requestCode, resultCode, data); } else { L.e(TAG, "onActivityResult handled by IABUtil."); } }

    商品消耗

    注: Google billing支付默认的所有受管理商品都是非消耗性的商品,购买一次就默认为被拥有 状态,无法继续购买,如果我们想让应用的道具成为消耗性商品,就需要主动把非消耗性的商品消耗掉,变成了未拥有状态即可再次购买.

    通过如下方法消耗:

    mHelper.consumeAsync(inventory.getPurchase(SKU_POPCOIN), mConsumeFinishedListener);

    主要有两次调用的地方: 1:购买成功后调用消耗’被拥有’状态 2:查询商品时,判断有没有’被拥有’状态的商品,如果有就消耗状态.

    mConsumeFinishedListener是一个回调的接口,返回消耗商品是否成功

    // Called when consumption is complete IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result); // if we were disposed of in the meantime, quit. if (mHelper == null) return; if (result.isSuccess()) { //消费成功 Log.d(TAG, "Consumption successful. Provisioning."); } else { showToast("Error while consuming: " + result); } Log.d(TAG, "End consumption flow."); } };

    测试

    注: 务必参考的官方测试文档

    准备

    支持Google Play 商店的 Android 手机Google Play支持的非国内信用卡(借记卡)

    主要步骤

    1.上传一个已经集成Google billing支付的App到google play的控制台的beta或者Alpha渠道上. 2.建立一个 受管理的商品列表,包含你要出售的商品,包括ID,价格,描述等.创建商品列表 3.App开发者平台账号需要绑定信用卡(用于收款). 4.添加测试账号,测试账号不能是App平台账号. 5.发布的测试版本通过之后,会有一个测试的下载链接,把这个链接发给需要测试的账号人员,点击成为测试员即可. 6.测试账号需要绑定非国内的信用卡(用于支付),测试账号需要绑定支持play 商店的手机.


    注: 1. 测试过程不会消耗费用. 2. 上传的版本需要在原来的版本上增加,测试版只要上传一次即可.只要连接走通,如果有bug也不需要继续上传,直接用修改后的版本测试即可 3. 必须有签名,而且不同的版本签名要保持一致. 4. 包名必须与控制台的包名一致.

    转载请注明原文地址: https://ju.6miu.com/read-500106.html

    最新回复(0)