Google in app billing 应用内支付

一 简介

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

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

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

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

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


二 实现步骤

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

1 : 服务集成

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

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

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

Google in app billing 应用内支付_第1张图片

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

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

Google in app billing 应用内支付_第2张图片


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

Google in app billing 应用内支付_第3张图片

这里写图片描述


2 : 支付流程

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

下面是基本序列图:

Google in app billing 应用内支付_第4张图片

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

从上图可以看出,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 in app billing 应用内支付_第5张图片


检测连接服务,与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 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支付默认的所有受管理商品都是非消耗性的商品,购买一次就默认为被拥有 状态,无法继续购买,如果我们想让应用的道具成为消耗性商品,就需要主动把非消耗性的商品消耗掉,变成了未拥有状态即可再次购买.

Google in app billing 应用内支付_第6张图片
通过如下方法消耗:

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.");
        }
    };

测试

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

准备

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

主要步骤

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

Google in app billing 应用内支付_第7张图片

Google in app billing 应用内支付_第8张图片


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

你可能感兴趣的:(android)