支付内容详解
接上一篇的内容,本篇讲解具体支付里面的东西。
本人由于公司项目需要,我是在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的时候,我们就能够看到页面上的产品列表了,包括产品的价钱,名称等信息。
接着就是我们的购买功能了,我们放在下一篇讲吧,已经很晚了,该休息了。
版权声明:本文为博主原创文章,未经博主允许不得转载。