GooglePlay内购总结In-app Billing集成测试流程

来源:互联网 发布:电脑vpn软件 编辑:程序博客网 时间:2024/05/21 09:47
APP内购开发工作流程:

一,GooglePlay后台相关操作:
        
     1,提供apk的Google Play的接入公钥(Base64编码的RSA公共密钥),即Public Key。

     2,设置商品购买属性:

        受管理的商品:每个帐号只能购买一次,不能重复购买的商品。例如:激活码、解锁关卡等。

        不受管理的商品:该商品可重复购买。包含支付完须消费,没消费的不可能重复购买,这步对消费者是透明的。例如:金币、钻石等。

        订阅:通过按月或按年结算的方式在应用内向用户销售内容、服务或功能。

     3,添加Alpha版测试人员。(必须提交Alpha版进行测试)

     4,测试账号需有国际支付能力。(测试并不会扣除费用)


 二,开发流程:
 
     1,在AndroidManifest中添加如下权限:

        <uses-permission android:name="com.android.vending.BILLING" />
     
     2,添加In-app Billing(后面简称iab)库。其实就是IInAppBillingService.aidl这个文件,

        从例子工程里找到它,copy到自己工程下的src下的包com.android.vending.billing里面,再把例子工程里的src下的包com.example.android.trivialdrivesample.util下面的程序copy到自己工程.

        (如报错先clean项目)

     3,初始化in-app Billing api。

         IabHelper是一个封装了购买-消耗的个工具类,queryInventoryAsync是订单查询方法。注意替换实际的公钥(Google Play后台创建应用里,在服务和API这项可以找到,一串Base64编码的字符串)。

         在次方法中得到商品状态及用户购买信息(如购买过则提供恢复购买),订阅类商品时限等。

         startSetup 的操作是检查是否有权限和连接到Google Billing service是否成功;这里回调的操作是如果成功,调用queryInventoryAsync查看产品id是否可以使用;

         查询完成后会调用IabHelper.QueryInventoryFinishedListener 这个回调接口进行通知,在这个接口中可以获取商品的详细信息SkuDetails和Purchase信息。

     4,支付。在发起购买请求的时候,调用以下代码。sku参数为对应Google Play后台配置的商品品项id。

        受管理商品: mHelper.launchPurchaseFlow(this, SKU_GAS, RC_REQUEST,mPurchaseFinishedListener, payload);   

                     mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,mPurchaseFinishedListener, payload);

        订阅商品:mHelper.launchPurchaseFlow(this, mSelectedSubscriptionPeriod, IabHelper.ITEM_TYPE_SUBS,oldSkus, RC_REQUEST, mPurchaseFinishedListener, payload);             
    
    5,消耗。一般是在支付成功或查询成功的回调里调用消费方法。

       注意:不受管理的商品,在支付完需要调用消费。不然,没法重复购买。IabHelper.consumeAsync(Purchase purchase, OnConsumeFinishedListener listener)

    6, 查询。在查询回调里,检测如果存在支付但没消费的商品,继续调用消费。可用于漏单处理。直接放在IapHelper初始化中即可。   

         IabHelper.queryInventoryAsync(QueryInventoryFinishedListener listener)

    7,销毁。一般是在主Activity的onDestory里执行。

       public void onDestroy() {
        super.onDestroy();
    
        // very important:
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
        }


三,内购过程中安全类加密验证:

    1,APK签名的自身验证。

    2,Public Key存到服务器端,每次请求(加密)。

    3,购买成功后向服务器发送订单信息。

    4,用于是否购买的本地验证。(广告展示前判断)。

    5,apk打包后再加固。



    {"orderId":"GPA.3365-7352-0446-58529","packageName":"com.callerid.block","productId":"free_ad_plan","purchaseTime":1495008953203,"purchaseState":0,"developerPayload":"73d7effc686f670c89679128f239064f","purchaseToken":"kpiaipjanpkdgnjdakjofcgk.AO-J1OyfnUDifBnHoFUYzkPzpXyUfANFGlJuhZcqIelPw44PTC4-l9PT144MALqN1ndfJQP3ck-vDCQv_If77BElevgbYEYvXzPGICJuLEIWcfu0s4a4gVA","autoRenewing":true}