现在越来越多的人都开始接触了海外的支付方式,而google的官方支付作为一大支付方式,并且对接过程中遇到的坑较多,而我们又有可能用到,所以今天在这里写一下之前对接google的一些自我理解。希望可以帮助到大家:
先贴一份我对接Google支付的流程图:(根据实际操作来进行流程修改)
google支付demo效果图:
其实google的内支付很简单,只是对于手机的要求比较特殊,需要手机有google框架和服务,这个在网上一搜一大把的。这里就不说了啊。我接下来就开始直接进行项目的配置:
重点内容
- 添加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了。。。