美文网首页
Google inapp 代码实现

Google inapp 代码实现

作者: 杨hai | 来源:发表于2018-10-31 17:22 被阅读43次

继上一篇Google 内购及登录和Facebook登录的KEY 申请和可能遇到的问题,总结一篇客户端和服务器的整体流程。

首先需要明白以下概念
  1. Google inapp分为购买mHelper.launchPurchaseFlow(context, productId, RC_REQUEST, mPurchaseFinishedListener, payload);和消耗mHelper.consumeAsync(purchase, mConsumeFinishedListener);两个步骤。如果购买成功,再调用消耗方法,下次可以继续购买。如果购买成功,不调用消耗的方法,那么下次将不能再次购买,返回的错误码为7。
  2. 调用查询方法mHelper.queryInventoryAsync(mGotInventoryListener);,可以查询到当前用户未消耗的商品。
代码实现

我对官方提供的demo进行了修改,将其支付相关代码抽取成了一个独立的moudle,打包成jar在项目中使用,因为该模块不涉及到任何的资源文件所以没用使用aar。

初始化
 String base64EncodedPublicKey = "xxxxxxxx";
              googlePay = new GooglePay(this, base64EncodedPublicKey, new GooglePayStatus() {

            /**
             * 初始化失败是,调用该方法。在调用购买时,需要对该参数进行判断
             * https://www.jianshu.com/p/87ffdb7bc439
             * 该文章有提到解决方法
             *
             * @param boo
             */
            @Override
            public void initFailed(boolean boo) {

            }

            @Override
            public void onGgStatus(int code) {

            }

            @Override
            public void onBuySuccess(OrderParam data) {
                //说明用户购买成功
                //TODO 如果设置setIsAutoConsume未false,不自动消耗。将购买订单上传到服务器,服务器到Google 服务器校验订单成功时,手动调用消耗方法
                if (googlePay != null) {
                    googlePay.consumeAsync(data.currBuyType, data.purchaseData, data.dataSignature);
                }
            }

            @Override
            public void onConsumeSuccess() {
                //说明用户消耗商品成功
            }

            @Override
            public void unConsumeAsync(Purchase purchase) {
                //如果设置setIsAutoConsume未false,用户上次有未消耗的商品,会自动回调该方法,此时上传服务器校验,如果校验成功,手动调用消耗方法
                if (googlePay != null) {
                    googlePay.consumeAsync(purchase.getItemType(), purchase.getOriginalJson(), purchase.getSignature());
                }
            }
        });
注册回调

如果不调用该方法googlePay.handleActivityResult(requestCode, resultCode, data)那么支付成功后的参数将不能获取到。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (googlePay == null) return;

        // Pass on the activity result to the helper for handling
        if (!googlePay.handleActivityResult(requestCode, resultCode, data)) {
            // not handled, so handle it ourselves (here's where you'd
            // perform any handling of activity results not related to in-app
            // billing...
            super.onActivityResult(requestCode, resultCode, data);
        } else {
        }
    }
释放对象
 @Override
    protected void onDestroy() {
        super.onDestroy();
        if (googlePay != null) {
            googlePay.DestoryQuote();
        }
    }
购买商品方法
/**
     * 用于购买商品
     *
     * @param context
     * @param productId  Google play store 后台定义的商品的id。如果错误的话,将提示检索失败
* @param payload   该字段随机生成一定长度的字符串,用于生成的订单支付成功后根据google返回的订单信息关联。
     */
    public void buyGoods(Activity context, String productId, String payload) {
        Log.i("payload", "GpGoods:" + payload);
        try {
            mHelper.launchPurchaseFlow(context, productId, RC_REQUEST,
                    mPurchaseFinishedListener, payload);
        } catch (IabHelper.IabAsyncInProgressException e) {
//            complain("Error launching purchase flow. Another async operation in progress.");
//            setWaitScreen(false);
            if (listener != null) {
                listener.onGgStatus(OnGooglePayStatusListener.INAPP_FAILED);
            }
        }
    }
订阅商品方法
 /**
     * 用于订阅商品
     *
     * @param context
     * @param productId  Google play store 后台定义的商品的id。如果错误的话,将提示检索失败
* @param payload   该字段随机生成一定长度的字符串,用于生成的订单支付成功后根据google返回的订单信息关联。
     */
    public void subsGoods(Activity context, String productId, String payload) {
        Log.i("payload", "subsGoods:" + payload);
        try {
            mHelper.launchSubscriptionPurchaseFlow(context, productId, RC_REQUEST,
                    mPurchaseFinishedListener, payload);
        } catch (Exception e) {
//            complain("Error launching purchase flow. Another async operation in progress." + e);
//            setWaitScreen(false);
            if (listener != null) {
                listener.onGgStatus(OnGooglePayStatusListener.SUBS_FAILED);
            }
        }
    }

常用方法和参数说明
  1. googlePay.setIsAutoConsume(true); 方法设置为true时,购买完成后会自动调用消耗方法。构造函数中的第三个参数的 void unConsumeAsync(Purchase purchase);方法不会被回调。
  2. 初始化第三个参数的方法说明
对上面的第三个参数的回调方法进行说明
/**
 * 初始化失败是,调用该方法。在调用购买时,需要对该参数进行判断
 * https://www.jianshu.com/p/87ffdb7bc439
 * 该文章有提到解决方法
 *
 * @param boo
 */
public abstract void initFailed(boolean boo);

/**
 * 各种的支付过程中的状态
 *
 * @param code
 */
public abstract void onGgStatus(int code);

/**
 * 调用购买或订阅成功时会回调该方法
 *
 * @param data 返回Google  pay购买成功返回的参数
 */
public abstract void onBuySuccess(OrderParam data);

/**
 * 调用消耗商品成功
 */
public abstract void onConsumeSuccess();

/**
 * <p>
 * public void setIsAutoConsume(boolean isAutoConsume) {
 * this.isAutoConsume = isAutoConsume;
 * }
 * <p>
 * setIsAutoConsume 设置为true时,将会自动消耗不需要重写该方法,不会回调该方法。设置为false,需要手动调用消耗方法
 *
 * @param purchase
 */
public void unConsumeAsync(Purchase purchase) {

}
代码混淆

配置aidl文件不被混淆

-keep class com.android.vending.billing.**{*;}

demo地址

相关文章

  • Google inapp 代码实现

    继上一篇Google 内购及登录和Facebook登录的KEY 申请和可能遇到的问题,总结一篇客户端和服务器的整体...

  • Google Inapp接入流程

    18年初接入Google Inapp时,一路坎坷,收款时总是支付遭拒,为了排除原因,各种糟心的经历!然而,相同的代...

  • Google订阅

    订阅和内容有哪些不一样?1.1. 传入的参数不一样接入过Google inapp的知道,订阅方法和内购方法唯一的...

  • go实现安全并发map读写

    参考 E:\svn\golang\pkg\mod\github.com\i!google-ink\gopay 代码实现

  • 每周阅读(6/27)

    HashMap的实现和原理,如何运用红黑树实现扩容优化。Java8系列之重新认识HashMap Google的代码...

  • 卷积神经网络工作原理研究 - Inception V3源代码

    Inception V3源代码(Slim实现) 整体架构 Google的Tensorflow已经在Github上开...

  • 利用 travis 实现自动部署到 google cloud

    目标 实现 git push 后,自动将代码发布到 google 云服务器 compute engine。其它服务...

  • AES,Base64遇到的问题

    可能是google在sun官司上吃亏了,现在基本上相关的java代码在google上也有一套新的实现。近几天在客户...

  • 单工程维护多项目

    实现前提 原生工程的升级 升级到android studio的理由 Google推出的 速度更快 UI更漂亮 代码...

  • 编写地道的Go代码

    最地道的Go代码就是Go的标准库的代码,有空的时候可以多看看Google的工程师是如何实现的。 注释 可以通过/*...

网友评论

      本文标题:Google inapp 代码实现

      本文链接:https://www.haomeiwen.com/subject/layatqtx.html