Google in app billing 是google play 商店的应用内支付,他是一种应用内的虚拟的道具支付服务,支持应用内支付(inapp)和订阅(subs)两种模式;
在中国,如果你的应用要集成这个服务,需要注意有三点:
- in app billing不支持中国服务,不能绑定国内的信用卡(借记卡)
- in app的受管理商品中的本地价格不支持人民币
- 支付金额中会收取30%的手续费
当然的这些都是可以解决的,因为google play的应用内支付是国外的用户的一个主流消费模式.还是很多应用需要踩着坑去集成,比如说:
卖虚拟道具
的国际版应用
卖关卡版本
的付费应用等等.
本文主要是对version 3版本的in-app支付集成和介绍.
注: 前提已经在Google play 开发者平台完成注册开发者账号和绑定应用
地址: http://play.google.com/apps/publish/
请参考官网详细示例(不需要)
下面是对上面的链接地址步骤简单的介绍:
打开SDK Manager ,在Extras的文件夹下面下载Google play billing library
然后可以在本地的SDK的play_billing目录下发现如下文件列表:
samples 是官方的一个demo,修改包名可以直接集成到自己项目
IInAppBillingService.aidl是我们需要集成在项目中的AIDL文件
集成步骤很简单,本人是直接修改了官网的samples,然后打成了jar包[点击Jar包下载],当然大家也可以自己封装使用
最终我集成的项目中也只要包含这两个文件即可,当然Manifest中的相关权限是不能忘记的
注: 最详细官网的支付流程(不需要)
下面是基本序列图:
注: 这个序列图主要是针对
非消耗性的管理商品
,购买一次即为被拥有状态,无法再次购买.
从上图可以看出,App自己的后台不参与Google in app的支付处理,直接由客户端和Google Play完成;而其中的两次与客户端对接的作用是:
一: 我们把Google Play中的key没有直接明文写在App客户端,而是通过自己的后台拉去,是为了安全考虑
二: 购买完成后的订单信息上传给自己的服务器,既可以保存订单记录,又可以对用户购买商品的信息进行管理
获取key值,根据key值初始化工具类
private void initBilling() {
//需要传入的key值
String base64EncodedPublicKey = "你的google play key ";
mHelper = new IabHelper(this, base64EncodedPublicKey.trim());
//开启调试
mHelper.enableDebugLogging(true);
startUp();
}
key值在Google控制台的如下位置;
检测连接服务,与Google Play进行连接
private void startUp() {
if (null == mHelper) return;
//检测连接服务
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult iabResult) {
if (null == iabResult) return;
if (!iabResult.isSuccess()) {
isInitSuccess = false;
L.e(TAG, "onIabSetupFinished:初始化失败,请重试 " + iabResult);
return;
}
isInitSuccess = true;
}
});
}
注: 查询list中指定的商品,如果不指定则查询默认的所以商品信息,这里指定
SKU_POPCOIN,和SKU_POPCOIN1两个商品.
List additionalSkuList = new ArrayList<>();
additionalSkuList.add(SKU_POPCOIN);
additionalSkuList.add(SKU_POPCOIN1);
mHelper.flagEndAsync();
mHelper.queryInventoryAsync(true, additionalSkuList,
mGotInventoryListener);
购买指定ID购买商品,这里购买ID为SKU_POPCOIN商品
if(mHelper == null) return;
mHelper.flagEndAsync();
mHelper.launchPurchaseFlow(this, SKU_POPCOIN, BILL_REQUEST_CODE, mPurchaseFinishedListener, WDApp.getInstance().getLoginUserId());
处理返回的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == BILL_REQUEST_CODE) {
if (mHelper == null) return;
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
//在这里可以把订单信息传给自己的服务器
L.e(TAG, "onActivityResult: " + resultCode);
super.onActivityResult(requestCode, resultCode, data);
} else {
L.e(TAG, "onActivityResult handled by IABUtil.");
}
}
注: Google billing支付默认的所有
受管理商品
都是非消耗性的商品
,购买一次就默认为被拥有
状态,无法继续购买,如果我们想让应用的道具成为消耗性商品
,就需要主动把非消耗性的商品消耗掉
,变成了未拥有
状态即可再次购买.
mHelper.consumeAsync(inventory.getPurchase(SKU_POPCOIN), mConsumeFinishedListener);
主要有两次调用的地方:
1:购买成功后调用消耗’被拥有’状态
2:查询商品时,判断有没有’被拥有’状态的商品,如果有就消耗状态.
mConsumeFinishedListener是一个回调的接口,返回消耗商品是否成功
// Called when consumption is complete
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result);
// if we were disposed of in the meantime, quit.
if (mHelper == null) return;
if (result.isSuccess()) {
//消费成功
Log.d(TAG, "Consumption successful. Provisioning.");
} else {
showToast("Error while consuming: " + result);
}
Log.d(TAG, "End consumption flow.");
}
};
注: 务必参考的官方测试文档
- 支持Google Play 商店的 Android 手机
- Google Play支持的非国内信用卡(借记卡)
1.上传一个
已经集成Google billing支付的App
到google play的控制台的beta或者Alpha渠道上.
2.建立一个受管理的商品列表
,包含你要出售的商品,包括ID,价格,描述等.创建商品列表
3.App开发者平台账号
需要绑定信用卡(用于收款
).
4.添加测试账号,测试账号不能是App平台账号
.
5.发布的测试版本通过之后,会有一个测试的下载链接,把这个链接发给需要测试的账号人员,点击成为测试员即可.
6.测试账号需要绑定非国内的信用卡(用于支付
),测试账号需要绑定支持play 商店的手机.
注:
1. 测试过程不会消耗费用.
2. 上传的版本需要在原来的版本上增加,测试版只要上传一次即可.只要连接走通,如果有bug也不需要继续上传,直接用修改后的版本测试即可
3. 必须有签名,而且不同的版本签名要保持一致.
4. 包名必须与控制台的包名一致.