GooglePlay支付使用总结二

GooglePlay支付使用总结2

支付内容详解

接上一篇的内容,本篇讲解具体支付里面的东西。
本人由于公司项目需要,我是在fragment里面使用支付功能的,官方的demo,是在Activity里面进行调用的。

1 构造IabHelper实例。

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHelper = new IabHelper(getActivity(), MyApplication.GOOGLE_APP_BILLING_KEY);
        mHelper.enableDebugLogging(true);
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {
                if (!result.isSuccess()) {
                    // Oh noes, there was a problem.
                    Log.d(TAG, "Problem setting up In-app Billing: " + result);
                    return;
                }
                if (mHelper == null) return;
                // Hooray, IAB is fully set up!
                initQueryItemInfos();
            }
        });
        Log.d(TAG, mHelper.toString());
    }

需要实例化IabHelper对象,传入的参数为当前应用的public_key的base64编码值,在google play后台存放的有。

接着启动debug

添加一个监听器,做一些初始化的工作,上面的代码的意思,说的是构建完IabHelper后,触发initQueryItemInfos()的任务。

说一下我这种处理的需求,我们需要把产品展示给用户,方便用户选择,但是怎么展示给用户呢,我们可以在google play后台配置产品的具体信息,也可以进行修改。但是由于我们可能要修改产品的价钱,所以不可能把产品的信息控制在代码里面,这样维护性不好,我们的处理方式是,将产品的ID集合存放在服务器端,服务器端开一个接口,客户端负责调用此接口,就可以获取到相关的id数据了,然后通过id数据,调用google play的接口,获取到完整的产品信息,如描述,数量,价钱等等。(这样做的好处,服务器端统一控制,可以随时控制产品的变化,客户端如android,ios就只需要根据返回来的产品id,去调用自己相关支付技术的接口,就可以达到效果了。)

为了方便说明,我贴一下,查询的某一个产品id,得到的打印信息。
**
SkuDetails:{“productId”:”cash_35”,”type”:”inapp”,”price”:”US$ 0.99”,”price_amount_micros”:99,”price_currency_code”:”USD”,”title”:”Some infos”,”description”:”35 count”}
**

我们关注的是产品的ID,还有price。

mAdditionalSkuList.add(CASH_1);
mAdditionalSkuList.add(CASH_2);
mAdditionalSkuList.add(CASH_5);
mAdditionalSkuList.add(CASH_10);
mAdditionalSkuList.add(CASH_20);
mAdditionalSkuList.add(CASH_35);
mAdditionalSkuList.add(CASH_50);
mAdditionalSkuList.add(CASH_100);
mHelper.queryInventoryAsync(true, mAdditionalSkuList,
         mQueryFinishedListener);

当调用我们这个initQueryItemInfos()方法的时候,就回把产品id添加到list里面,调用mHelper.queryInventoryAsync查询产品信息的方法,方法通过mQueryFinishedListener回调,我们看一下,这个监听器里面的相关内容。

IabHelper.QueryInventoryFinishedListener
            mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            if (result.isFailure()) {
                --- handle error
                Log.d(TAG, "result error");
                return;
            }
            List<Bean> beanList = new ArrayList<>();
            for (int i = 0; i < mAdditionalSkuList.size(); i++) {
                SkuDetails skuDetails = inventory.getSkuDetails(mAdditionalSkuList.get(i));
                if (skuDetails != null) {
                    Log.d(TAG, skuDetails.toString());
                    shouCashList.add(new Gson().fromJson(skuDetails.getJson(), Bean.class));
                }
            }
            --- update the UI
            mGridAdapter.setGridData(beanList);
            mGridView.setAdapter(mGridAdapter);
         mGridView.setOnItemClickListener(MyFragment.this);
        }
    };

监听器的作用是,把返回回来的skuDetails对象,解析为我们自己的实体对象,作为listView或者是我这里面的GridView的数据,之后就是设置数据到我们的BaseAdapter里面。再让GridView与Adapater关联,做一些处理工作。

BaseAdapter的实现类,就是重写了几个方法,这种应该都是老话题了。就是些getView方法里面,存放实体Bean的值,到我们的ImageView,TextView里面。这个地方的代码不贴出来了。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_dialog_list, container, false);
        mGridView = (GridView) view.findViewById(R.id.shoucash_grid_view);
        mGridAdapter = new GridAdapter(getActivity());
        return view;
    }

OnCreateView里面的代码,就是构造了我们的Adapter,数据的设置是放在前面的查询借口的回调监听器里面了。

这样当我们的程序加载完了fragment的时候,我们就能够看到页面上的产品列表了,包括产品的价钱,名称等信息。

接着就是我们的购买功能了,我们放在下一篇讲吧,已经很晚了,该休息了。

版权声明:本文为博主原创文章,未经博主允许不得转载。