国内用不上googleplay 基本上是在国外才能正常使用,例子就是google官方的,加了中文注解
最近公司的游戏在海外推广,需要上google play 要接入billing支付,在国内基本上是用不上的,四处搜寻资料发现很少,而且写的不够详尽,这次是巧合在群里认识一位朋友正好研究了很久把一些经验分享给我,我只要半天的时间就搞定了,而且没有使用国外手机,只需要一个美国和一个国内招行visa信用卡或者是在淘宝上购买那种礼品卡(未测试)也是可以的,下面就详细说下步骤吧。
1、首先要有个google的开发者账号添加应用上传你的apk(不能使用eclipse默认的keystore进行签名上传),另外主要的就是添加应用内商品,google的商品分为不受管理的商品(消耗品比如游戏币)和受管理的商品(一次性购买即属于本账号)产品id号是一个唯一字符串比如这样定义:com.package.product.1、com.package.product.2 对应一个金额。如图是我添加的:
添加完要记得激活才能使用,一般要过几个小时才可以用。
2、安装模拟器sdk自带的模拟器似乎不行不能绑定google账号,我下载的BlueStacks-SplitInstaller_native 这个模拟器,下载完开始我就拨了美国的,安装完之后进入账户管理,添加google账号,这个地方不知道为什么第一次我进入的时候是没有显示google账号的,过了一会才显示出来。google play是自带的但是不知道怎么调用出来 找不到icon,我就装了一个go桌面,所有的东西一览无余
进入play商店发现上面应用显得的都是英文的,购买价格都是显示美刀,说明我是使用的美国的play商店,ok环境都有了,下面进行安装我们的apk。
3、进入androidsdk目录,进行如下操作安装我们的应用程序
提示成功后运行程序购买商品提示这个画面就应该没有问题了,下面看看billing的代码吧
4、我使用的是version3 api 这个很简洁使用起来非常方便,只是暂时不支持订阅基本上用不到
在处理googlebilling 的activity中添加这个初始化方法:
private void initData() {
activity=this;
base64EncodedPublicKey=getResources().getString(R.string.base64EncodedPublicKey);
// 开始初始化
Log.d(TAG, "创建IAB helper...");
mHelper=new IabHelper(this, base64EncodedPublicKey);
mHelper.enableDebugLogging(true);
Log.d(TAG, "开始初始化数据...");
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {// 检查是否有billig权限并能否进入play商店,如成功获取商品列表
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "初化完成.");
if(!result.isSuccess()) {
// Oh noes, there was a problem.
complain(getResources().getString(R.string.setup_isSuccess) + result);
return;
}
Log.d(TAG, "初始化in-app biling成功. 查询我们已购买的物品..");
list=new ArrayList
list.add(SKU_GAS_1);
list.add(SKU_GAS_2);
mHelper.queryInventoryAsync(mGotInventoryListener, list);
}
});
}
首先要在google的后台把base64的加密代码copy过来放到string文件里, SKU_GAS_1, SKU_GAS_2 就是我定义的商品id变量,这里google要检查是否能够使用billing,如果可以使用那么去检查商品id是否可以使用,查询完成后会调用IabHelper.QueryInventoryFinishedListener 这个回调接口进行通知,在这个接口中可以获取商品的详细信息SkuDetails和Purchase信息,初始化操作完成。
点击购买按钮后调用这个方法发起支付请求:
mHelper.launchPurchaseFlow(activity, SKU_GAS_1, RC_REQUEST, mPurchaseFinishedListener, payload);
其中payload是唯一字符串即可 SKU_GAS_1是商品id,mPurchaseFinishedListener是购买处理的接口,购买完成或取消都会到这个接口来,这个接口处理一些检查操作代码如下:
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener=new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d(TAG, "购买操作完成: " + result + ", 购买的产品: " + purchase);
int response=result.getResponse();
if(result.isFailure()) {
complain(getResources().getString(R.string.purchase_failure));
setWaitScreen(false);
return;
}
if(!verifyDeveloperPayload(purchase)) {
complain(getResources().getString(R.string.purchase_failure_verify));
setWaitScreen(false);
return;
}
Log.d(TAG, "购买成功.");
if(purchase.getSku().equals(SKU_GAS_1)) {
Log.d(TAG, "购买的产品是金币, 执行消耗操作。");
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
}
}
};
如果检查成功就发起消耗操作mHelper.consumeAsync(purchase, mConsumeFinishedListener);
这个接口就会获取本次消耗的商品详情,并且可以处理自己的业务逻辑了
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener=new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
Log.d(TAG, "消耗操作完成. 产品为: " + purchase + ", 结果: " + result);
// 如果有多个消耗产品,应该在这里一一检查。这里只有一个消耗产品,所以不检查
if(result.isSuccess()) {
// 消耗成功后,填 写我们的逻辑。。
//
total+=1000;
total_gas.setText("金币数量:" + total);
setWaitScreen(false);
Log.d(TAG, "消耗成功!");
} else {
complain(getResources().getString(R.string.consume_failure) + result);
}
}
};
问题1:提示用户不符合购买条件?
解决:需要在后台添加上测试用户方可
问题2:提示找不到商品?
解决:线上的包跟测试的包可能前面不一样
google 支付完成后的log日志
http://developer.android.com/google/play/billing/billing_integrate.html