Android Eclipse实现Google Pay内支付

现在越来越多的人都开始接触了海外的支付方式,而google的官方支付作为一大支付方式,并且对接过程中遇到的坑较多,而我们又有可能用到,所以今天在这里写一下之前对接google的一些自我理解。希望可以帮助到大家:

先贴一份我对接Google支付的流程图:(根据实际操作来进行流程修改)

这里写图片描述

google支付demo效果图:
这里写图片描述

其实google的内支付很简单,只是对于手机的要求比较特殊,需要手机有google框架和服务,这个在网上一搜一大把的。这里就不说了啊。我接下来就开始直接进行项目的配置:

重点内容

  1. 添加Google pay开发包。
    通过Android SDK Manager下载
    这里写图片描述

2.下载好之后找到eclipse的路径,然后点击sdk->extras->google->play_billing,这里就是刚才下载好的文件目录了。
这里写图片描述

3.在项目src目录下创建包名com.android.vending.billing,包名必须这样写。将IInAppBillingService.aidl文件拷贝放入这个包名内,放入之后项目的gen目录会自动生成相同包名的支付文件;
这里写图片描述

4.将sdk->extras->google->play_billing->samples->TrivialDrive下的工程内util包的文件拷贝进你的项目内,如下图(注意包名):
这里写图片描述

5.支付的文件和所用的工具类到这里就导入完成了,但是还有最重要的一个操作就是在AndroidManifest.xml文件里配置google支付的所需权限:

<!-- google pay 必需权限 -->
<uses-permission android:name="com.android.vending.BILLING" />
下来就是加入支付代码了。

6.加入google支付代码。第一步初始化:

/**
 * 自定义初始化方法
 */
protected void GooglePayInit() {
    //与Google的服务连接,并传入密钥验证
    //appkey为google开发者后台审核过后的publickey
    mHelper = new IabHelper(MainActivity.this, appkey);
    mHelper.enableDebugLogging(true);
    //初始化
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            //失败
            if (!result.isSuccess()) {
                System.out.println("-------------------" + "初始化失败");
                return;
            }
            System.out.println("------------------------------" + "初始化成功");
            if (mHelper == null) return;
            //初始化成功   
            //查询可购买的商品,并实现查询方法的回调
            mHelper.queryInventoryAsync(mGotInventoryListener);
        }
    });
}
初始化的代码很简单,只需要传入appkey进行验证即可。

7.当初始化成功之后,需要进行查询操作,实现查询方法并处理回调内容:

/**
     * 查询商品的回调
     */
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

            //非空
            if (mHelper == null) return;

            //库存商品查询成功
            if(result.isSuccess()){
                //输出日志,便于跟踪代码
                System.out.println("--------------查询成功");
                //库存商品查询成功后,进行与当前sku的匹配,确保当前传入的sku在库存中是否存在
                Purchase premiumPurchase = inventory.getPurchase("" + sku);
                //匹配到库存中有当前的sku,说明查询到了需要消耗的商品,执行消耗操作
                if(premiumPurchase != null){
                    System.out.println("--------------查询需要消耗的商品之后执行消耗操作");
                    //google商品消耗方法,并实现消耗回调
                    mHelper.consumeAsync(inventory.getPurchase("" + sku), mConsumeFinishedListener);
                //没有查询到要消耗的商品(可能已经消耗成功,或者该商品没有购买过)
                }else {
                    //那就直接执行购买操作
                    Googlepay();
                }

            }
            //select失败
            if(result.isFailure()){
                System.out.println("--------------查询失败");
            }
        }
    };
注释已经很清楚了,这里就不过多的解释了。。。

8.查询成功之后,判断是否需要消耗,如果不需要消耗操作,直接发起购买,请看9。如果需要消耗,就实现消耗操作:

/**
     * 消耗回调
     */
    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            //非空
            if (mHelper == null) return;

            //消耗成功方法
            if (result.isSuccess()) {
                //当消耗成功后,purchase为消耗成功的对象,判断purchase的sku是否和当前的sku相同,确保消耗的商品正确
                //其实这行代码也是一句废话,个人觉得还是比较一下比较好
                if (purchase.getSku().equals("" + sku)) {
                    System.out.println("------------消耗成功");
                    //因为google明确要求,需要先消耗后购买管理商品,所以当消耗成功后,发起购买
                    //购买方法
                    Googlepay();
                }
            }else {
                System.out.println("------------消耗失败");
            }
        }
    };
注:根据个人的业务流程进行消耗。。。

9.当前如果不需要消耗,发起购买操作,并实现购买操作回调方法:

/**
     * 自定义购买方法
     */
    protected void Googlepay() {

        //sku  当前商品的内购ID

        //inapp  因为google支付和iOS支付一样,都是属于应用内支付,所以这里要传inapp

        //RC_REQUEST  这个是作为支付请求代码传

        //mPurchaseFinishedListener  购买回调

        //payload作为透传参数,我这里传的是订单号。
        //因为订单号不能唯一,所以使用当前时间生成订单号
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String payload = "m" + sdf.format(new Date());

        /**
         * 支付方法
         */
        mHelper.launchPurchaseFlow(MainActivity.this, sku, "inapp", RC_REQUEST, mPurchaseFinishedListener, payload);
    }
注:RC_REQUEST作为google官方支付请求代码:
   //支付请求代码
   static final int RC_REQUEST = 10001;

10.执行购买方法后,需要实现购买的回调:

/**
* 购买回调
*/
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
      public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        //返回购买回调结果
        Log.d("TAG", "-----购买回调:" + result);
        //返回购买成功的商品
        Log.d("TAG", "-----购买回调:" + purchase);
        //非空
        if (mHelper == null) return;
        //失败方法
          if(!result.isSuccess()){
            System.out.println("---------------购买失败");
          }else {
            System.out.println("---------------购买成功");
            //支付成功之后如果需要重复购买的话,需要进行消耗商品
            //(这里的消耗和查询的消耗是一样的方法,之所以调用两次消耗方法,是因为害怕如果因为网络延迟在在某一步没有消耗,所以做的一个加固消耗操作)
            if(purchase.getSku().equals("" + sku)){
                System.out.println("-------------支付成功之后如果需要重复购买的话,需要进行消耗商品");
                //执行下号方法
                mHelper.consumeAsync(purchase, mConsumeFinishedListener);       
            }   

    }
      }
  };
注:到这里为止,所有的流程就已经结束了。如果配置OK的话,这时候的google界面就已经可以调出来了。

当然还要注意一些手机和google后台配置方面的问题:

1.首先,测试用到的手机必须要有google服务和google框架;
2.测试所用的账号需要绑定海外的信用卡,比如visa卡等等;
3.以上两点具备之后,使用测试账号登录google play商店,所看到的界面应该包含免费应用和付费应用两种,才可以进行google支付的测试(IP问题);
4.应用提审到google后台beta后,需要成为测试人员后,通过测试人员链接下载安装包进行测试。
5.当支付界面提示“此版本的应用未配置为通过google play结算”,说明当前所用账号非测试人员账号;
6.当支付界面提示“您已拥有此商品”时,说明所购买的商品没有被消耗成功。

当然了,当天时地利人和都占据之后,并且对代码已经理解透彻,你就会觉得google支付是那么的so easy!!!


好了,到这里就结束啦,祝愿大家都能工作顺利,开开心心!

最后附上demo源码:
http://download.csdn.net/download/qq_35840038/10107182

因为demo的apk因为CSDN审核没有通过,所以这里就不附上apk了。。。

希望文章对大家有所帮助,欢迎留言哦!

猜你喜欢

转载自blog.csdn.net/qq_35840038/article/details/78459278